编程爱好者联盟 2016-09-30
拷贝构造函数就是以拷贝的方式来构造一个新对象的构造函数
class 类名{
类名(const 类名& 对象引用){
拷贝构造函数体
}
} 把一个对象传入一个非引用类型的值参数时
void test(A a){} 把一个对象作为函数的返回值的时候
A getA(); getA(); A b=getA();
//自定义拷贝构造
#include<iostream>
#include<cstring>
using namespace std;
class Student{
char* m_name;
int m_age;
public:
//实现有参的构造函数
Student(const char* name,int age):m_name(NULL),m_age(age){
// m_name=name; //语法可以,但如果指向的被释放了,m_name就成了dangling pointer,高风险
//申请一块动态内存给成员变量m_name;
m_name=new char[strlen(name)+1]; //这才是好方法
strcpy(m_name,name);
}
~Student(){
delete[] m_name; //不是delete,是delete[]
m_name=NULL;
}
//打印所有属性信息
void show(void){
cout<<"I am "<<m_name<<", "<<m_age<<"years old"<<endl;
}
//自定义拷贝函数实现深拷贝
Student(const Student& rs):m_name(NULL),m_age(rs.m_age){
m_name=new char[strlen(rs.m_name)+1];
strcpy(m_name,rs.m_name); //把原来的内容搬过来
}
};
int main(){
Student s("ZHANG Fei",30);
s.show();
Student s2(s); //调用自定义拷贝实现深拷贝
s2.show();
return 0;
}//main()结束了会销毁对象,销毁之前会调用析构函数,有了自定义拷贝,就不用担心double free了