关于C++的复制构造函数,下面这种情况会不会调用复制构造函数?
已定义classsample,另有一返回类型为sample的的函数samplefunc();sampleA;A=func();此处会不会调用几次复制构造函数?因为func...
已定义class sample,另有一返回类型为sample的的函数sample func();
sample A;
A=func();此处会不会调用几次复制构造函数?因为func是一个返回sample类的函数,在函数返回时会调用一次,我就是不太清楚给A赋值时会不会再调用一次赋值构造函数。
给A赋值时到底是按位复制 还是 调用复制构造函数? 展开
sample A;
A=func();此处会不会调用几次复制构造函数?因为func是一个返回sample类的函数,在函数返回时会调用一次,我就是不太清楚给A赋值时会不会再调用一次赋值构造函数。
给A赋值时到底是按位复制 还是 调用复制构造函数? 展开
5个回答
展开全部
//函数返回sample时也不一定会调用复制构造函数,至于sample A;A=func(); 这里的A=func()调用的是operator= , 这样的sample A=func();才是调用复制构造,而实际还要看具体情况
#include <iostream>
using namespace std;
class sample
{
int n;
public:
sample(int nn=0){n=nn;}
sample(const sample& aa){ n=aa.n; cout<<"复制!!!\n"; }
sample& operator=(const sample& aa) { n=aa.n; cout<<"======\n"; return *this; }
};
sample func() //返回sample
{
return sample(7); //这样的会被优化掉,不调用复制构造函数,详细情顷耐况可以搜索“按返回值优化”这个词
}
sample func1() //返回sample
{
sample s1(7);
return s1;
}
int main()
{
sample s1=func(); //这个func()返回时不调用复制构造函数,并且构造s1时会优化,不调用复制构造
sample s2=func1(); //这个func1()调用复制构造函没竖数 ,并且构造s2时会优化,不调用复制构造
sample s3=s1; //这个s3会调用复制构函数
cout<<"****************************\n";
s3=func(); //这个func()返回时不调用复制构造函数
s3=func1(); //这个func1()返回时调用复制构枯乎大造函数
return 0;
}
#include <iostream>
using namespace std;
class sample
{
int n;
public:
sample(int nn=0){n=nn;}
sample(const sample& aa){ n=aa.n; cout<<"复制!!!\n"; }
sample& operator=(const sample& aa) { n=aa.n; cout<<"======\n"; return *this; }
};
sample func() //返回sample
{
return sample(7); //这样的会被优化掉,不调用复制构造函数,详细情顷耐况可以搜索“按返回值优化”这个词
}
sample func1() //返回sample
{
sample s1(7);
return s1;
}
int main()
{
sample s1=func(); //这个func()返回时不调用复制构造函数,并且构造s1时会优化,不调用复制构造
sample s2=func1(); //这个func1()调用复制构造函没竖数 ,并且构造s2时会优化,不调用复制构造
sample s3=s1; //这个s3会调用复制构函数
cout<<"****************************\n";
s3=func(); //这个func()返回时不调用复制构造函数
s3=func1(); //这个func1()返回时调用复制构枯乎大造函数
return 0;
}
追问
如果没有重载“=”,s3=func1()会调用几次赋值构造函数呢?
追答
还是一样的结果.这里的operator=仅仅是为了说明 sample s3=s1;这样的不调用operator=而是复制构造,sample s3,s3=s1这样的才是调用operator=,用operator=仅仅为了输出那行"=====",以此验证是否调用了operator=
2012-07-28
展开全部
不会,A在"渣伏sample A;"执行时已构和梁宏造,唤册A=func();就是同类型的对象赋值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
会构用复制构造函数,还有一种情况就是使用类做为参数进行传递的时候也会调用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个是调用的重载赋值操作符的函数 也即 operator = (sample &)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-07-28
展开全部
不清楚。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询