返回信息流#include <iostream>
using std::cout;
using std::endl;
struct Pair
{
int a;
int b;
Pair(int a, int b)
{
cout << "constructor with two parameters" << endl;
this->a = a;
this->b = b;
}
Pair(Pair& p)
{
cout << "copy constructor" << endl;
a = p.a;
b = p.b;
}
};
int main()
{
Pair p = Pair(1, 2); // 为啥没有调用拷贝构造函数?
cout << p.a << " " << p.b << endl;
system("pause");
return 0;
}
这一句: Pair p = Pair(1, 2); // 为啥没有调用拷贝构造函数?
结果:
这是一条镜像帖。来源:北邮人论坛 / cpp / #82729同步于 2014/9/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于拷贝构造函数
xiaobing307
2014/9/22镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
按道理来讲,那句代码应该先生成一个临时对象,然后调用拷贝构造函数初始化p,但是如果创建临时对象的目的仅是为了构造另一个相同类型的对象的话,C++标准是允许不产生临时对象直接在p上构造的,即使拷贝构造函数有副作用。
所以那行代码应该变成了Pair p(1, 2);
在g++编译器中,可以在编译的时候加入-fno-elide-constructors选项来禁用这一优化,这样就可以看到先调用构造函数再调用拷贝构造函数的过程了。
【 在 xiaobing307 的大作中提到: 】
: #include <iostream>
: using std::cout;
: using std::endl;
: ...................
顶楼上
【 在 xiaobing307 (小兵) 的大作中提到: 】
: #include <iostream>
: using std::cout;
: using std::endl;
: ...................
在linux竟然编译不过,提示Pair p = Pair(1, 2)找不到相应的函数
【 在 gaoweiwei 的大作中提到: 】
: 按道理来讲,那句代码应该先生成一个临时对象,然后调用拷贝构造函数初始化p,但是如果创建临时对象的目的仅是为了构造另一个相同类型的对象的话,C++标准是允许不产生临时对象直接在p上构造的,即使拷贝构造函数有副作用。
: 所以那行代码应该变成了Pair p(1, 2);
: 在g++编译器中,可以在编译的时候加入-fno-elide-constructors选项来禁用这一优化,这样就可以看到先调用构造函数再调用拷贝构造函数的过程了。
: ...................
拷贝构造函数的参数前面加一个const Pair(const Pair& p)
否则临时对象是不能绑定到非const引用上
【 在 xiaobing307 的大作中提到: 】: 在linux竟然编译不过,提示Pair p = Pair(1, 2)找不到相应的函数