chapter9_定义新类型

  1. C++的类型分为:内部类型 + 自定义类型

  2. C++的一种设计思想:应该让程序员创建跟内部类型一样易于使用的类型

  3. 一个良好的编程习惯:

    头文件中使用限定名 (std::xxx),源文件包含适当的using

  4. 类的成员函数

    1. 对于类的成员函数,总是有一个隐含参数,就是正在由我们操作的对象

    2. 常量成员函数

      示例

           struct Student_info {
      
               ...
      
               double grade() const;
      
               ...
           };
      

      代表,传递隐含参数 Student_info 时,我们把它当作一个const常量引用,因此不能改变对象的内部状态

      注:不能对常量对象调用非常量函数,原因同上

    3. 非成员函数

      例如 compare(Object a, Object b)这种就可以放在类实体的外部作为全局函数

      原则:如果函数会改变一个对象的状态,那么它就应该作为这个对象的成员函数

    4. 存取器函数

      就是 get / set,决定了数据的读写访问权限

      注:如果 get 的返回类型为引用,那么外部其实也可以改它,这样封装就被破坏了,所以get方法尽可能不返回引用类型,而是返回值类型

  5. struct 和 class

    1. 唯一区别是:

      对内部成员的缺省保护方式不同:struct默认是public,class默认是private

    2. 用途

      (1) 如果设计是保留结构,以指示简单的类型,并且希望公开这些类型的数据结构 ----> 使用 struct

      (2) 如果想构造一个类型并控制对其成员的访问 ----> 使用 class

    1. 缺省初始化

    对象是局部变量,会发生缺省初始化

    1. 数值初始化

      发生以下三种情况时,会发生数值初始化

      (1) 对象被用来初始化一个容器元素

      (2) 为映射表map添加一个新元素

      (3) 定义一个有特定长度的容器,对象是这个容器的元素

    2. (1) 如果对象属于自定义类型,且定义了一个或多个构造函数,则合适的构造函数就完全控制了对类的对象的初始化

      (2) 如果对象属于内部类型,那么数值初始化会把它设为0,缺省初始化方式会直接设为内存中的值

      (3) 如果对象属于自定义类型,且未定义任何构造函数,那么会对这个对象的每一个数据成员进行相应的数值初始化或缺省初始化

  6. 构造函数

    1. 示例

       Student_info::Student_info(): midterm(0), final(0) {
           ...
       }
      
    2. 初始化步骤

      (1) 分配内存

      (2) 按照构造函数初始化程序列表(例如midterm(0)这种),对对象初始化

      (3) 执行构造函数的函数体

    3. 构造函数中的初始化工作包含了显式和隐式,例如对象中的vector<int>虽然没有在构造函数中涉及,但是会隐式调用vector的缺省构造函数

    4. 对于对象中的基本类型,如果是缺省初始化,那么值就是内存中的随机值

    5. 一个好的编程习惯是:每一个构造函数在退出前,都应该先保证所有的数据成员都有了有意义的值

发布了391 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/captxb/article/details/103055585