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 类通过一个数据空间保存字符串数据;
& |