复制构造函数、赋值操作符与隐式类类型转换
来源:互联网 发布:如何更改淘宝的会员名 编辑:程序博客网 时间:2024/05/29 15:07
复制构造函数、赋值操作符与隐式类类型转换
问题:现有类A定义如下:
class A
{
public:
A(inta) //构造函数
{
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[])
{
Aobj = 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[])
{
Aobj(1);
obj = 2;// 首先调用构造函数实现隐式转化(int-A)。
//再调用重载赋值操作符。
system("pause");
return 0;
}
对于test1输出结果为:
constructor
解释:语句 A obj = 2; 是对象obj的声明和初始化,也就是构造对象obj。“=”在这里表示的是初始化,不是赋值。由于 2 和 obj 类型不同,将发生隐式类类型转换,调用 A(int a) 构造函数。
对于test2输出结果为:
constructor
copy constructor
解释:语句 A obj2 = obj1; 同样也是对象的声明和初始化,也就是构造对象obj2。“=”在这里表示的是初始化,不是赋值。由于obj1和obj2类型一致,直接调用复制构造函数构造对象obj2。
对于test3输出结果为:
constructor
constructor
operator=
解释:语句 obj = 2; 由于对象obj已经声明并初始化了,因此这里的“=”表示的是赋值。又因为 2 和obj 类型不同,首先2隐式转换为A类型的临时对象,再调用赋值操作符函数对obj进行赋值。
备注:
1. “=”表示的是初始化还是赋值关键在于等号左边对象是否已经存在(已经被构造)。如果不存在,则是初始化,应该调用构造函数或复制构造函数(具体视情况而定);如果存在,则是赋值,应该调用赋值操作符函数。
2. 隐式类类型转换:用单个实参来调用的构造函数定义了从形参类型到类类型的一个隐式转换(C++ Primer)。如果是多个实参,则无法完成隐式转换。可以用关键字"explicit"声明函数防止这种隐式转换。
- 复制构造函数、赋值操作符与隐式类类型转换
- C++ 类型自动转换 构造函数 复制构造函数 赋值操作运算符函数
- 赋值操作符与复制构造函数
- 构造函数,复制构造函数与拷贝赋值操作符
- 复制构造函数、重载赋值运算符、类型转换小结
- 复制构造函数 与 赋值操作函数
- 复制构造函数与赋值操作符重载
- 复制构造函数与赋值操作符的重载
- 复制构造函数与赋值操作符之间的区别
- 复制构造函数与赋值操作符之间的区别
- 复制构造函数与赋值操作符之间的区别
- C++复制构造函数与赋值操作符
- C++复制构造函数与重载赋值操作符
- 复制构造函数和赋值操作符
- 复制构造函数或赋值操作符
- 复制构造函数和赋值操作符
- 复制构造函数 赋值操作符
- 复制构造函数和赋值操作符
- 【项目经验】cocos2d和unity3d的比较
- [effective c++]条款33-name-hiding rules
- CORBA 学习一(概念了解)
- 一个高效的定时器分析及设计
- Java基础19天--03--IO流
- 复制构造函数、赋值操作符与隐式类类型转换
- UML基础: 统一建模语言简介
- 11-09-30 继续无所事事
- AVAudioPlayer 类
- Java基础19天--04--IO流
- JqueryMobile动态生成listView并刷新的方法!
- 统计语言模型
- 生成互不相同随机数的一种算法
- 我常去的编程技术网站