基本概念
-
c++语言:
- 概念:面向对象的变成语言,利用抽象语言描述一些事物的共同特性,面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节
- 特点: 封装、继承、多态、唯一
-
如何理解c++的特点
- 封装是将对象的状态(数据)和行为(方法)打包在一起,隐藏对象的内部实现细节,只提供公开的接口让其他对象与之交互。
- 继承是子类继承父类的特性(包括数据和方法),可以理解为特化,即子类拥有父类的所有属性和方法,同时可以添加自己的属性和方法
- 多态是同一个接口,不同的实现,可以是编译时多态(函数重载),运行时多态(虚函数)。运行时多态通过虚函数表实现,允许子类重写父类的方法,在运行时根据对象的实际类型调用相应的方法。
- C++支持两种多态性: 编译时多态性(函数重载进行实现),运行时多态性(虚函数).
- 实现多态三要素:
- 1.必须是公有继承
- 2.基类的方法必须是虚函数
- 3.必须是基类的指针或引用派生类对象
- 唯一是每个对象都是唯一的,即使是使用
=
操作符进行对象复制,也只会创建新的对象,原对象的引用计数不会增加
-
类: 实现面向对象编程的一种结构
-
空类的大小 根据编译器的不同会有不同 大部分为1 有继承关系的情况会有不用结果
-
虚函数 纯虚函数
- 构造函数不能是虚函数
- 虚函数对应一个vtable,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到虚基表
- 虚函数用在信息不全或者不定的时候,构造函数本身作用进行实例的初始化,使用虚函数没有实际意义.
- 析构函数作为虚函数的作用 (析构函数不能为私有)
- 在实现多态时,当一个类被作为基类并且该基类对派生类的对象进行操作,在析构时防止只析构基类而不析构派生类的状况发生。把基类的析构函数设计为虚函数可以在基类的指针指向派生类对象时,用基类的指针删除派生类对象,避免内存泄漏
- 构造函数不能是虚函数
-
-
类与结构体的区别
-
c和c++结构体的区别
- 在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数。
-
C++中的结构体和类
- C++结构体中可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象,可以从别的类继承,也可以被别的类继承,可以有虚函数
- 结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。类中的非static成员函数有this指针,类的关键字class能作为template模板的关键字 即template class A{}; 而struct不可以
-
-
函数重载 函数名相同,参数列表不同.
- 作用:减少函数名个数(仅仅是因函数参数不同,但函数功能算法一样)
- 原理: 编译器编译后,改变函数名(编译之后函数名与自定义函数名不同)
-
函数模板 定义函数形参类型未知
-
函数重载和函数模板区别
- 函数重载和函数模板都采用了静态绑定的方式,实现了编译时的多态性。这意味着在编译阶段,可以根据函数的参数类型来确定调用的具体函数版本
- 函数模板主要用来处理参数类型不同的相同的函数行为
- 函数重写 通过不同的参数组合来实现不同的函数行为
-
模板函数 函数调用 实参有明确类型
-
友元函数
- 友元函数时可以直接访问类的私有成员或保护成员,它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明
-
友元类
- 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的保护成员和私有成员。
- 利用 friend 修饰符,可以让一些普通函数 或 另一个类的成员函数 直接对某个类的保护成员和私有成员进行操作,提高了程序的运行效率;同时避免把类的成员都声明为public,最大限度地保护数据成员的安全。但是,即使是最大限度地保护数据成员,友元也破坏了类的封装性。
-
符号重写
-
符号重写方式
- 类的成员函数方式 —> =,(),[] 和-> 只能用类的成员方式
- 类的友元函数方式 —> <<, >> 只能用友元方式
- . * :: 三元 sizeof 不能重写
-
-
类中static
- static成员变量占用类大小(不占用对象空间),共享于所有对象
- static成员变量 必须在类外通过类名限制初始化
-
类中的const
-
类的const 成员只能采用列表方式进行初始化
-
const 修饰对象,不能修改只读对象的数据成员空间
-
只读函数成员:不能修改对象的数据成员
-
mutable关键字修饰的成员变量能被const 成员函数进行值的修改
-
-
引用 与指针的区别
- 创建时必须初始化 指针不必要
- 不能改变指向的对象 指针可以改变指向
- 变量别名不单独分配内存空间 指针需要内存空间
- 引用只能是一级 指针可以有多级指针
-
const 常量与define 的区别
- define宏是在预处理阶段展开,const常量是编译运行阶段使用。
- const常量有数据类型,而宏常量没有数据类型,仅仅是展开。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误
- const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高
-
explicit关键字的作用就是防止类构造函数的隐式自动转换