- 类的定义
类的内存大小对齐,空类1字节 - 类的成员变量
- 类的成员函数
- 类内声明和定义
- 类内声明,类外实现
- 不同文件:.h声明 .cpp实现
- 类域
- 局部变量:大括号,括号始 括号终
- 全局变量:全局,生存周期全局
- 文件变量:static + 全局变量,当前文件内使用,生存周期全局的
- 静态局部变量:局部,生存周期是全局的
- 类域:我的成员可以通过类对象在哪里访问
- public:公有,只要类类对象,在哪都能使用类成员
- protected:只能在我的类和派生类内使用
- private: 只能在我的类内使用
- 对象定义:局部、全局、数组、堆
- 成员函数的使用 this指针
- 类与结构体的区别
- 和C++的结构体的区别:
- 定义上:关键字不一样struct class
- 访问权限:不写,类默认是private,结构体public
- 其他没有区别了
- 和C的结构体的区别:
- 定义上:关键字不一样struct class
- 访问权限:C里没有public、protected、private
- 成员:C的结构体里没有函数,C++类有成员函数
- this: C的结构体里没有this指针
- 和C++的结构体的区别:
命名空间
作用:避免命名冲突,命名空间可以起别名 namespace a =b;
命名空间是作用域,不能用它来定义变量
命名空间是作用域,不是变量类型,只能在全局范围内定义
可以嵌套
- 构造函数
1.1 构造的作用
- 类对象创建的时候,用来初始化类对象空间用的
1.2 构造函数特点 - 名称和类名相同,返回值(没有),参数(随意)
1.3 调用时机 - 类对象刚开始拥有内存的时候
- 析构函数
2.1 作用
- 对象销毁的时候,释放该对象占用的资源
2.2 特点 - 函数名和类型相同,为了和构造区分,前面加个~
- 函数返回值:没有返回值
- 参数:必须无参
2.3 调用时机 - 类对象销毁的时候->该类对象内存被回收的时候
- 局部变量:出了作用域
- 全局变量:程序退出的时候
- 堆对象:什么时候delete什么时候调用
- 构造析构的调用顺序
- 按成员对象在内存中的分布顺序依次调用
- 构造函数分类
4.1 默认构造函数
- 类名(){}
4.2 带参构造函数 - 类名(参数列表){函数体}
4.3 初始化列表 - 哪些成员必须写在初始化列表里
- 只支持初始化,不支持赋值:const
- 初始化和赋值的意义不同:引用&
- 类对象:该类对象的类没有无参构造函数、
- 初始化列表的初始化顺序:内存分布顺序
4.4 拷贝构造函数 - 参数类型是当前类对象的引用的带参构造函数
- 调用时机:当有类对象产生的时候,并且是以类对象初始化类对象
CClas A = B
- 函数传参的时候:实参初始化形参的时候,形参不是引用
- 函数返回类型是类类型的时候
4.5 转换构造函数
大多情况下,用基本数据类型给类对象赋值或初始化类对象的时候
调用的构造函数就叫转换构造函数
用eplicit限制隐式转换构造后使用
D objecta = D(20)创建临时的无名对象 调用拷贝构造
- 默认成员函数
Empty(); // 默认构造函数
Empty(const Empty&); // 默认拷贝构造函数
~Empty(); // 默认析构函数
Empty& operator=(const Empty&); // 默认赋值运算符
Empty*operator&(); // 取址运算符
const Empty*operator&()const; // 取址运算符const
- 静态成员
1.1 由来
1.2 定义
- 静态成员变量:static int m_nNum;
- 类外初始化:int 类名::m_nNum = 10;
- 静态成员函数:在类的成员函数名前加static
- 静态成员变量为所有类对象共有,不依赖类对象存在
1.3 使用 - 类对象.成员变量/成员函数
- 类名::成员变量/成员函数
1.4 和成员函数的区别 - 静态成员函数和普通成员函数的区别:
静态成员函数没有this指针,只能直接访问类的静态成员函数/变量,必须通过类对象才能访问普通成员函数/变量
- 静态成员函数和普通函数的区别
相同:必须通过类对象才能访问类的普通成员函数和成员变量
唯一区别:访问权限不同,普通函数只能访问public成员
-
友元
2.1 由来想在类外使用类的限制成员
2.2 友元函数
定义
在类内声明friend
friend void Draw(CTank obj);
友元函数和普通成员函数的区别:
友元函数没有this指针,就是个普通函数,只不过被类声明为可以使用类的限制成员。访问类的成员变量/函数的时候必须有类对象2.3 友元类
class CTank {
friend void Draw(CTank obj);
friend class CDraw;
public:
int m_nBlood;
void Draw() {
printf("%d\n", m_nDir);
}
private:
int m_nDir;
};
class CDraw {
public:
void Draw(CTank obj) {
printf("%d\n", obj.m_nDir);
}
void Change(CTank& obj,int nDir) {
obj.m_nDir = nDir;
}
};
2.4 友元成员函数
声明其他类的某些成员函数作为我的友元函数
2.5 和成员函数的区别
有this指针,但是这个this指针不是友元类的this指针,不是当前类的this指针,是成员函数本身的类对象的地址。所以要使用当前类的成员,必须通过当前类的类对象