读书人

关于C++中拷贝构造函数有关问题-菜鸟

发布时间: 2012-05-09 12:13:59 作者: rapoo

关于C++中拷贝构造函数问题--初学者
#include <iostream>
using namespace std;

class F{
int n;
int d;
public:
F(int n=0, int d=1):n(n),d(d){
cout<<this<<",F("<<n<<","<<d<<")"<<endl;
}

~F(){
cout<<this<<",~F("<<n<<","<<d<<")"<<endl;
}

F(const F& f){
cout<<this<<",F(const F&)"<<endl;
n = f.n;
d = f.d;
}

};

F fa(F& f){return f;}

F& fb(F& f){return f;}



F fk()
{
return F(7,8);//返回匿名对象
}
int main()
{
F f1(1,2);
F f2; //是否会调用构造函数创建f2?
f2 = f1;
cout << "--------------------" << endl;
fa(f1); //为什么当返回时会调用拷贝构造函数?既然f是f1的引用,那么返回f不也不会创建新变量吗?为什么还要调用拷贝呢?
cout << "--------------------" << endl;
fb(f1);
cout << "--------------------" << endl;
F fc = fk();//为什么不会调用拷贝构造呢?什么叫做匿名对象呢?
}

以上问题都用红色字体标识出来了,请各位高手指教。。。

[解决办法]
http://blog.csdn.net/qiaolw/article/details/6263890
楼主看下这个,或许对你有用
[解决办法]
你的问题我没看,但我说下,第一,你没好好看C++书.因为书上一定会说,只要产生一个对象,不管怎么产生,一定都会调用 构造函数.

第二,上面我大概看到有一个在构造一个对象时脾另外一个对象做为参数.为什么会调用构造的问题

你把对象当参数传给构造是不是可以理解把对象当一个值传给函数.那么按值传参是不是会复制这个参数的副本呢.那么是不是又要产生一个对象呢.按第一次不就又调用构造函数了.

至于复制构造函数.它是为了对两个对象相互赋值时的控制.如果你的成员变量中有指针.那么只是像第二那个复制一个副本,那出错是一定的了.而有了复制构造就可以在这个函数体里,动态去创建一个对象.而不是只复制一个指针了.
[解决办法]
1. F f2; //是否会调用构造函数创建f2?
这里会调用构造函数构造f2,否则f2怎么产生呐。后一句f2 = f1;会调用F::operator =(const F&)进行赋值操作,如果自己没有重写F::operator =(const F&),编译器会执行默认的赋值操作。

2. fa(f1); //为什么当返回时会调用拷贝构造函数?既然f是f1的引用,那么返回f不也不会创建新变量吗?为什么还要调用拷贝呢?
这里的拷贝构造是执行函数内的f到返回值之间的拷贝构造。如果把F fa(F& f){return f;}改为F& fa(F& f){return f;},就不需要执行拷贝构造了。

3. F fc = fk();//为什么不会调用拷贝构造呢?什么叫做匿名对象呢?
这一步编译器执行了返回值优化,相当于fk()函数内部并没有生成临时对象,可以参考“http://book.51cto.com/art/201101/242677.htm”。你可以在编译器里把优化关掉,就可以看到拷贝构造函数的调用了。

读书人网 >C++

热点推荐