编译器对构造函数的调用
三种不同类的初始化方式
Test t1(5); //标准初始化方式
Test t2 = 5; //拷贝构造函数 // 给Test(int i)前加explicit会报错
Test t3 = test(5); //手动调用构造函数 //给Test(const Test& obj)前加explicit会报错
在现代的编译器中这三种初始化方式是等价的。
C++编译器会尝试各种手段让程序通过编译
方式一、尽力匹配重载函数
方式二、尽力使用函数的默认参数
方式三、尽力尝试调用构造函数进行类型转换
Test t2 = 5;这个初始化的情况:
1、默认情况下,字面量5的类型为int,因此5无法使用初始化Test对象;
2、但是编译器在默认情况下可以自动调用构造函数;
3、于是编译器尝试调用Test(int)生成一个临时对象;
4、之后调用拷贝构造函数Test(const Test&)用临时对象t2进行初始化
方案是怎么做的?
方案A、 Test t2 = 5 <==> Test t2 = Test(Test());
方案B、Test t2 = 5 <==> Test t2(5);
现代C++编译器将上述四步骤优化为等价的初始化。
“剥夺”编译器对构造函数的尝试调用(但作者明确意图要去调用的是不会被explicit剥夺的)
C++提供了explicit关键字用于阻止编译器对构造函数的尝试调用
(插入14-2.cpp)
Test t1(5); //标准初始化方式
Test t2 = 5; //拷贝构造函数 // 给Test(int i)前加explicit会报错
Test t3 = test(5); //手动调用构造函数 //给Test(const Test& obj)前加explicit会报错
在现代的编译器中这三种初始化方式是等价的。
C++编译器会尝试各种手段让程序通过编译
方式一、尽力匹配重载函数
方式二、尽力使用函数的默认参数
方式三、尽力尝试调用构造函数进行类型转换
Test t2 = 5;这个初始化的情况:
1、默认情况下,字面量5的类型为int,因此5无法使用初始化Test对象;
2、但是编译器在默认情况下可以自动调用构造函数;
3、于是编译器尝试调用Test(int)生成一个临时对象;
4、之后调用拷贝构造函数Test(const Test&)用临时对象t2进行初始化
方案是怎么做的?
方案A、 Test t2 = 5 <==> Test t2 = Test(Test());
方案B、Test t2 = 5 <==> Test t2(5);
现代C++编译器将上述四步骤优化为等价的初始化。
“剥夺”编译器对构造函数的尝试调用(但作者明确意图要去调用的是不会被explicit剥夺的)
C++提供了explicit关键字用于阻止编译器对构造函数的尝试调用
(插入14-2.cpp)
上一篇:
IDEA上Java项目控制台中文乱码