Professional C++读书笔记05

2012-05-20

Chapter09

1、复制构造函数浅复制时的隐患

         若对象中有指针成员,则当对象作为形参传入时

         例如void myFun(Spreadsheet s)……

                   Spreadsheet s1(5,3);

                   myFun(s1);//    s1与s中的指针成员指向同一块内存(s是由s1通过复制构造函数生成的),当myFun()结束时,会释放s,则s指针成员所指向空间释放,导致s1的指针成员指向的空间释放,即s1的指针成员指向一块已经释放的内存。

2、赋值运算符浅复制时的隐患

         Spreadsheet s1(2,2),s2(4,3);

         s1=s2;

         则s1,s2中的指针成员指向了同一块内存(s1的),导致s2的指针成员原来所指向的内存成了孤儿内存

         ∴重写赋值运算符注意的三点

         1,检查自赋值情况。2,删除原来所指向的内存,并用rhs的值重新分配内存。3,返回(*this),即对象的引用

3、也可将复制构造函数与赋值运算符设为私有(不必实现),禁止用户这么做(比如数组类)

         private:

                   Spreadsheet (const Spreadsheet &src);

                   Spreadsheet &operator=(const Spreadsheet &src);

4、静态数据成员:一个与类关联而不是与对象关联的数据成员

         会默认初始化为0,在函数与方法体之外进行初始化

         int Spreadsheet::sCounter=0;                   //初始化

5、const数据成员:通常是静态的

         尽可能用static const 取代全局变量

         ∵是static ∴必须在源文件中为其声明空间(方法体外)

                   如 const int Spreadsheet::MaxValue=100;

         另外,C++允许在类文件中声明这些变量的同时为其赋值

         class Spreadsheet

         {

                   public : static const int MaxValue=100;

         }

6、静态方法:方法应用于整个类,而不是单个对象

         ∴并不是在一个特定的对象上调用,即没有this指针

         不能在静态方法中访问非静态成员

         在类中像调用常规函数一样调用静态方法。

         若声明为public,则在类外可这样调用

         string str=Spreadsheet::doubleToString(5);

7、const方法

         如果有一个const对象或者对const对象的引用,编译器不允许该对象调用任何方法(防止修改数据成员),除非是const方法

         例如:double getValue() const;               //类定义中,即头文件中

                   double SpreadsheetCell::getValue()        const

         {        return mValue;                                     //方法定义中,即源文件中

         }//const不能修改数据成员,否则编译器报错

        

         非const对象可调用非const、const方法

         const对象只能调用const方法

8、关键词mutable

         在const方法中,编译器不允许修改普通数据成员,但可在const方法中修改mutable数据成员

         如在类定义中:mutable int NumberAccess;

         则可在const方法中修改NumberAccess的值

9、函数重载:补遗

         可以编写两个同名且参数相同的方法,一个声明const,一个不声明

         若提供const对象,调用const方法,反之亦然

10、内联

         法一:在类定义中inline声明,方法定义中实现

         法二:类定义中直接写出其方法定义,即在类定义中展开代码,无需关键词inline

11、友元

         类可以将其他非成员函数声明为友元,可以访问protected、private成员和方法

         类的内部会暴露给其他类或函数,破坏抽象原则

         所以,在有限的情况下(如运算符重载)使用友元

posted on 2012-06-04 23:11  TheBest  阅读(148)  评论(0编辑  收藏  举报

导航