C++之拷贝构造函数
#include <iostream></p>#include <string>
using namespace std;
class name
{
public :
name();//默认构造函数
name(char *pn); //构造函数
name(const name &obj);//拷贝构造函数
~ name() ;//析构函数
protected :
char *pname ;
int size ;
public:
name& operator=(name &obj);//"="运算符重载
} ;
name::name()
{
cout<<"Constructing"<<endl;
pname=NULL;
size=0;
}
name::name(char *pn)
{
cout <<"Constructing "<< pn << endl;
pname = new char[strlen(pn)+1];
if (pname)
strcpy(pname,pn);
size = strlen(pn);
}
name::name(const name &obj)
{
cout <<"copy Constructing "<<obj.pname<<endl;
pname = new char[strlen(obj.pname)+1];
if (pname)
strcpy(pname,obj.pname);
size = strlen(obj.pname);
}
name& name::operator=(name &obj)
{
cout <<"Assigning "<<obj.pname<<endl;
if (this==&obj)//this指针用于表示当前对象的地址
{
return obj;
}
if(pname)
{
delete []pname;
size=0;
}
pname = new char[strlen(obj.pname)+1];
if (pname)
{
strcpy(pname,obj.pname);
size=strlen(obj.pname);
}
return *this;
}
name :: ~ name()
{
cout << "Destructing "<< pname << endl;
delete []pname;
size = 0;
}
void playmain()
{
name obj1("zhangsan");
//如果你不写copy构造函数,那么C++编译器会给我们提供一个默认的copy构造函数(浅copy)
name obj2 = obj1;
name obj3("lisi");
name obj4;
//如果你不写=操作函数,那么C++编译器会给我们提供一个=操作函数(浅copy)
obj4=obj3;
}
void main()
{
playmain();
system("pause");
}
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);
------------------------------分割线------------------------------
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
将C语言梳理一下,分布在以下10个章节中:
Linux-C成长之路(十):其他高级议题