我在stackoverflow的聊天区域询问了以下问题。
如果像这样创建对象,它是否会创建一个临时对象,然后调用赋值运算符将temp分配给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;
};
答案 0 :(得分:2)
在第二种情况下,指示编译器创建对象一次。在第一种情况下,您要求创建一个临时,然后将其复制到新对象。在这种情况下,编译器可以决定将创建 - 复制 - 破坏替换为更有效地创建单个对象。所以你必须为这种可能性做好准备,但你不能依赖它。
答案 1 :(得分:0)
声明中的=
不是作业。不调用赋值运算符。 C ++教科书是一件好事。
答案 2 :(得分:0)
如果您只是更新您的课程以准确输出它正在做的事情,那么您就会知道,例如:
class Object
{
public:
Object()
:
mSize(0)
{
cout << "Object default Ctor called" << endl;
}
Object(const Object & src )
:
mName(src.mName),
mSize(src.mSize)
{
cout << "Object copy Ctor called" << endl;
}
Object( string & name, int size )
:
mName(name),
mSize(size)
{
cout << "Object name Ctor called" << endl;
}
~Object()
{
cout << "Object Dtor called" << endl;
}
Object& operator=(const Object &rhs)
{
cout << "Object Assigment Op called" << endl;
mName = rhs.mName;
mSize = rhs.mSize;
}
string mName;
int mSize;
};