为了账号安全,请及时绑定邮箱和手机立即绑定

什么是C ++中的转换构造函数?它是为了什么?

什么是C ++中的转换构造函数?它是为了什么?

C++
慕标琳琳 2019-08-19 10:16:04
什么是C ++中的转换构造函数?它是为了什么?我听说C ++有一些叫做“转换构造函数”或“转换构造函数”的东西。这些是什么,它们的用途是什么?我在这段代码中看到了它:class MyClass{   public:      int a, b;      MyClass( int i ) {}}  int main(){     MyClass M = 1 ;}
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

使用转换构造函数隐式转换

让我们在问题中做出更复杂的例子

class MyClass{
  public:
     int a, b;
     MyClass( int i ) {}
     MyClass( const char* n, int k = 0 ) {}
     MyClass( MyClass& obj ) {}}

前两个构造函数正在转换构造函数。第三个是复制构造函数,因此它是另一个转换构造函数。

转换构造函数允许从参数类型到构造函数类型的隐式转换。这里,第一个构造函数允许从一个int类转换为一个对象MyClass。第二个构造函数允许从字符串转换为类的对象MyClass。第三......从班级MyClass的对象到班级的对象MyClass

要成为转换构造函数,构造函数必须具有单个参数(在第二个参数中,第二个参数具有一个默认值)并且不使用关键字进行声明explicit

然后,main中的初始化可能如下所示:

int main(){
    MyClass M = 1 ;
    // which is an alternative to
    MyClass M = MyClass(1) ;

    MyClass M = "super" ;
    // which is an alternative to
    MyClass M = MyClass("super", 0) ;
    // or
    MyClass M = MyClass("super") ;}

显式关键字和构造函数

现在,如果我们使用了explicit关键字怎么办?

class MyClass{
  public:
     int a, b;
     explicit MyClass( int i ) {}}

然后,编译器不会接受

   int main()
    {
        MyClass M = 1 ;
    }

因为这是隐式转换。相反,必须写

   int main()
    {
        MyClass M(1) ;
        MyClass M = MyClass(1) ;
        MyClass* M = new MyClass(1) ;
        MyClass M = (MyClass)1;
        MyClass M = static_cast<MyClass>(1);
    }

explicit 始终使用关键字来防止构造函数的隐式转换,它适用于类声明中的构造函数。


查看完整回答
反对 回复 2019-08-19
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

转换构造函数是单参数构造函数,声明时没有显式的函数说明符。编译器使用转换构造函数将对象从第一个参数的类型转换为转换构造函数类的类型。


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 406 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信