【问题标题】:Conversion constructor clarification转换构造函数说明
【发布时间】:2015-04-12 03:32:00
【问题描述】:
#include<iostream>

using namespace std;

class Test 
{
 private:
   int x;
 public:
    Test(int i) 
    {
        cout<<"Conversion constructor called..."<<endl;
        x = i;
    }
    ~Test()
    {
        cout<<"Destructor called..."<<endl;
    }
    void show() 
    { 
        cout<<" x = "<<x<<endl; 
    }
};

int main()
{
  Test t(20);
  t.show();
  t = 30; 
  t.show();

  return 0;
}

输出:

Conversion constructor called...
 x = 20
Conversion constructor called...
Destructor called...
 x = 30
Destructor called...

当我在做 t = 30 为什么它调用构造函数和析构函数? 请解释一下。非常感谢。

【问题讨论】:

    标签: c++ constructor assignment-operator


    【解决方案1】:

    没有= 的重载可用于直接从int 值进行分配。您的转换构造函数允许将30 转换为Test 对象,然后可以使用隐式生成的复制构造函数(复制每个成员)对其进行分配。所以你的分配相当于

    t = Test(30);
    

    创建和销毁要分配的临时对象。

    您可以通过提供赋值运算符来避免这种情况:

    Test & operator=(int i) {x = i;}
    

    这种情况下赋值可以直接使用this,相当于

    t.operator=(30);
    

    【讨论】:

      【解决方案2】:

      “为什么要调用构造函数和析构函数?”

      因为有一个 Test 的(隐式)临时实例被构造,分配给 t 并在分配后被销毁。

      【讨论】:

        【解决方案3】:

        因为t已经定义,所以不能通过转换构造器初始化。

        相反,它会创建一个临时的Test 对象,调用 operator=,然后将其删除。

        【讨论】:

          【解决方案4】:

          当您编写t = 30 时,您的编译器会创建一个临时的Test 变量,它使用转换构造函数创建。在设置t等于这个临时变量后,这个临时变量就会被销毁,调用析构函数。

          【讨论】:

          • @paddy:默认赋值运算符用于从另一个 Test 复制赋值,而不是任意类型。
          猜你喜欢
          • 2012-09-09
          • 1970-01-01
          • 2012-07-19
          • 1970-01-01
          • 1970-01-01
          • 2013-12-27
          • 2023-03-25
          • 1970-01-01
          相关资源
          最近更新 更多