一.首先通过下面的测试程序,粗略的感知一下这三个函数分别在什么情况下被调用
#include <iostream>

using namespace std;

class T
{

public:
T() { cout<<"dafault constructor"<<endl;}
T(const T & t) {cout<<"copy constructor"<<endl;}
void operator =(const T &t) { cout<<"assignment operator"<<endl;}
};

int main ( int argc,char * argv[])
{
T a;
T b=a;
b=a;

return 1;
}

程序运行结果为
dafault constructor //T a;
copy constructor // T b=a;
assignment operator // b=a;
从该测试程序我们可以知道,拷贝构造函数与赋值运算符虽然所完成的工作在概念上很相似——都是根据一个已有对象来对确定另一个对象的内容,然而二者有本质 的不同,前者用于初始化,而后者用于赋值操作。换言之,对于拷贝构造函数,当其被调用时,源对象已存在,而目标对象还未被创建;而对于赋值运算符,当其被 调用时,源对象和目标对象都已存在。






















程序运行结果为



从该测试程序我们可以知道,拷贝构造函数与赋值运算符虽然所完成的工作在概念上很相似——都是根据一个已有对象来对确定另一个对象的内容,然而二者有本质 的不同,前者用于初始化,而后者用于赋值操作。换言之,对于拷贝构造函数,当其被调用时,源对象已存在,而目标对象还未被创建;而对于赋值运算符,当其被 调用时,源对象和目标对象都已存在。