拷贝构造函数发生在对象还没有创建;赋值操作符重载仅发生在对象已经创建的情况下。一个对象的诞生首先必须经历构造过程,这也是构造函数存在的意义,而=运算符本身并不具有代替构造函数的作用,在题目中由于obj1、obj2、obj3都是首次出现的对象,因此必须经历构造函数,因此,即使obj3使用了=运算符,但是仍然必须要执行构造函数,此时的=也会被理解成调用了拷贝构造函数。
通常拷贝构造函数应用的场合有以下几个方面:
1、函数的参数是一个对象,并且是值传递方式。
2、函数的返回值是一个对象,并且是值传递方式。
输出结果
通常拷贝构造函数应用的场合有以下几个方面:
1、函数的参数是一个对象,并且是值传递方式。
2、函数的返回值是一个对象,并且是值传递方式。
3、用一个对象初始化另外一个对象。
在下边这个例子中我们能看到并不是出现“=”就是调用赋值构造函数:
- #include<iostream>
- using namespace std;
- class Test
- {
- public:
- Test()
- {
- ctor_count++;
- cout<<"ctor "<<ctor_count<<endl;
- }
- Test(const Test & r)
- {
- ctor_count++;
- cout<<"copy ctor "<<ctor_count<<endl;
- }
- Test & operator= (const Test& r)
- {
- ctor_count++;
- cout<<"assignment op "<<ctor_count<<endl;
- return *this;
- }
- private:
- static int ctor_count; //only a declaration
- };
- int Test::ctor_count=0; // definition + initialization
- int Test::ctor_count=0; // definition + initialization
- int main()
- {
- Test test;
- Test test1=test;
- Test test2(test);
- Test test3=test2=test1;
- return 0;
- }
输出结果
[root@xxx]$ ./a.out
ctor 1
copy ctor 2
copy ctor 3
assignment op 4
copy ctor 5
我们看到:
Test test; //实例化test对象时调用了默认构造函数
Test test1=test;// test1使用了复制构造函数(因为这是一个新的对象产生)
Test test2(test);//test2时也是用了复制构造函数,
Test test3=test2=test1;//而test2=test1则使用了赋值构造函数(没有新的对象产生),
Test test3=test2=test1;//test3=test2则使用了复制构造函数,原因同上。
所以要看是不是有新的对象产生,才能决定到底是调用了复制构造函数,还是赋值运算符。