gpt4 book ai didi

c++ - 按值 : C++ 返回时未调用复制构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:45:53 25 4
gpt4 key购买 nike

考虑一个类:

class loc{
int x;
int y;
public:
loc();
loc(int x,int y);
loc(const loc& l);//Copy Constructor
loc operator + (const loc& l);
loc operator - (const loc& l);
loc& operator = (const loc& l);//Assignment Operator
const loc& operator ++ ();
friend ostream& operator << (ostream& os,const loc& l);
friend istream& operator >> (istream& is,loc& l);
~loc();
};

当我调用赋值运算符时:

int main()
{
loc Ob;


cout << "########\n\n";
cin >> Ob;
cout << "Ob : " << Ob;

cout << "\n\n########\n\n";

loc Ob1;
Ob1=Ob;
cout << "Ob1 : " << Ob1;

return 0;
}

它不调用复制构造函数,因为它通过引用返回:

输出:

Constructor loc() Called
########

Enter x cordinate : 10
Enter y cordinate : 10
Ob : x : 10 y : 10


########

Constructor loc() Called
Ob1 : x : 10 y : 10

但对于 loc operator + (const loc& l) 它应该在返回 temp 时调用复制构造函数——因为 loc 被返回value ,但在输出中我看不到正在调用复制构造函数:

loc loc::operator + (const loc& l)
{
loc temp;
temp.x = this->x + l.x;
temp.y = this->y + l.y;
return temp;
}

输出:

int main()
{
loc Ob;


cout << "########\n\n";
cin >> Ob;
cout << "Ob : " << Ob;

cout << "\n\n########\n\n";

loc Ob1;
Ob1=Ob;
cout << "Ob1 : " << Ob1;

cout << "\n\n########\n\n";

loc Ob3;
Ob3 = Ob1 + Ob;
cout << "Ob3 = Ob1 + Ob : " << Ob3;

return 0;
}

Constructor loc() Called
########

Enter x cordinate : 10
Enter y cordinate : 10
Ob : x : 10 y : 10


########

Constructor loc() Called
Ob1 : x : 10 y : 10


########

Constructor loc() Called
Constructor loc() Called
Destructor Called
Ob3 = Ob1 + Ob : x : 20 y : 20

有人可以解释为什么会出现这种行为吗?

编辑请注意,这不是复制省略的情况,就好像我通过 loc 返回,即在赋值运算符中而不是 loc& - 我可以看到在返回 loc 时调用了复制构造函数assignment operator 以及 + operator 中。所以这就是 +operator 在返回 loc 时使用 assignment operator 的东西。我想知道如何从函数返回一个值,以及如何创建临时返回值和分配返回值的内在细节。

下面的类显示了在为 loc operator + (const loc& l) 以及 loc operator = (const loc& l) 返回时调用复制构造函数

class loc{
....
loc(const loc& l);//Copy Constructor
loc operator + (const loc& l);
loc operator = (const loc& l);//Assignment Operator
.....
};

最佳答案

允许编译器在特定情况下跳过调用复制构造函数,这就是其中之一,即使它会产生明显的变化(正如您刚刚经历的那样)。这是一种常见的技术,称为命名返回值优化 (NRVO),其中返回的变量是在适当的位置构造的,而不是创建和复制的。

关于c++ - 按值 : C++ 返回时未调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16588733/

25 4 0
文章推荐: jquery - 添加绝对定位的标题到幻灯片- jQuery 插件?
文章推荐: python - 如何在 Python 中使用正则表达式从 HTML 标签中提取 Facebook 页面 URL?
文章推荐: html - 为什么同一个
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com