📜  什么是C++中的转换构造函数?

📅  最后修改于: 2021-05-30 03:36:03             🧑  作者: Mango

先决条件: C++中的类型转换和C++中显式关键字的使用

在C++中,如果类具有可以用单个参数调用的构造函数,则此构造函数将成为转换构造函数,因为这样的构造函数允许自动转换为正在构造的类。

例子

#include 
  
class MyClass {
    int a, b;
  
public:
    MyClass(int i)
    {
        a = i;
        b = i;
    }
    void display()
    {
        std::cout << " a = " << a << " b = " << b << "\n";
    }
};
  
int main()
{
    MyClass object(10);
    object.display();
  
    // Single parameter conversion constructor is invoked.
    object = 20;
    object.display();
    return 0;
}

输出:

a = 10 b = 10
a = 20 b = 20

转换构造函数:有些构造函数会将其参数的类型转换为类的类型。编译器使用这些构造函数执行隐式类类型转换。这些转换是通过调用与分配给该对象的值/对象列表相匹配的对应构造函数进行的。

前面的示例仅处理一个参数,以将其扩展到多个参数,即扩展的初始化程序列表或braced-init-lists。也就是说,我们将要传递给它的参数放在一对大括号({})中。

具有多个参数的示例:

#include 
  
class MyClass {
    int a, b;
  
public:
    MyClass(int i, int y)
    {
        a = i;
        b = y;
    }
    void display()
    {
        std::cout << " a = " << a << " b = " << b << "\n";
    }
};
  
int main()
{
    MyClass object(10, 20);
    object.display();
  
    // Multiple parameterized conversion constructor is invoked.
    object = { 30, 40 };
    object.display();
    return 0;
}

输出:

a = 10 b = 20
a = 30 b = 40

笔记:

  1. 扩展的初始化器列表在C++ 11及更高版本中可用。
  2. 我们可以在创建对象时直接尝试为其分配扩展的初始化程序列表。
  3. 构造函数的隐式类类型转换功能不会影响其正常行为。
  4. 对构造函数使用explict函数说明符会删除使用该构造函数的隐式转换

转换构造函数的用法

  1. 作为函数的返回值:

    当函数的返回类型是类时,我们可以返回braced-init-list ,而不是返回对象,因为返回类型是类实例,所以使用braced-init-创建该类的对象list ,因为该类具有相应的转换构造函数。

    例子:

    函数create_object将返回一个MyClass对象,该对象的a和b值分别作为传递给该函数的x和y值。

  2. 作为函数的参数:

    当一个函数的参数类型是一类,而不是传递对象的函数,我们可以通过一个支撑,初始化列表的函数,作为实际参数,因为班里有一个相应的转换构造函数。
    一个例子 :

    注意:此函数display_object创建一个名为obj的MyClass的新类实例,并将调用其成员函数display()。

    鸣谢:巴拉特·维格涅什(Bharath Vignesh JK)

    要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”