其实自己对这两个区别是一直不怎么弄懂的,而且也曾经问过别人是怎么一个区别,不过人家说叫我看一下书,可惜的是最后还是没有弄懂。
一直到昨天,考C++的时候,我似乎突然觉得明白了什么,于是就构思了一个测试的程序来看一下自己的猜想是否正确,现在实现以下,觉得已经能够明白了他们之间的却别了。
记得当初我是这么问别人的:有了拷贝构造函数,就可以b =
a;也没有错了,那么还要重载赋值运算符干嘛?两个有什么区别吗?其实当时他们是叫我去看一下拷贝构造函数的概念,结果我居然忘记了(其实很正常,因为记性越来越差了都)。
为了测试到底有什么区别,我写了下面的一个测试程序:
class A{
public:
A(){cout << "Structor!" <<
endl;}
A(A & a){cout << "Copy!" <<
endl;}
};
int main()
{
A a, b = a;
b = a;
return 0;
}
结果发现输出是:
Structor!
Copy!
如果把 A a, b = a;改为: A a, b;
然后输出是:
Structor!
Structor!
这样其实就可以看出到底是怎么样的一个情况:
其实不管有没有拷贝构造函数,b =
a;都没有错,因为系统会自动生成一个默认的拷贝构造函数,而有了拷贝构造函数的话,赋值语句b =
a;还是调用系统默认的拷贝构造函数。
而且我们应该还注意到的一个问题就是:拷贝构造函数的定义是说用一个对象去初始化同类的另一个对象的情况,注意到是初始化而不是其他的,所以这就是区别所在。
如果有了拷贝构造函数和重载赋值运算符的函数,那么在初始化的时候自然而然调用的是拷贝构造函数;在赋值的时候自然而然地是调用重载赋值运算符的函数。
不过或许我们还有疑问:如果只有两者的其中之一呢,比如说只有拷贝构造函数,那么赋值的情况又是什么;那如果是只有重载的赋值运算符函数而没有自定义的拷贝构造函数呢?那这初始化是什么情况?
不管是哪一个问题,我们都要注意到系统地问题,如果问题是后者,那要注意的是系统为我们生成一个默认的拷贝构造函数,而前者的话我自己也不清楚,估计也是差不多吧~