mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-03-04 14:20:24 +08:00
fix
This commit is contained in:
parent
9dcc2f55d5
commit
0bc5ef3b26
@ -1,4 +1,4 @@
|
|||||||
## Ite 17:理解特殊成员函数函数的生成
|
## Ite 17:理解特殊成员函数的生成
|
||||||
条款 17:理解特殊成员函数函数的生成
|
条款 17:理解特殊成员函数函数的生成
|
||||||
|
|
||||||
在C++术语中,特殊成员函数是指C++自己生成的函数。C++98有四个:默认构造函数函数,析构函数,拷贝构造函数,拷贝赋值运算符。这些函数仅在需要的时候才生成,比如某个代码使用它们但是它们没有在类中声明。默认构造函数仅在类完全没有构造函数的时候才生成。(防止编译器为某个类生成构造函数,但是你希望那个构造函数有参数)生成的特殊成员函数是隐式public且inline,除非该类是继承自某个具有虚函数的类,否则生成的析构函数是非虚的。
|
在C++术语中,特殊成员函数是指C++自己生成的函数。C++98有四个:默认构造函数函数,析构函数,拷贝构造函数,拷贝赋值运算符。这些函数仅在需要的时候才生成,比如某个代码使用它们但是它们没有在类中声明。默认构造函数仅在类完全没有构造函数的时候才生成。(防止编译器为某个类生成构造函数,但是你希望那个构造函数有参数)生成的特殊成员函数是隐式public且inline,除非该类是继承自某个具有虚函数的类,否则生成的析构函数是非虚的。
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
应该在创建对象时用{}而不是()吗?为什么alias声明比typedef好?constexpr和const有什么不同?常量成员函数和线程安全有什么关系?这个列表越列越多。
|
应该在创建对象时用{}而不是()吗?为什么alias声明比typedef好?constexpr和const有什么不同?常量成员函数和线程安全有什么关系?这个列表越列越多。
|
||||||
这章将会逐个回答这些问题。
|
这章将会逐个回答这些问题。
|
||||||
|
|
||||||
## Item 5:Distinguish between () and {} when creating objects
|
## Item 7:Distinguish between () and {} when creating objects
|
||||||
条款五:区别使用()和{}创建对象
|
条款七:区别使用()和{}创建对象
|
||||||
|
|
||||||
从不同的角度看,C++11初始化对象的语法选择既丰富得让人尴尬又混乱得让人糊涂。一般来说,初始化值要用()或者{}括起来或者放到"="的右边:
|
从不同的角度看,C++11初始化对象的语法选择既丰富得让人尴尬又混乱得让人糊涂。一般来说,初始化值要用()或者{}括起来或者放到"="的右边:
|
||||||
````cpp
|
````cpp
|
||||||
@ -159,7 +159,7 @@ public:
|
|||||||
…
|
…
|
||||||
};
|
};
|
||||||
Widget w{10, 5.0}; //错误!要求变窄转换
|
Widget w{10, 5.0}; //错误!要求变窄转换
|
||||||
````
|
````
|
||||||
这里,编译器会直接忽略前面两个构造函数,然后尝试调用第三个构造函数,也即是std::initializer_list构造函数。
|
这里,编译器会直接忽略前面两个构造函数,然后尝试调用第三个构造函数,也即是std::initializer_list构造函数。
|
||||||
调用这个函数将会把`int(10)`和double(5.0)`转换为bool,由于括号初始化拒绝变窄转换,所以这个调用无效,代码无法通过编译。
|
调用这个函数将会把`int(10)`和double(5.0)`转换为bool,由于括号初始化拒绝变窄转换,所以这个调用无效,代码无法通过编译。
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user