从毕业到从事工作,才发现自己基础到底有多烂,领导问起来一问三不知,场面十分尴尬,愧于说自己学过C++。现在对一些C++中一直模糊的概念做一总结。在接下来的一段时间里也将重新学习C++。
1. 静态成员函数
静态成员函数是类里面定义的标注了static的成员函数。它与任何对象无关,不具有this指针,所以也就无法直接访问类对象的非静态成员变量和非静态成员函数。使用非静态成员函数:
- 为了处理静态成员变量
- 不能默认访问非静态数据成员和非静态成员函数,但可以通过对象名间接访问
A::func(int x){cout<<a.x<<endl;} //func静态成员函数,a是类的对象,x为非静态数据成员
静态成员函数 | 普通成员函数 | |
---|---|---|
所有对象共享 | √ | √ |
隐含this 指针 | × | √ |
访问普通成员变量/函数 | × | √ |
访问静态成员变量 /函数 | √ | √ |
通过类名直接调用 | √ | × |
通过对象名直接调用 | √ | √ |
2. 纯虚函数
virtual 类型 函数名(参数列表)=0;//纯虚函数
- 包含纯虚函数的类是抽象类。
- 抽象类不能实例化对象,纯虚函数在派生类中重新定义之后,派生类才能实例化出对象。
- 纯虚函数与普通的虚函数的区别是纯虚函数必须在派生类中被实现,而虚函数允许不被实现。定义纯虚函数可以防止在编写大型项目过程中遗漏某个重要的函数实现,如果纯虚函数没有被实现,则在编译的过程中会报错。
3. 虚函数
允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或者引用来访问基类和派生类中的同名函数。
4. 重载、重写、重定义
先上一张表格:
重载 | 重写 | 重定义 | |
---|---|---|---|
范围 | 同一个类中 | 基类和派生类 | 基类和派生类 |
函数名 | 相同 | 相同 | 相同 |
参数 | 不同 | 相同 | 均可 |
有无virtual | 无 | 有 | 均可 |
重载:在同一个类中的内部存在,函数名要求相同,函数之间通过返回值类型和参数列表个数及参数列表类型来区分。
重载相关阅读
重写:也称为覆盖。在派生类中重新定义的一个和基类中有相同名称和参数的虚函数。函数必须是虚函数virtual,不能是静态static函数;必须有相同类型、名称和参数列表;访问修饰符可以不同。
重定义:也称为隐藏。当派生类函数与基类函数同名,如果参数不同,则无论有无virtual,基类函数都被隐藏;当派生类函数与基类函数同名,参数也相同时,如果有virtual则是重写,没有virtual时,基类函数被隐藏。
5. 结构体、类
本质区别:struct默认访问权限是public;class默认的访问权限是private。
class还用于定义模板参数,而struct不用于定义模板参数。
6. 联合
- 如果联合中的函数被实现了,则生成编译代码,否则不编译,为了节省内存的一种手段;
- 对于变量,长度选取最大的字节长度,读取类型必须是最近一次存入的类型;
- 可用于数据转换。