diff --git a/3.MovingToModernCpp/item11.md b/3.MovingToModernCpp/item11.md index 34d660e..339a9ff 100644 --- a/3.MovingToModernCpp/item11.md +++ b/3.MovingToModernCpp/item11.md @@ -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`被拷贝,需要像拷贝将要被读取的值那样也拷贝已经被读取的值吗?解决这个问题最好的方法是不定义这个操作。直接禁止拷贝流。 diff --git a/3.MovingToModernCpp/item12.md b/3.MovingToModernCpp/item12.md index 164b4c0..d42f537 100644 --- a/3.MovingToModernCpp/item12.md +++ b/3.MovingToModernCpp/item12.md @@ -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`) \ No newline at end of file