C++之构造函数的拷贝函数析构函数

听完这三个函数之后其实有点懵- - 所以又整理一下

首先看一下一个对象在程序里经历了什么

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;
}

在这样一个程序执行的时候我们可以看到构造函数只被调用了一次

C++之构造函数的拷贝函数析构函数

这种情况就需要用到拷贝函数

拷贝函数的定义格式是

类名(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;
}

执行效果如下

C++之构造函数的拷贝函数析构函数

解决了如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;
}