目录
类的基本思想是数据抽象和封装
数据抽象是一种依赖于接口和实现分离的编程技术
定义在类内部的函数是隐式的inline函数
this
成员函数通过一个名为this的额外隐式参数来访问调用它的那个对象,当我们调用一个函数时,会用请求该函数的对象地址初始化this
return a相当于 return this->a
const成员函数
在函数的参数列表后加const,const会修改隐式this指针的类型
常量对象,常量对象的引用或指针都只能调用常量成员函数
编译器在处理类时,先编译成员的声明,然后才轮到函数体
若在类的外部定义成员函数,除了要和声明一模一样外,还要在函数明前加 类名::
构造函数
只要类的对象被创建,就会执行构造函数
- 构造函数的名字同类名
- 构造函数没有返回类型
- 构造函数有(可能为空的)参数列表和(可能为空的)函数体
- 类可以包含多个构造函数
- 构造函数不能是const
如果没写构造函数,编译器会隐式地定义一个(合成的默认构造函数)
如果类包含内置类型或复合类型的成员,只有当这些成员全都被赋予了类内初始值时,才适用于使用合成的默认构造函数,不然是未定义的
default
className()=default; 编译器会调用合成的默认构造函数
构造函数初始值列表
当某个数据成员被构造函数初始值列表忽略时,它将以与合成默认构造函数相同的方式隐式初始化
如果成员是const/引用/某种未提供默认构造函数的类类型----->必须通过构造函数初始值列表为这些成员提供初值
拷贝、赋值和析构
这三个编译器都有默认合成的
如果类中有vector或string成员之类,是可以用编译器的合成版本工作的
控制访问与封装
- 定义在public说明符之后的成员在整个程序内可被访问
- 定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问
struct和class定义类的唯一区别就是默认的访问权限:
- struct:定义在第一个访问说明符之前的成员是public
- class:定义在第一个访问说明符之前的成员是class
友元
类可以允许其他类或函数访问它的非公有成员。方法是令其他类或函数成为它的友元
增加一条以friend关键字开头的函数声明就行!
一般来说,最好在类定义开始或结束前的位置集中声明友元
友元声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。因此如果我们希望类的用户能调用某个友元函数,是要在友元声明之外再专门对函数进行一次声明。
建议:把友元的声明和类放到一个头文件中。
还可以把其他类、其他类的成员函数定义成友元
friend class w;
一个类如果指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员。
令其他类的成员函数做友元,除了写friend关键字外,在函数名前加上那个类的类名::
可变数据成员
希望能修改类的某个数据成员,即使是在一个const函数内——在变量的声明中加入mutable
一个const成员函数如果以引用的形式返回*this,那么它的返回类型将是常量引用
委托构造函数
一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程。
C++ 值初始化和默认初始化 - luStar - 博客园 (cnblogs.com)
在构造函数声明前加上explicit阻止构造函数定义的隐式转换(待学)
字面值常量类(p267)
类的静态成员
希望这个成员能与类本身直接相关,而不是与类的各个对象保持关联
在成员的声明前加上关键字static
静态成员在类外进行初始化(在名字前加上类名::)