C++之构造函数的拷贝函数析构函数
听完这三个函数之后其实有点懵- - 所以又整理一下
首先看一下一个对象在程序里经历了什么
首先构造函数是在初始化列表的时候用到,具体是怎么写的参考上一个文章《C++对象结构》
下一个是拷贝函数的百度
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);
如果在前两种情况不使用拷贝构造函数的时候,就会导致一个指针指向已经被删除的内存空间。对于第三种情况来说,初始化和赋值的不同含义是拷贝构造函数调用的原因。事实上,拷贝构造函数是由普通构造函数和赋值操作符共同实现的。描述拷贝构造函数和赋值运算符的异同的参考资料有很多。
也就是下面的情况
#include <iostream>
using namespace std;
class Student
{
public:
Student()
{
cout<<"This is 构造函数";
}
private:
string m_strName;
};
int main()
{
Student stu1;
Student stu2=stu1;
Student stu3(stu1);
system("pause");
return 0;
}
在这样一个程序执行的时候我们可以看到构造函数只被调用了一次
这种情况就需要用到拷贝函数
拷贝函数的定义格式是
类名(const 类名&变量名)//变量名可以不写
我们加入拷贝函数后的代码如下
#include <iostream>
using namespace std;
class Student
{
public:
Student()
{
cout<<"This is 构造函数\n";
}
Student(const Student &tea)
{
cout<<"This is 拷贝函数\n";
}
private:
string m_strName;
};
int main()
{
Student stu1;
Student stu2=stu1;
Student stu3(stu1);
system("pause");
return 0;
}
执行效果如下
解决了如stu2赋值情况的构造函数的调用
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
Student()
{
m_strName=" ";
}//无参构造函数
Student(string _name)
{
m_strName=_name;
}//有参数的构造函数
Student(const Student &stu) {};//拷贝函数
~Student() {};//析构函数没有参数
void setName(string _name)
{
m_strName=_name;
}
string getName()
{
return m_strName;
}
private:
string m_strName;
};
int main()
{
Student *stu=new Student;
stu->setName("猪猪");
cout<<stu->getName()<<endl;
delete stu;
stu=NULL;
return 0;
}