【发布时间】:2013-01-26 05:06:53
【问题描述】:
我在stackoverflow的聊天区问了以下问题。
如果您像这样创建对象,它会创建一个临时对象,然后调用赋值运算符将临时对象分配给 obj 对象吗?
Object obj = Object( "Chris", 27 );
有人告诉我它只是调用构造函数。
但是,当我运行代码时,控制台会打印出在下一行调用了 dtor,这意味着构造了一个临时的,这一定意味着赋值运算符被调用得太正确了?
如果这是真的,那是否意味着像这样编写你的构造函数
Object obj( "Chris", 22 );
实际上运行得更快,因为您避免使用临时 ctor 和 dtor 以及赋值运算符。当我像上面那样运行代码时,没有 dtor 字符串会打印到控制台,直到函数结束。所以似乎没有创建临时的,我的代码将更有效地运行。
class Object
{
public:
Object()
{
mSize = 0;
}
Object( string & name, int size )
:
mName(name),
mSize(size)
{
}
~Object()
{
cout << "Object Dtor called" << endl;
}
string mName;
int mSize;
};
【问题讨论】:
-
编译器可以省略副本,但这取决于编译器和使用的选项。你在用什么?
-
Visual Studio 2012 Express for Desktop
-
你是在构建调试还是发布?
-
相比编译器设置,我更感兴趣的是标准的内容。
-
顺便说一下,
Object o = 5;之类的东西叫做拷贝初始化,调用的是拷贝构造函数,而不是赋值运算符。
标签: c++ constructor destructor assignment-operator