繁体   English   中英

转换构造函数说明

[英]Conversion constructor clarification

#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时,为什么要调用构造函数和析构函数? 请解释。非常感谢。

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

t = Test(30);

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

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

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

在这种情况下,分配可以直接使用它,等效于

t.operator=(30);

当您写t = 30 ,编译器将创建一个临时Test变量,该变量将使用转换构造函数创建。 在将t设置t等于此临时变量之后,该临时变量将被销毁,并调用析构函数。

由于已经定义了t ,因此无法通过转换构造函数对其进行初始化。

而是创建一个temporay Test对象,调用operator =,然后将其删除。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM