C语言和C++是两种密切相关但又有明显区别的编程语言。C++是在C语言的基础上发展起来的,它不仅完全兼容C语言,还增加了面向对象编程、泛型编程等特性。
-
C语言与C++的区别:
- C语言是一种过程式编程语言,而C++是支持多范式编程的语言,包括过程式编程、面向对象编程和泛型编程。
- C++支持类和对象,提供了封装、继承和多态等面向对象的特性。
- C++支持模板,允许泛型编程。
- C++支持异常处理。
- C++支持新的数据类型,如bool、wchar_t等。
-
面向过程与面向对象的区别:
- 面向过程强调的是函数和过程,程序由一系列函数调用组成。
- 面向对象强调的是对象和消息,程序由对象的交互组成。
- 面向对象提供了更好的代码复用性和模块化。
-
C++新语法(存储结构):
- 引用:引用是某个已存在变量的另一个名字,它本身不占用内存空间。
- 特点:引用必须在定义时被初始化,一旦初始化后不能改变其指向。
-
右值引用(C++11特性):
- 右值引用允许程序员直接操作即将销毁的对象的资源,常用于移动语义和完美转发。
-
引用与指针的区别:
- 引用是某个变量的别名,一旦初始化后不能改变其指向。
- 指针是一个变量,存储了另一个变量的地址,可以改变其指向。
-
引用数组:
- 数组的引用实质上是一个指向数组首元素的指针。
-
bool类型:
- bool是C++中新增的数据类型,用于表示布尔值true和false。
语法规则:
- 命名规则:标识符只能包含字母、数字和下划线,且不能以数字开头。
- 作用域:
- 函数原型作用域:函数原型中定义的变量仅在该函数原型中可见。
- 局部作用域:在函数内部定义的变量仅在该函数内部可见。
- 类作用域:在类中定义的成员仅在该类内部可见。
- 命名空间作用域:在命名空间中定义的名称仅在该命名空间中可见。
- 作用域与可见性问题:作用域决定了变量的可见性和生命周期。
- 关键字使用:
- extern:用于声明全局变量或函数,可以被多个文件共享。
- static:用于声明局部静态变量或静态成员变量,其生命周期贯穿整个程序。
重载:
- 重载:函数名相同,但参数列表不同。
- 重写:派生类中重写基类的虚函数。
- 友元:友元函数或友元类可以访问类的私有和保护成员。
- 函数重载:在同一个作用域内,函数名相同但参数列表不同。
- 二义性问题:当函数调用不明确时,编译器无法确定调用哪个函数。
- 运算符重载:
- 友元运算符重载:作为类的友元函数重载运算符。
- 成员函数运算符重载:作为类的成员函数重载运算符。
- 不可重载的运算符:如
.
、::
、.*
和?:
等。
函数默认参数:
- 语法:在函数定义时为参数指定默认值。
- 特性:简化函数调用。
- 二义性问题:当函数调用可以匹配多个重载版本时,会产生二义性。
内联函数:
- 声明形式:使用
inline
关键字声明。 - 工作原理:在编译时将函数体插入到每个调用点,减少函数调用的开销。
- 递归:内联函数通常不用于递归,因为递归会增加代码体积。
面向对象:
- 封装:将数据和操作数据的函数组合在一起,隐藏内部实现细节。
- 继承:允许新类(派生类)继承现有类(基类)的特性。
- 多态:允许不同类的对象对同一消息做出响应。
封装:
- 类与对象:类是对象的蓝图,对象是类的实例。
- 类的语法体系:定义了如何声明类、成员变量和成员函数。
- 抽象的过程:将复杂性隐藏在接口后面。
- 封装过程:通过访问修饰符(public、private、protected)控制对类成员的访问。
- 访问权限:控制成员的可见性和访问性。
封装::语法::函数:
- 构造函数:初始化对象的特殊函数。
- 拷贝构造:
- 使用场景:当需要通过一个对象来初始化另一个对象时。
- 深拷贝:逐个复制对象的每个成员。
- 浅拷贝:仅复制对象的指针或引用。
- 析构函数:清理对象使用的资源。
对象:
- 对象的大小:取决于对象中成员变量的大小和对齐。
- 空类对象大小:通常为1字节,以确保不同的类类型。
- 无名对象:通常用于临时对象,不占用额外内存。
类::成员:
- 静态(static)成员:被同类所有对象共享。
- 静态成员的生命周期:从程序开始到程序结束。
- 静态成员的调用规则:通过类名直接访问。
- 常成员:只读成员。
- 常数据成员:通常与初始化列表一起使用。
- 初始化参数列表:在构造函数中初始化成员变量。
- 常函数成员:使用
const
修饰的成员函数。 - this指针:指向当前对象的指针。
类的组合:
- 类的组合:一个类包含另一个类的对象。
- 构造函数的调用顺序:先调用成员对象的构造函数,再调用包含类的构造函数。
模板:
- 函数模板:允许编写与数据类型无关的函数。
- 类模板:允许编写与数据类型无关的类。
- 非类型模板:模板参数可以是非类型参数。
- 标准模板库STL:提供了一套通用的模板类和函数。
标准模板库:
- 六大组件:容器、迭代器、算法、仿函数、适配器、空间配置器。
- 容器及使用:如
vector
、list
、map
等。 - 迭代器:提供了一种访问容器中元素的方法。
- 空间配置器及其使用:管理容器的内存分配。
- 算法:如排序、搜索等。
- 仿函数:允许函数作为参数传递。
- 适配器:如迭代器适配器、函数适配器等。
容器:
- 序列式容器:
vector
:动态数组,存储连续的元素。deque
:双端队列,可以高效地在两端插入和删除。list
:双向链表,可以高效地在任意位置插入和删除。
- 关联式容器:
set
:有序集合,不允许重复。multiset
:无序集合,允许重复。map
:键值对集合,键唯一。multimap
:键值对集合,键可以重复。
继承:
- 什么是继承:一种创建新类的方式,新类继承现有类的属性和方法。
- 继承的特性:传递性、不对称性。
- 继承的分类:单继承、多继承。
- 基类成员调用的函数的二义性问题:当派生类和基类有同名函数时。
- 菱形继承:一个类继承了两个有共同基类的类。
- 解决菱形继承:使用虚继承。
- 不可被继承:构造函数、拷贝构造函数、析构函数、友元、静态成员。
- 继承方式:public、private、protected。
- 继承后的访问权限:继承方式决定了成员在派生类中的访问权限。
- 继承的构造、析构顺序:先调用基类的构造函数,后调用派生类的构造函数;析构顺序相反。
- 继承与组合类:构造函数的顺序。
- 模板的继承:模板类可以被继承。
- 基类的静态成员被继承的特性:不可被继承,但可以被派生类对象共享。
- 类型兼容性原则:派生类对象可以被当作基类
作者:
hwaityd
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通