在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在C++中,当类中含有指针类型的数据时,我们往往要用到三种构造函数,即普通构造函数、拷贝构造函数、赋值构造函数,而且在析构函数中,要正确析构相应的内存。 下面以代码为实例进行演示,同时推荐大家看看林锐博士的《高质量C++/C 编程指南》,其中对编程规范和一些常见的问题进行了深度剖析,《高质量C++/C 编程指南》电子版下载地址为http://download.csdn.net/source/3091633。 #include <iostream> #include <cstring> #include <cstdio> using namespace std; class B { public: char* str; explicit B(char *s = NULL) { cout << "调用了B普通构造函数" << endl; if (s != NULL) { str = new char[strlen(s) + 1]; strcpy(str, s); } else { str = NULL; } } //拷贝构造函数 B(const B& temp) { cout << "调用B拷贝构造函数" << endl; str = new char[strlen(temp.str) + 1]; strcpy(str, temp.str); } //赋值构造函数 B & operator = (const B& x) { cout << "调用B赋值运算符重载" << endl; if(this == &x) return *this; delete [] str; str = new char [strlen(x.str) + 1]; strcpy(str, x.str); return *this; } ~B() { printf("~B\n"); delete [] str; str = NULL; } }; class A { public: B b; A(){} A(B bb) { cout << "A()构造函数" << endl; b = bb; } ~A() { printf("~A\n"); } }; int main() { char* str = new char[5]; for(int i = 0; i < 4; i++) str[i] = 'a' + i; str[4] = '\0'; //这是第一个B B* b = new B(str); printf("%s\n", b->str); //括弧里的*objectB先调用B的拷贝构造函数 // 然后在A内调用了B的=运算符重载。 A* a = new A(*b); printf("%s\n", b->str); //delete A,然后A里的B也被析构了。 delete a; //delete 这是第一个B。 delete b; //default constructor B *b2 = new B(); delete b2; return 0; }
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论