设为首页 加入收藏

TOP

C++中的赋值操作符重载和拷贝构造函数(二)
2019-05-23 18:07:59 】 浏览:124
Tags:操作 重载 拷贝 构造 函数
14 IntArray& array = a->self(); 15 IntArray& brray = b->self(); 16 17 cout << "array.length() = " << array.length() << endl; 18 cout << "brray.length() = " << brray.length() << endl; 19 20 array = brray; 21 22 cout << "array.length() = " << array.length() << endl; 23 cout << "brray.length() = " << brray.length() << endl; 24 } 25 26 delete a; 27 delete b; 28 29 return 0; 30 }

 5,输出结果:

1 array.length() = 5

2 brray.length() = 10

3 array.length() = 10

4 brray.length() = 10 

    6,使用二阶构造后,拷贝构造函数是私有的,拷贝构造函数就没有作用了,不允许拷贝构造,但是应该重载赋值操作符重载;

   

7,编译器默认提供函数:

 

    1,虽然类中什么都没写,但是编译器会放四个函数实现进去;

   

8,下面的代码输出什么?为什么?

    1,代码示例:

1 string s = "12345";
2 const char* p = s.c_str();  // 返回字符指针,代表 C 语言中的字符串;
3 
4 cout << p << endl;
5 
6 s.append("abced");
7 
8 cout << p << endl;

   

9,字符串问题 1 编程实验:

    1,main.cpp 文件:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string s = "12345";
 9     const char* p = s.c_str();  // 只有这一行用了 C 方式;
10         
11     cout << p << endl;     
12         
13     s.append("abced");  // p 成为了野指针
14         
15     cout << p << endl;     
16 
17     return 0;
18 }

 2,这段代码混合了 C 和 C++ 的方式,出了意想不到的错误;

   

10,关于 string 的疑问 1:

    1,string 对象内部维护了一个指向数据的 char* 指针,这个指针可能在程序     运行的过程中发生改变,我们尽量不要操作这个指针;

    2,执行 s.append() 函数后,char* 指针指向了新的堆空间 0xFF445566,而将旧的堆空间 0xFF112233 释放,此时 p 指针成了野指针;

    3,学习 C++,并且用的是标准库中的内容,所以现在采用的编程思想就应该是 C++ 编程思想,不要混合使用 C 和 C++ 思想;

   

11,下面的程序输出什么?为什么?

    1,代码示例:

 1 const char* p = "12345";  // p 可以用字符串对象代替;
 2 string s = "";  // 混合了,该注意了;
 3         
 4 s.reserve(10);
 5     
 6 // 不要使用 C 语言中的方式操作 C++ 中的字符串
 7 for(int i=0; i<5; i++)
 8 {
 9        s[i] = p[i];
10 }
11 
12 if( !s.empty() )
13 {
14     cout << s << endl;
15 }

    2,没有输出;

   

12,字符串问题 2 编程实验:

    1,main.cpp 文件:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     const char* p = "12345";
 9     string s = "";
10         
11     s.reserve(10);
12     
13     // 不要使用 C 语言中的方式操作 C++ 中的字符串
14     for(int i=0; i<5; i++)
15     {
16         s[i] = p[i];
17     }
18 
19             if( !s.empty() )  // 打印不出;
20         {
21           cout << s << endl;
22         }
23 
24     cout << s << endl;  // 打印不出;
25 
26     for(int i=0; i<5; i++)  // 可以打印;
27     {
28         cout << s[i] << endl;
29     }
30     
31     return 0;
32 }

 2,更改程序为:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     const string p = "12345";
 9     string s = "";
10 
11     s = p;
12 
13     cout << s << endl;
14     
15     return 0;
16 }

 3,C++ 工程中,尽量避免指针使用,字符串类出现就是为了替代字符指针;

 

13,关于 string 的疑问 2:

 

14,小结:

    1,在需要进行深拷贝的时候必须重载赋值操作符;

       1,也要重新定义拷贝构造函数;

    2,赋值操作符和拷贝构造函数有同等重要的意义;

    3,string 类通过一个数据空间保存字符串数据;

&

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[NOI2002] 贪吃的九头蛇 下一篇C++ 随机数

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目