我的理解浅构造就是简单的赋值运算,深构造就是涉及到引用,指针之类的。
先说说浅构造(没有指针):
#include<iostream>
#include<string>
using namespace std;
class example
{
public:
example(int Num) : mNum(Num){
};
~example();
void display();
private:
int mNum;
};
example::~example()
{
}
void example::display()
{
cout << " mNum:" << mNum << endl;
}
int main()
{
example exp1(10);//浅构造
example exp2(exp1);
exp1.display();
exp2.display();
system("pause");
}
程序能够正常运行。
但是加了一个指针后:
#include<iostream>
#include<string>
using namespace std;
class example
{
public:
example(int Num, char*Name) : mNum(Num){
mName = new char[strlen(Name) + 1];
strcpy(mName, Name);
};
~example();
private:
int mNum;
char*mName;
};
example::~example()
{
if (mName)
{
delete[] mName;
}
}
int main()
{
example exp1(10, "235");//浅构造
example exp2(exp1);
//cout << "ddd" << endl;
system("pause");
}
程序虽然能够运行,但是在关闭的时候程序就“死了”,所以问题就出现在指针上面,
当执行析构函数的时候exp1执行了一次析构,但是exp2也要执行析构,所以它里面的Name指针就相当于一个野指针,不知道如何去析构,所以系统就奔溃了。
解决方案:就是给拷贝构造也申请一个空间,这样他就能析构的时候就能自己进行析构了
参考:https://blog.csdn.net/wangjian530/article/details/80423393
:
#include<iostream>
#include<string>
using namespace std;
class example
{
public:
example(int Num, char*Name) : mNum(Num){
mName = new char[strlen(Name) + 1];
strcpy(mName, Name);
};
example(const example &s)//引用构造
{
this->mNum = s.mNum;
this->mName = new char[sizeof(s.mName) + 1];
};
~example();
void display();
private:
int mNum;
char*mName;
};
example::~example()
{
if (mName)
{
cout << "析构完成!" << endl;
delete mName;
}
}
void example::display()
{
cout << " mNum:" << mNum << "mName:" << mName<< endl;
}
int main()
{
example exp1(10, "qqq");//浅构造
example exp2(exp1);
exp1.display();
exp2.display();
//cout << "ddd" << endl;
system("pause");
}
后面的乱码不懂为什么,但是程序至少没有奔掉