C++知识点简单总结

1、面向对象编程的特性
抽象、封装和数据隐藏、多态、继承、代码的可重用性、auto、lambda、list、智能指针

2、过程性编程
面向过程编程:首先要考虑遵循的步骤,然后考虑如何表示这些数据。并不需要程序一直运行,用户可能希望能够将数据存储在一个文件中,然后从这个文件中读取数据。
面向对象编程:首先考虑数据,不仅考虑如何表示数据,还要考虑如何使用数据。

例子:面向过程–蛋炒饭,一起抄;面向对象–盖饭,配料和饭分开做,做好再盖上去

3、类是用户定义类型的定义,类规范由两个部分组成:
类声明:以数据成员的方式描述数据部分,以成员函数的方式描述共有接口

类方法定义:描述如何实现类成员函数。

4、内联函数
其定义位于类声明中的函数自动成为内联函数,也可以在类声明外定义内联函数,但要加上关键字inline

5、类构造函数
专门用于构造新对象,将值赋给它们的数据成员。构造函数没有返回值,构造函数的参数名不能与类成员的相同

6、析构函数
完成清理操作,一般释放内存

7、this指针
当成员函数涉及到两个对象时,在这种情况下可能需要this指针,this指针指向当前调用对象,指向的是地址

8、类如何实现抽象、封装、和数据隐藏
抽象: 类表示人们可以使用类方法的共有接口对类对象执行的操作

数据隐藏: 类的数据成员是私有的,只能通过成员函数来访问这些数据

封装: 实现的具体细节都是隐藏的

9、默认构造函数
默认构造函数是没有参数值或者所有参数值都有默认值的构造函数。拥有默认构造函数后,可以声明对象,而不初始化它。

10、运算符重载
是静态多态种的一种

11、友元函数
通过让函数成为类的友元,可以赋值该函数与类的成员函数相同的权限,即可以访问私有成员。友元函数看作类的扩展接口的组成部分,另外只有类声明决定哪一个函数是友元函数,因此类声明仍然控制了哪些函数可以访问私有数据。没有违反数据隐藏的原则。

12、转换函数
用于强制类型转换,必须是类方法,不能指定返回类型,不能有参数

13、复制构造函数
用于将一个对象复制到新创建的对象中

14、默认复制构造函数
将逐个赋值分静态成员,成员赋值也称为浅拷贝。

15、如果类中包含这样的静态成员,即其值将在新对象被创建时发生变化,则应该提供一个显式复制构造函数来处理计数问题
16、显式复制构造函数
也叫深度复制(深拷贝)

深拷贝和浅拷贝的区别:
浅拷贝复制指针,深拷贝另开辟一块内存空间并将所有数据复制过去
17、类继承
能够从已有的类派生出新的类,而派生类继承了原有类的特征,包括方法。派生类不能直接访问基类的私有成员,必须通过基类的方法进行访问

18、C++有三种继承方式:
公有继承:is-a关系
保护继承
私有继承
若继承方式是public,基类成员在派生类中的访问权限保持不变,也就是说,基类中的成员访问权限,在派生类中仍然保持原来的访问权限;
若继承方式是private,基类所有成员在派生类中的访问权限都会变为私有(private)权限;
若继承方式是protected,基类的共有成员和保护成员在派生类中的访问权限都会变为保护(protected)权限,私有成员在派生类中的访问权限仍然是私有(private)权限。
19、多态公有继承
同一个方法在派生类和基类中的行为不同。方法的行为应却决于调用方法的对象。
有两种方法可用于实现多态共有继承:

在派生类中重新定义基类的方法(重载)
使用虚方法。如果没有使用虚方法,程序将根据引用类型或指针类型选择方法,如果使用了虚方法,程序将根据引用或指针指向的对象的类型来选择方法
20、虚析构函数
确保释放派生对象时,按正确的顺序调用析构函数(先派生类后基类)。

21、静态联编:在编译过程中进行联编
动态联编:编译器必须生成能够在程序运行时选择正确的虚方法的代码

该过程如何实现?

是通过虚函数表来实现的。含有虚函数的类的对象均会多存储一个4字节的虚函数表地址,默认指向其对象所属类的虚函数表,在程序运行时,通过该指针找到对应虚函数表中的函数,从而实现多态。

22、为什么不摒弃静态联编
因为要考虑效率。并不是所有的派生类都重新定义基类的方法,也不需要动态联编,这种情况下静态联编更合理。

23、构造函数不能是虚函数,这是为了按正确的顺序调用构造函数。
如果构造函数是虚函数,创建派生类对象时,将调用派生类的构造函数,而不是基类的构造函数。然后派生类的构造函数将使用基类的一个构造函数,这种顺序不同于继承机制。
友元函数不能是虚函数,因为虚函数必须是成员函数,友元函数不是成员函数

24、纯虚函数:类声明时函数结尾处为"=0",没有函数体{}
抽象基类:类声明中包含纯虚函数。抽象基类将不能创建对象,只能用作基类。

25、派生类从基类那里继承了什么?
继承了公有成员、保护成员、私有成员,但是私有成员不能直接访问

26、派生类不能从基类继承什么?
不能继承构造函数、析构函数、赋值运算符和友元

27、如果派生类没有添加任何数据成员,它是否需要构造函数>
需要,每个类必须有构造函数

28、在什么情况下,派生类需要定义赋值运算符?
如果派生类构造函数使用new运算符来初始化类的指针成员,则应定义一个赋值运算符。更普遍的说,如果对于派生类成员来说,默认赋值不正确,则应定义赋值运算符。

29、为什么按引用传递对象比按值传递对象的效率高
按引用传递对象,可以确保函数从虚函数收益,另外,按引用传递对象可以节省内存空间。按值传递对象的主要优点在于保护原始数据,但是可以将引用作为const类型传递,也可以保证原始数据不被修改。

30、使用explict关闭隐式转换
31、关键字template<class T1, class T2, …>来定义一个模板
函数模板可以重载,只要形参表或类型参数表不同即可

模板的作用:实现代码的可重用性,方便实现几个很相似的函数。实际上在编译时,模板会生成相似但不同的函数(实例化,形参类型替换成实参类型)

函数模板和函数的次序:先找完全匹配的普通函数,在找完全匹配的模板函数,再找自动类型转换后匹配的普通函数。注意:函数模板不进行自动类型转换

32、虚基类的概念
虚基类是为了防止多重继承时,当两条继承类有相同的祖先时,则类中将包含祖先成员的两个拷贝。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值