问题:现有类A定义如下:
class A
{
public:
A(int
a)
//构造函数
{
m_a = a;
cout<<"constructor"<<endl;
}
A(const A
&d)
//复制构造函数
{
m_a = d.m_a;
cout<<"copy constructor"<<endl;
}
A& operator=(const A
&oA)
//重载赋值操作符
{
m_a = oA.m_a;
cout<<"operator="<<endl;
return *this;
}
private:
int m_a;
};
讨论以下3种情况的输出:
1. /***************************************** test1 *****************************************/
int main(int argc, char
*argv[])
{
A
obj = 2;
system("pause");
return 0;
}
2. /***************************************** test2 *****************************************/
int main(int argc, char
*argv[])
{
A
obj1(1);
A
obj2 = obj1;
system("pause");
return 0;
}
3. /***************************************** test3 *****************************************/
int main(int argc, char
*argv[])
{
A
obj(1);
obj
= 2;
system("pause");
return 0;
}
对于test1输出结果为:constructor。
解释:语句 A obj = 2; 是对象obj的声明和初始化,也就是构造对象obj。“=”在这里表示的是初始化,不是赋值。由于 2 和 obj 类型不同,将发生隐式类类型转换,调用 A(int a) 构造函数。
对于test2输出结果为:copy constructor。
解释:语句 A obj2 = obj1; 同样也是对象的声明和初始化,也就是构造对象obj2。“=”在这里表示的是初始化,不是赋值。由于obj1和obj2类型一致,直接调用复制构造函数构造对象obj2。
对于test3输出结果为:constructor [换行] operator=。
解释:语句 obj = 2; 由于对象obj已经声明并初始化了,因此这里的“=”表示的是赋值。又因为 2 和 obj 类型不同,首先2隐式转换为A类型的临时对象,再调用赋值操作符函数对obj进行赋值。
备注:
1. “=”表示的是初始化还是赋值关键在于等号左边对象是否已经存在(已经被构造)。如果不存在,则是初始化,应该调用构造函数或复制构造函数(具体视情况而定);如果存在,则是赋值,应该调用赋值操作符函数。
2. 隐式类类型转换:用单个实参来调用的构造函数定义了从形参类型到类类型的一个隐式转换(C++ Primer)。如果是多个实参,则无法完成隐式转换。可以用关键字"explicit"声明函数防止这种隐式转换。