"C++ Primer" 读书笔记 第十二章 类
- 在类体内部定义的成员函数缺省为inline函数。适用于代码量较小的如存取函数。
- 抽象和封装:抽象是让使用和实现分离,封装是实现抽象的手段,将内部实现黑盒化
- 当两个类互相依赖时,总有一个类要先被定义:可以用类的前向声明实现声明不完全类型(例如要在A类中定义一个B类成员变量,在B类中定义一个A类成员变量)
this指针
类的所有成员函数都有一个附加的隐含形参,即指向调用这个成员函数的对象本身的一个指针。this指针由编译器隐式地定义,不能在成员函数中显式地定义。
- 一个成员函数需要返回自身的引用,return *this;
- 为什么需要返回自身的引用呢?因为需要连续调用成员函数如:a.func1().func2(),且从左边往右边调用。
- 如果func1()是一个const成员函数,则由于const对象不能调用非const成员,因此a.func1().func2()会报错,此时需要重载该成员
- const成员函数也并非完全不能修改成员变量的值:可变数据成员(加mutable关键字)可以被const成员函数修改
- 类作用域就是在该域内,可以直接访问该类的成员变量、成员函数、局部类型别名等
- 完全限定名可以进入类作用域
- 构造函数初始化列表是必须的!因为没有默认构造函数的类类型的成员、const或引用类型的成员必须被初始化
- 友元
- 对象的友元可以访问该对象的私有成员
- 友元可以是其他类、其他类的指定成员函数、或者是非成员变量函数
- 在类体内声明一个友元相当于普通的声明,之后不必在类体外再声明
- 非成员函数作为友元,可以直接在类体内部定义函数体
- static类成员
- 我们知道static局部变量的生命周期是整个进程,且static局部变量独立于所在函数的任意次调用而存在;
- 类的static成员能独立于这个类的不同对象实例存在,static是某种类的所有对象共享的
- static成员可以是成员变量或者成员函数,显然static成员函数没有this指针,因为它并不与某个特定的对象挂钩,static成员函数的内部代码只能访问类的static成员
- static成员变量用于描述这个类本身的某些性质,与对象无关
- static成员函数不能被声明为const,因为const成员函数的意义是在这个函数内部不能修改该对象的成员,而static成员是与对象无关的
- static数据成员可以作为默认实参
- static成员函数必须在类的外部定义,在内部声明时要加static关键字,而在定义时不用加
- static数据成员则可以在类体中初始化,事实上只要初始化式是一个常量表达式,连static成员函数都可以在类体中直接定义