mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-29 21:30:31 +08:00
Merge pull request #70 from cellspace/master
Modify some inappropriate translations
This commit is contained in:
commit
4789409036
@ -3,10 +3,7 @@
|
||||
|
||||
如果你写的代码要被其他人使用,你不想让他们调用某个特殊的函数,你通常不会声明这个函数。无声明,不函数。简简单单!但有时C++会给你自动声明一些函数,如果你想防止客户调用这些函数,事情就不那么简单了。
|
||||
|
||||
上述场景见于特殊的成员函数,即当有必要时C++自动生成的那些函数。Item 17 详细讨论了这些函数,但是现在,我们只关心拷贝构造函数和拷贝赋值运算符重载。This chapter is largely devoted to common practices in
|
||||
C++98 that have been superseded by better practices in C++11, and in C++98, if you
|
||||
want to suppress use of a member function, it’s almost always the copy constructor,
|
||||
the assignment operator, or both.
|
||||
上述场景见于特殊的成员函数,即当有必要时C++自动生成的那些函数。Item 17 详细讨论了这些函数,但是现在,我们只关心拷贝构造函数和拷贝赋值运算符重载。本节主要致力于讨论C++98中那些被C++11所取代的最佳实践,而且在C++98中,你想要禁止使用的成员函数,几乎总是拷贝构造函数或者拷贝赋值函数,或者两者都是。
|
||||
|
||||
在C++98中防止调用这些函数的方法是将它们声明为私有成员函数。举个例子,在C++ 标准库*iostream*继承链的顶部是模板类`basic_ios`。所有`istream`和`ostream`类都继承此类(直接或者间接)。拷贝`istream`和`ostream`是不合适的,因为要进行哪些操作是模棱两可的。比如一个`istream`对象,代表一个输入值的流,流中有一些已经被读取,有一些可能马上要被读取。如果一个`istream`被拷贝,需要像拷贝将要被读取的值那样也拷贝已经被读取的值吗?解决这个问题最好的方法是不定义这个操作。直接禁止拷贝流。
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
## Item 12:使用override声明重载函数
|
||||
条款12:使用override声明重载函数
|
||||
## Item 12:使用override声明重写函数
|
||||
条款12:使用override声明重写函数
|
||||
|
||||
在C++面向对象的世界里,涉及的概念有类,继承,虚函数。这个世界最基本的概念是派生类的虚函数重写基类同名函数。令人遗憾的是虚函数重写可能一不小心就错了。给人感觉语言的这一部分设计观点是墨菲定律不是用来遵守的,只是值得尊敬的。
|
||||
在C++面向对象的世界里,涉及的概念有类,继承,虚函数。这个世界最基本的概念是派生类的虚函数重写基类同名函数。令人遗憾的是虚函数重写可能一不小心就错了。似乎这部分语言的设计理念是不仅仅要遵守墨菲定律,还应该尊重它。
|
||||
|
||||
鉴于"重写"听起来像"重载",尽管两者完全不相关,下面就通过一个派生类和基类来说明什么是虚函数重写:
|
||||
虽然"重写(overriding)"听起来像"重载(overloading)",然而两者完全不相关,所以让我澄清一下,正是虚函数重写机制的存在,才使我们可以通过基类的接口调用到派生类的成员函数:
|
||||
|
||||
```cpp
|
||||
class Base {
|
||||
@ -27,7 +27,7 @@ upb->doWork(); // 通过基类指针调用doWork
|
||||
要想重写一个函数,必须满足下列要求:
|
||||
|
||||
+ 基类函数必须是`virtual`
|
||||
+ 基类和派生类函数名必须完全一样(除非是析构函数
|
||||
+ 基类和派生类函数名必须完全一样(除非是析构函数)
|
||||
+ 基类和派生类函数参数必须完全一样
|
||||
+ 基类和派生类函数常量性(constness)必须完全一样
|
||||
+ 基类和派生类函数的返回值和异常说明(exception specifications)必须兼容
|
||||
@ -183,5 +183,5 @@ auto vals2 = makeWidget().data(); //调用右值重载版本的Widget::data,
|
||||
|
||||
**记住**:
|
||||
|
||||
+ 为重载函数加上`override`
|
||||
+ 为重写函数加上`override`
|
||||
+ 成员函数限定让我们可以区别对待左值对象和右值对象(即`*this`)
|
Loading…
Reference in New Issue
Block a user