c++ - 在赋值操作期间创建的临时对象

标签 c++

如果每个赋值都创建一个临时对象来将对象复制到左值中,您如何在 VC++ 8.0 中查看?

class E
{
   int i, j;
public:
   E():i(0), j(0){}
   E(int I, int J):i(I), j(J){}
};

int main()
{
   E a;
   E b(1, 2);
   a = b //would there be created two copies of b?
}

编辑:

Case 2:

    class A
    {
       int i, j;
       public:
         A():i(0), j(0){}
    };

    class E
    {
       int i, j;
       A a;
    public:
       E():i(0), j(0){}
       E(int I, int J):i(I), j(J){}
       E(const E &temp)
       {
          a = temp; //temporary copy made?
       }
    };

   int main()
   {
      E a;
      E b(1, 2);
      a = b //would there be created two copies of b?
   }

最佳答案

从你的评论中,你明确表示你不太明白this C++-FAQ item .

首先,您提供的代码中没有临时对象。编译器声明 A::operator=被调用,你最终会得到 1a.i2a.j .

现在,关于您提供的链接,它只与构造函数有关。在以下代码中:

class A
{
public:
    A()
    {
        s = "foo";
    }

private:
    std::string s;
};

数据成员s使用 std::string 构建无参数构造函数,然后 被赋值 "foo"A构造体。最好(事实上,在某些情况下必要)在初始化列表中初始化数据成员,就像您对 i 所做的那样。和 j :

A() : s("foo")
{
}

在这里,s数据成员一步初始化:通过调用适当的构造函数。

关于c++ - 在赋值操作期间创建的临时对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4552980/

相关文章:

c++ - map 在什么尺寸下比 vector 更好?

c++ - 具有指向自身的指针的类层次结构

python - 将C++中的数据映射到内存并以Python读取数据

c++ - 模板类的模板函数指针 - C++

c++ - Linux:获取相机设备号

c++ - Boost Type Erasure的实践与发现

c++ - 如何在 C++ 中使用自定义形状的光标检测图像上的鼠标单击位置

c++ - 变量的线程保护

c++ - 如何获得重定向路径的实际路径?

c++ - 如何使用 rand_r 以及如何以线程安全的方式使用它?