首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >赋值操作符

赋值操作符
EN

Stack Overflow用户
提问于 2013-11-18 03:43:21
回答 4查看 201关注 0票数 0

关于赋值运算符是如何工作的,有一些我不明白的地方,请看这段代码:

代码语言:javascript
复制
#include <iostream>
using namespace std;

class foo
{
    int val{};
public:
    foo()
    {
    }
    foo( int n )
    {
        val = n;
        cout<<"Constructor"<<endl;
    }
    foo( const foo& f )
    {
        cout<<"Copy constructor, val "<<endl;
        val = f.val;
    }

    foo( const foo&& f )
    {
        cout<<"Copy constructor -rvalue-"<<endl;
        val = f.val;
    }
    foo operator+( const foo& other ) const
    {
        cout<<"Sum "<<endl;
        foo foo2;
        foo2.val = val + other.val;
        return foo2;
    }
    foo& operator=( const foo& f )
    {
        cout<<"Assignment operator\n";
        val = f.val;
        return *this;
    }
    foo& operator=( const foo&& f)
    {
        cout<<"Assignment operator, r-value\n";
        val = f.val;
        return *this;
    }
    ~foo() {}
};

int main()
{
    foo a{1}, b{5}, c{4};
    foo d;
        d = a + b + c;
    foo d2 = a + b + c;
    return 0;
}

此应用程序的输出为:

代码语言:javascript
复制
Constructor
Constructor
Constructor
Sum
Sum
Assignment operator, r-value
Sum
Sum

我不清楚的是为什么第二个赋值没有触发赋值运算符。第一个赋值是在一个通过默认构造构造的对象上,然后一个普通的赋值操作是可见的,在第二个赋值操作中,临时对象应该由编译器构建,然后赋值给d2,但是从任何提供的赋值操作符都看不到打印。为什么?

谢谢

EN

回答 4

Stack Overflow用户

发布于 2013-11-18 03:45:36

没有第二个赋值,你的代码只有一个赋值。这条线

代码语言:javascript
复制
foo d2 = a + b + c;

是复制初始化。

票数 3
EN

Stack Overflow用户

发布于 2013-11-18 03:45:21

为了提高效率,请执行以下操作:

代码语言:javascript
复制
foo d2 = a + b + c;

(以及T是具有非显式复制构造函数的类型的任何T n = expr )实际上与

代码语言:javascript
复制
foo d2(foo(a + b + c)); // can be optimized to foo d2(a + b + c)

不是

代码语言:javascript
复制
foo d2;
d2 = a + b + c;

这就是为什么你在输出中只看到一个赋值的原因。

你可以这样想:当变量已经存在时,它就是赋值。当你创建一个新的变量时,它是一个构造函数调用。

票数 1
EN

Stack Overflow用户

发布于 2013-11-18 03:45:28

您初始化的是d2,而不是赋值给它,所以赋值操作符不会被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20035242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档