【问题标题】:Constructor c++ Object obj = Object("string", 22); creating a temporary Object?构造函数 c++ Object obj = Object("string", 22);创建一个临时对象?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果你只是简单地更新你的类来输出它在做什么,那么你就会知道,例如:

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

      【讨论】:

        猜你喜欢
        • 2014-09-13
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2012-02-05
        • 2014-11-29
        相关资源
        最近更新 更多