如果每个赋值都创建一个临时对象来将对象复制到左值中,您如何在 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=
被调用,你最终会得到 1
在a.i
和 2
在a.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/