打印

C++初始化问题

[复制链接]
1322|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
txcy|  楼主 | 2012-2-25 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C++, RS, ASSP, ce, ic
如题,有下面一段代码:
#include <iostream>
using namespace std;
class Person{
public:
Person(){
cout << "default constructor is called!" << endl;
}
Person(int n)
{
num = n;
cout << "constructor is called!" << n <<endl;
}
//explicit Person(const Person& pp)
Person(const Person& pp)
{
num = pp.num + 3;
cout << "Copy constructor is called!" << endl;
}
void display()
{
cout << "num = " << num << endl;
}
//Person operator=(Person& pp)
//{
// cout << "Assignment constructor is called!" << endl;
// return p;
//}
private:
int num;
};
int main()
{  
Person p = Person(10);
//Person p(Person(10));
//Person p = pp;
p.display();
return 0;
}
打印结果是:constructor is called!
  num = 10
如果将拷贝构造函数改为explicit,这编译有错。
但如果调这个拷贝构造,为什么它里面的不打印,且num的值也不是13而是10。

相关帖子

沙发
无冕之王| | 2012-2-25 11:07 | 只看该作者
通常构造函数有两个作用:构造器,隐含类型转换操作符
用explicit主要是限制构造函数进行隐含类型转换,而只能明确调用构造函数
Person p = Person(10);此就会进行隐含类型转换
如果一定要加上explicit的话只能Person p(Person(10));
通过编译器对构造函数优化Person p = Person(10);此句语义为用10去初始化p,所以只会调用Person(int n)构造函数

使用特权

评论回复
板凳
tylhc002| | 2012-2-25 14:46 | 只看该作者
1# txcy

使用特权

评论回复
地板
yybj| | 2012-2-25 18:31 | 只看该作者
2楼大侠回答的很有道理,explicit主要是限制构造函数进行隐含类型转换,而只能明确调用构造函数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

2106

帖子

0

粉丝