【C++总览】
基础篇
C/C++的区别
面向对象三大特性:封装、继承、多态
封装:
封装是指将数据和操作这些数据的方法捆绑在一起,形成一个类。封装的核心思想是隐藏对象的内部实现细节,只暴露必要的接口给外部使用,保护数据的安全性和完整性。
- 数据隐藏:通过控制类的成员的访问权限,避免外部直接访问或修改类的内部状态。
- 接口暴露:只通过公开的方法来访问和修改类的内部数据。
继承:
继承是指子类可以继承父类的属性和方法。子类可以扩展或修改父类的功能,从而实现代码的重用和层次化结构。
- 父类(基类):包含通用的属性和方法。
- 子类(派生类):继承父类的属性和方法,增加特有的功能或修改父类方法。
多态:
多态是指同一个方法在不同的对象上有不同的表现。它允许不同的对象通过相同的接口来调用不同的实现。多态通过方法重写和方法重载来实现。
- 方法重写:子类重新定义父类的方法,实现不同的行为。
- 方法重载:同一个方法名根据参数的不同实现不同的功能。
面向过程与面向对象的区别
结构体与类的比较
指针与引用的区别
- 指针是一个变量,存储另一个变量的地址。引用是对一个已经存在的变量起别名,不单独占用内存空间。
- 指针可以多级,引用只有一级
- 指针可以不初始化,引用必须初始化
- 指针指向可变,引用不可变
- 指针可以为空,引用不能为空
- 对指针sizeof得到4或8,对引用sizeof得到引用对象所占大小
C++关键字
const
用来修饰函数、变量、对象,const在有些情况下是编译时确定,有些情况下是在运行时确定。
const与constexpr的区别
constexpr一定是在编译时确定。。。
static
static 类内
static 修饰成员属性:
1.不依赖对象,类共用的,不可以被继承(继承得到的是拷贝的一份属性,而静态成员只有一份,对象之间共享,所以不能继承),需要在类外初始化。
2.不能在.h文件初始化(重定义的问题),要在.cpp文件初始化。
static 修饰成员函数:
没有this指针,可以不依赖对象使用,类共用的,不可以声明为虚函数,不能直接调用类中的非静态成员,可以利用对象调用。
static 类外
static 修饰类外函数:
只能在当前文件可见,不支持extern。
static 修饰类外变量:1.只能在当前文件中可见。
2.一旦初始化后,生命周期贯穿整个程序的运行过程,并且只会初始化一次。
virtual
修饰虚函数,实现动态多态。父类是虚函数时,子类同名的成员函数默认是虚函数。
哪些函数不能被virtual修饰?
构造 static inline friend 类外的普通函数
inline
注:构造、析构函数可以是内联的,虚析构不能是内联。
friend
纯虚函数
operator重载操作符
自定义实现赋值重载操作符(如果不手动实现,编译期默认提供operator=函数,是浅拷贝)
1.浅拷贝
class A
{
private:
int val;
public:
A& operator = (const A& a)
{
//判断异常,查看a是不是当前的对象
if (this == &a)return *this;
//浅拷贝情况
this->val = a.val;
return *this;
}
};
int main() {
A a1;
A a2;
a1 = a2;
a1 = a1;
}
2.对于含有指针成员的情况,考虑深拷贝
class A
{
private:
int* val;
public:
A()
{
val = new int;
}
A& operator = (const A& a)
{
//判断异常,查看a是不是当前的对象
if (this == &a)return *this;
//释放当前对象的旧内存(如果有)
delete val;
//为当前对象分配新的内存
val = new int(*a.val);
return *this;
}
~A()
{
delete val;
}
};
类
访问权限
构造函数
在手写智能指针时用到了浅拷贝。
拷贝构造
初始化列表
虚指针的初始化也是在初始化列表中完成。
析构函数
类与类
类之间的关系
在我之前的文章:类之间的横向关系
多态
静态多态
是编译时确定的(具体执行什么函数),可以通过函数重载、函数模板实现。
动态多态
通过继承和虚函数实现。只有程序运行的时候,才能确定具体执行什么函数。
动态多态优缺点
优点:代码不变,功能可变,具有良好的拓展和复用性
缺点:
1.空间消耗,运行效率会相对低一些,破坏封装
2.虚函数多态没有办法调用子类特有的虚函数
重载、重写、隐藏
重载:相同作用域下,函数名相同,参数列表不同(个数或类型),返回值可同可不同。
重写(覆盖):指子类实现了和父类虚函数相同的函数,包括函数名,参数列表以及返回值。
隐藏:子类中包含父类中的同名函数(返回值、参数列表不做要求),用子类对象调用时,会调用子类中的同名函数。如果想调用父类的同名函数,需要加父类作用域。无法通过父类指针指向子类对象调用子类的同名函数。
虚指针与虚表
C++11
在我之前的文章:C++11知识点
设计原则
在我之前的文章:设计原则
设计模式
在我之前的文章:设计模式
STL
在我之前的文章:C++之STL
多继承
在我之前的文章:C++之多继承
虚继承
在我之前的文章:C++之虚继承
内部类
在我之前的文章:C++之内部类