构造函数c ++ Object obj = Object(“string”,22);创建临时对象?

时间:2013-02-11 05:23:05

标签: c++ constructor destructor assignment-operator

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

3 个答案:

答案 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;
};