在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;
}
原文链接: https://www.cnblogs.com/null00/archive/2011/03/14/2065087.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/22274
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!