zoukankan      html  css  js  c++  java
  • 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成员和方法

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

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

  • 相关阅读:
    JavaScript中需要注意的几个问题
    前端编码规范之JavaScript
    那些年,我们一起玩过的响应式布局
    前端编码规范之CSS
    一个不陌生的JS效果-marquee,用css3来实现
    解读jQuery中extend函数
    字体大小自适应纯css解决方案
    浅谈叶小钗面试的几个问题
    【Python开发】C和Python之间的接口实现
    【Python开发】【编程开发】各种系统的清屏操作命令
  • 原文地址:https://www.cnblogs.com/yangtianxing/p/2535374.html
Copyright © 2011-2022 走看看