先决条件: 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
笔记:
- 扩展的初始化器列表在C++ 11及更高版本中可用。
- 我们可以在创建对象时直接尝试为其分配扩展的初始化程序列表。
- 构造函数的隐式类类型转换功能不会影响其正常行为。
- 对构造函数使用explict函数说明符会删除使用该构造函数的隐式转换
转换构造函数的用法
- 作为函数的返回值:
当函数的返回类型是类时,我们可以返回braced-init-list ,而不是返回对象,因为返回类型是类实例,所以使用braced-init-创建该类的对象list ,因为该类具有相应的转换构造函数。
例子:
MyClass create_object(int x, int y)
{
return {x, y};
}函数create_object将返回一个MyClass对象,该对象的a和b值分别作为传递给该函数的x和y值。
- 作为函数的参数:
当一个函数的参数类型是一类,而不是传递对象的函数,我们可以通过一个支撑,初始化列表的函数,作为实际参数,因为班里有一个相应的转换构造函数。
一个例子 :void display_object(MyClass obj)
{
obj.display();
}// This function is invoked in the main function with a braced-init-list with two integers as the parameter.
// e.g. :
// display_object({10, 20});注意:此函数display_object创建一个名为obj的MyClass的新类实例,并将调用其成员函数display()。
鸣谢:巴拉特·维格涅什(Bharath Vignesh JK)
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。