2

我在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;
};
4

3 回答 3

2

在第二种情况下,编译器被指示创建一次对象。在第一种情况下,您要求创建一个临时对象,然后将其复制到一个新对象中。在这种情况下,编译器可以决定将创建-复制-销毁替换为更有效地创建单个对象。所以你必须为这种可能性做好准备,但你不能依赖它。

于 2013-02-11T05:28:13.310 回答
0

声明中的=in 不是赋值。没有调用赋值运算符。拥有一本 C++ 教科书是一件好事。

于 2013-02-11T05:43:26.993 回答
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;
};
于 2013-02-11T09:35:05.247 回答