C++ Primer 第7章 知识点回顾

来源:互联网 发布:qq聊天变声软件 编辑:程序博客网 时间:2024/05/22 00:15

7.1 定义抽象数据类型

  1. 定义在类内部的函数是隐式inline函数
  2. 成员函数通过一个名为this的额外的隐式形参来访问调用它的那个对象。当我们调用一个成员函数时,用请求该函数的对象地址初始化this,例如total.isbn()则编译器负责吧total的地址传递给isbn的隐式形参this。因为this的目的总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中保存的地址。
  3. 常量对象、常量对象的指针或引用都只能调用常量成员函数(因为指向非常量版本的常量指针this无法绑定或者指向一个常量对象)
  4. 编译器分两步处理类:首先编译成员的声明,然后才轮到成员函数体。因此,成员函数体可以随意使用类中的其他成员而不需在意这些成员的出现次序。
  5. 一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类声明(而非定义)在同一个头文件内
  6. 构造函数不能被声明成const的,当我们创建类的一个const对象时,知道构造函数完成初始化过程,对象才能真正取得其常量属性
  7. 默认构造函数:无须任何实参合成默认构造函数:我们没有显式定义任何构造函数,编译器会为我们隐式定义一个默认构造函数。
  8. 定义在块中的内置类型和复合类型比如指针和数组的对象呗默认初始化,他们的值将是未定义的,该准则同样适用于默认初始化的内置类型成员
  9. 类内初始值或者放在花括号里,或者放在等号右边,不能使用圆括号

7.2.1 友元

  1. 友元声明只能出现在类定义的内部,在类内出现的具体位置不限,友元不是类的成员也不受他所在区域访问控制级别的约束。一般来说,最好在类定义开始或结束前的位置集中声明友元
  2. 友元的声明仅仅指定了访问的权限,而非一个通常意义的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外在专门对函数进行一次声明。为了使友元对类用户可见,我们通常把友元的声明和类本身放置在同一个头文件中(类的外部)。

7.3.1 类成员再探

  1. 用来定义类型的成员必须先定义在使用,这一点与普通成员有所区别,因此,类型成员通常出现在类开始的地方
  2. 最好只在类外部定义的地方说明inline,但在声明和定义的地方同时说明inline也是合法的。inline成员函数也应该与相应的类定义在同一个头文件中
  3. 可变数据成员:变量声明中加入mutable关键字mutable size_t access_ctr;,这个可变成员可以在const成员函数中被改变,即使在一个const对象内也能被修改。任何成员函数,包括const成员函数都能改变 它的值
  4. 当我们提供一个类内初始值时,必须以符号=或者花括号表示

7.3.2 返回*this的成员函数

  1. 返回引用的函数是左值的,意味着这些函数返回的是对象本身而非对象的副本
  2. 一个const成员函数如果以引用的形式返回*this,那么他的返回类型将是常量引用

7.3.3 类类型

  1. 前向声明:class Screen;不完全类型只能在非常有限的情境下使用:可以定义指向这种类型的指针或引用,也可以声明(但是不能定义)以不完全类型作为参数或者返回类型的函数
  2. 只有当类全部完成后类才算被定义,才能定义类的对象和这种类型的数据成员,,,但类只要声明过了(一旦一个类的名字出现后),就允许包含指向他自身类型的引用或指针

7.3.4友元再探

  1. 其他类、其他类成员函数、非成员函数都能成为友元,此外,友元函数能定义在类的内部,这样的函数是隐式内联的
  2. 友元关系不存在传递性
  3. 类和非成员函数的声明不是必须在他们的友元声明之前。甚至就算在类内部定义该友元函数,我们也必须在类外部提供相应的声明从而使得函数可见,换句话说,即使我们仅仅是用声明友元的类的成员调用该友元函数,他也必须是被声明过的。友元声明的作用是影响访问权限,它本身并非普通意义上的声明。

名字查找与类的作用域

  1. 类的定义分两步处理:首先,编译成员的声明。其次,知道类全部可见后才编译函数。这种两阶段的处理方式值适用于成员函数中使用的名字。声明中使用的名字,包括返回类型或者参数列表中使用的名字,都必须在使用前确保可见。
  2. 类型名要特殊处理:一般来说,内层作用域只可以重新定义外城作用域中的名字,即使该名字已经在内层作用域中使用过。然而在类中,如果成员使用了外层作用域中的某个名字,而改名字代表一种类型,则类不能在之后重新定义该名字。类型名的定义通常出现在类的开始处,这样就能确保所有使用该类型的成员都出现在雷鸣的定义之后。

7.5.1 构造函数初始值列表

  1. 如果没有在构造函数的初始值列表中显示地初始化成员,则该成员将在构造函数体之前执行默认初始化

7.5.4 隐式的类类型转换

  1. 转换构造函数:只接受一个实参的构造函数,能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则
  2. 常量引用可以绑定到一个临时量,非常量引用不可以
  3. 编译器只会自动执行一步类型转换,只允许一步类类型转换
  4. explicit:阻止隐式类型转换:这个关键字值对一个实参的构造函数有限。需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些构造函数指定为explicit的。只能在类内声明构造函数时使用explicit关键字,在类外部定义是不应重复使用。
  5. explicit构造函数只能用于直接初始化:发生隐式转换的一种情况是当我们执行拷贝形式的初始化时(使用=)
  6. 尽管编译器不会讲explicit的构造函数用于隐式类型转换,但是我们可以使用这样的构造函数显示地强制进行转换item.combine(Sales_data(null_book));

字面值常量类

  1. 字面值常量类:某些类也是字面值类型。。。

7.6 类的静态成员

  1. 静态成员函数不予类和对象绑定在一起,他们不包含this指针,作为结果,静态成员函数不能声明成const的,而且我们也不能再static函数体内使用this指针
  2. 虽然静态成员不属于类的某个对象,但是我们仍然可以使用类的对象,引用或者指针来访问静态成员
  3. 当在类外部定义静态成员时,不能重复static,该关键字只能出现在类内部的声明语句
  4. 重要!!!!!!!!!:因为静态数据成员不属于类的任何一个对象,所以他们并不是在创建类的对象是被定义的(隐藏含义:普通数据成员是在创建类的对象时被定义的),我们不能在类内初始化静态成员,相反的,必须在类的外部定义和初始化每个静态成员。
  5. 类的静态成员可以在类内部初始化:要求1:初始值是const整数类型。2:静态成员是字面值常量类型的constexpr。例如:static constexpr int period=30;即使一个常量静态数据成员在类内部被初始化了,通常情况下也应该在类的外部定义一下该成员
  6. 静态数据成员可以是不完全类型,特别的,静态数据成员的类型可以就是他所属的类类型,而非静态数据成员则受到限制们只能声明成他所属类的指针或引用
0 0
原创粉丝点击