- 对象在申明时调用等号赋值,实际使用的是拷贝构造
public:
CTmp(int n) :m_Num(n){
cout << "CTmp(int n) " << m_Num << endl;
}
CTmp(CTmp& a){
if(this != &a){
m_Num = a.m_Num;
}
cout << "CTmp(CTmp& a) " << m_Num << endl;
}
const CTmp& operator = ( CTmp& a)
{
if(this != &a){
m_Num = a.m_Num;
}
cout << "CTmp oprator=& " << m_Num << endl;
return *this;
}
void show(){
cout << "m_Num " << m_Num << endl;
}
private:
int m_Num;
};
int main()
{
CTmp cT1(4);
CTmp cT2 = cT1;
cT2.show();
return 0;
}
输出:
CTmp(int n) 4
CTmp(CTmp& a) 4
m_Num 4
可以看到,CTmp cT2 = cT1;走的是拷贝构造,非赋值;
- explicit可强制显式调用构造
class CTmp{
public:
CTmp(int n) :m_Num(n){
cout << "CTmp(int n) " << m_Num << endl;
}
friend void ShowTmp(const CTmp& cx);
private:
int m_Num;
};
void ShowTmp(const CTmp& a){
cout << "m_Num " << a.m_Num << endl;
}
int main()
{
CTmp cT1(4);
ShowTmp(cT1);
ShowTmp(5);
ShowTmp(6);
return 0;
}
输出:
CTmp(int n) 4
m_Num 4
CTmp(int n) 5
m_Num 5
CTmp(int n) 6
m_Num 6
ShowTmp(5);ShowTmp(6);隐式的构造了 CTmp(5),CTmp(6),使得ShowTmp(X);可以编译运行;
class CTmp{
public:
explicit CTmp(int n) :m_Num(n){
cout << "CTmp(int n) " << m_Num << endl;
}
friend void ShowTmp(const CTmp& cx);
private:
int m_Num;
};
void ShowTmp(const CTmp& a){
cout << "m_Num " << a.m_Num << endl;
}
int main()
{
CTmp cT1(4);
ShowTmp(cT1);
ShowTmp(5);
ShowTmp(6);
return 0;
}
加上explicit后,编译期就会报错:
error C2664: 'void ShowTmp(const CTmp &)' : cannot convert argument 1 from 'int' to 'const CTmp &'
注意,explicit在调用时填入单参数的构造函数有意义,无参数构造函数和多参数的构造函数总是要显式调用;
explicit反向对应implicit(隐式);implicit是默认有的;