这一节,我将简单的介绍一下类的使用和一些该注意的地方。
在C++语言中,我们可以使用类来定义属于我们自己的数据类型,通过新的数据类型来反映待解决问题中的各种概念,可以使我们更容易编写,调试和修改程序。
类可以看成是现实世界中某种事物的抽象,数据类型如同事物的属性,成员函数如同是事物的行为,事物间的关系也可通过类来反映(继承,聚合)。
类的基本思想是 封装 和 数据抽象 ,数据抽象是一种依赖于接口和实现分离的编程方法,类的接口包括用户所能执行的操作;实现则包括类的数据成员和各种类所需要的函数。封装实现了类的接口和实现的分离,封装后的类隐藏了类的实现细节。
1.类的声明与定义
void FriendFun();
class MyClass{
public:
Myclass() = default;
MyClass(int a):idata(a){};
~MyClass();
void FunctionConst() const;
void Function();
protected:
int idata;
private:
char cdata;
int te = 10;
mutable int mte = 8;
friend void FriendFun();
};
- 编译器处理类:先编译类的声明,再编译函数体
2.this指针
- this总是指向“这个”对象,所以this是一个常量指针我们不能改变this地址
- 每次我们调用一个成员函数时,则编译器会把该对象的地址传递给函数的隐式形参this
3.const成员函数
- 将 const 放在成员函数参数列表之后,此时,紧跟在参数列表后的 const 表示 this 是一个指向常量的指针
- 常量对象,以及常量对象的引用或指针只能调用常量成员函数
- 可以用于成员函数的重载
4.可变成员(mutable)
- 被声明为 mutable 类型的变量即使在一个const对象内也能被修改
- 被声明为 mutable 类型的变量可以在 const 成员函数中被修改
5.访问控制
- public:整个程序内可被访问
- protected:只有类和该类的子类可以访问
- private:只有该类自身可以访问
6.构造函数
- 只要类被创建就会执行构造函数
- 类内的初始值是通过默认构造函数初始化的
- 一旦我们定义了其他的构造函数,默认构造函数就不会自动创建
- 如果类包含有内置类型或者复合类型的成员(指针或数组等),则只有这些类型全部被赋予了类内的初始值时,这个类才适合于使用合成的默认构造函数
- 若类中含有一个其他类的成员且这个成员的类型没有默认构造函数,那么编译器是无法初始化该成员的
- 构造函数体内执行的是赋值操作
7.构造函数初始值列表
- 类成员变量定义的顺序和声明的顺序一致
- 当成员变量被构造函数初始值列表忽略时,它将会被隐式初始化
- 类的const成员变量必须在构造函数初始值列表中初始化或在类内直接初始化,不能在构造函数体内赋值
8.析构函数
- 当析构函数是私有成员时,该类的对象只能在堆上创建(new操作创建)不能在栈上创建
9.友元
- 被声明为该类友元的类,函数,其他类的成员函数可以访问该类的私有成员
- 友元不是类的成员
- 友元函数不是该函数的声明,该函数在类的外部仍需声明,友元声明的作用是影响访问权限,并非普通意义上的声明
- 友元关系不存在传递性
10.类的声明
- 前向声明:在声明之后,定义之前是一个不完全类型,此时只能,定义指向这种类型的指针或引用,也可以声明以不完全类型作为参数或者返回类型
class MyClass;
- 一旦一个类的名字出现后,它就被认为是声明过了,因此类允许包含指向自身的引用或指针