博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C++ Primer 读书笔记 Charpter 12 类

Posted on 2010-08-20 23:50  KurtWang  阅读(276)  评论(0编辑  收藏  举报
  1. 类就是定义了一个新的类型和新的作用域,基本思想是数据抽象和封装
    1. 数据抽象:接口与实现分离
    2. 封装:将低层次的元素组合起来形成新的、高层次实体
    3. 优点:
      1. 避免类内部出现无意的、可能破坏对象状态的用户级错误。
      2. 随时间推移可以根据需求改变或曲线报告来完善类实现。
    4. 在类内部定义的函数,默认为inline,inline函数定义必须放在调用该函数的每个源文件可见的,即应放在头文件中。
  2. this指针
    1. 非const函数中,this是const指针,可以改变this所指向的值,不能改变this所保存的地址
    2. const函数中,this的类型是指向const类型的const指针
    3. 不能从const函数返回指向类对象的普通引用,只能返回*this作为一个const引用
    4. 基于const的重载:定义两个操作,一个是const,另一个不是const。const对象只能使用const函数,不是const的对象可以使用任何一个,但非const版本是一个更好的匹配。
  3. 类成员定义的名字查找顺序:函数局部作用域=>所有类成员的声明=>在此函数定义值钱的作用域中出现的声明
    1. 全局作用域 ::name
  4. 构造函数:
    1. const构造函数是不必要的
    2. 构造函数初始化式:item::item(const int & value):isbn(value){}
    3. 内置或复合类型的成员的初始值依赖于对象的作用域:在局部作用域的这些成员不被初始化,在全局作用域的被初始化为0;
    4. 建议使用构造函数初始化列表:必须对任何const或引用类型以及没有默认构造函数的类类型的任何成员使用初始化式
    5. 推荐按照与成员声明一致的次序编写构造函数,避免使用成员来初始化其他成员,
        class X
        {
            int i;
            int j;
        public:
            X(int val):j(val),i(j){} //runtime error, i is initialized before j
        }
    6. 默认实参:
        class Sales_item
        {
        public:
        	Sales_item(const string& book="");
        }
        
        Sales_item empty;
        Sales_item pr("222222");
    7. 默认构造函数:只有一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数
      1. 若包含内置或复合类型成员,则应该定义自己的构造函数
      2. 推荐定义一个默认构造函数
    8. explicit:将构造函数声明为explicit,防止使用构造函数的时候进行隐式转换
  5. 友元:允许一个类将对其非public成员的访问权授予指定的函数或类
    1. 通常将友元声明成组的放在类定义的开始或结尾
  6. static类成员
    1. 优点:
      1. 在类的作用域内,避免与其他类的成员或全局对象名字冲突
      2. 实施封装,可以是private对象
      3. 代码意图清晰
    2. static函数没有this指针
    3. static数据成员必须在类定义体的外部定义(正好一次)
    4. 应在定义时进行初始化,因为static成员不通过构造函数初始化。
      1. 在定义时不能标示为static,static关键字只能用于类定义内部的声明。
      2. 整形const static可以在类的定义体中进行初始化,但仍然需要在类的定义体之外进行定义
    5. static成员不是对象的组成部分