[C++]复制构造函数、赋值操作符与隐式类类型转换
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了[C++]复制构造函数、赋值操作符与隐式类类型转换,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1597字,纯文字阅读大概需要3分钟。
内容图文
![[C++]复制构造函数、赋值操作符与隐式类类型转换](/upload/InfoBanner/zyjiaocheng/1167/4b4b8ac591f64ecba0a71a83e9507f0e.jpg)
问题:现有类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"声明函数防止这种隐式转换。
原文:http://www.cnblogs.com/ymy124/p/3638132.html
内容总结
以上是互联网集市为您收集整理的[C++]复制构造函数、赋值操作符与隐式类类型转换全部内容,希望文章能够帮你解决[C++]复制构造函数、赋值操作符与隐式类类型转换所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。