C++相比于C语言增加了哪些概念?
作者 | 将狼才鲸 |
---|---|
创建日期 | 2025-06-17 |
- CSDN阅读地址:C++相比于C语言增加了哪些概念?
- Gitee源码目录:qemu/demo_代码示例/02_C++_Class
-
目标受众:熟悉C语言,对C++完全不了解,但又想熟悉一下C++语言的人;
-
参考网址:
- 【C/C++语言】class的定义和基础用法
- C++相比于C语言增加的8个小特性(详解)
-
C++虽然是面向对象的,但是它的第一个函数,main()函数却是和C语言一样面向过程的;
-
基础概念:
- 类 Class:例如声明一个Class Demo;类似于C语言中的结构体;声明表示还没有创建实体,不占内存;
- 私有变量 private:类似于C语言模块内部static全局变量;
- 公共变量 public:类似于C语言模块中接口函数;
- 构造函数:Demo (int aa) {a = aa;} 定义类时会自动执行的初始化函数,C语言中没有此概念;
- Demo(int aa = 100): a(aa) {} 可以直接用默认值初始化;
- 构造函数中: 冒号后面的a(aa) 类似于函数的这种模式其实并不是函数,而只是赋值,类似于aa = a;
- 析构函数,~Demo:同上,在类被delete时自动调用;
- Class声明中直接实现函数: void geta(int b) {a = b;} 类似于C语言.h头文件中的inline内联函数;
- 友元函数 friend:稍微突破模块化的结构;类似C语言中的全局变量和全局函数;
- 可以简单的理解为即使定义了多个类,但里面每个类中执行友元函数都是执行的同一个全局接口函数;
- 在类外未定义该类时也能直接调用类里的函数,而该函数不能操作Class里面的局部变量;
- 命名空间 namespace和两个冒号::的操作符:using namespace std; std::cout 一组类组成的模块集合,并且里面有些函数是无需定义和初始化就能直接使用的;同时命名空间也可以用来避免命名冲突;
- 域的概念:可以把一个.cpp文件就当成一个域,类似于把一个.c文件当成一个模块;
- 基类派生类引用转换(父类和子类):static_cast;类似于C语言中各种结构体入口地址的计算和结构体变量类型强制转换;
- 数据类型转换:例如
static_cast<float> a;
其中a变量是double类型;static_cast<float> a
就类似于C语言中的(float)a; - 引用&:可以简单的将其当成C语言中的指针*,但是它们还有些不一样,需要在实际使用中慢慢体会;
- func(Demo &d); d.a; 使用引用的元素时,它的元素调用不用->,而使用. 和C语言中有点不一样;
- 引用在定义时必须同步初始化,类似于C语言中不允许出现野指针,指针必须要赋分配以后的初值;
- 引用初始化后不能再更改对象,而指针可以指向这个指向那个,也可以自增自减等;
- 操作符重载 operator+ =等:例如实现两个类的加减乘除运算等;
- this->:在类的实现函数中要调用自己类的其它变量时,使用this->;
- 派生:使用:冒号派生成子类,类似于C语言中结构体内嵌套结构体,被嵌套在内部的是父类,外面更大的结构体是子类;
- 与C语言不同的是,子类不光继承了父类,还可以改写和重载父类中的函数(C++中称为方法);
- 继承:父类的初始化方法或函数在子类中能直接用,这叫继承;
- 多继承,一个子类可以包含多个父类;
- 三大类型(封装、继承、多态):把一个Class当成一个全私有的结构体,要读写变量只能通过调用函数来实现,这就是封装;
- 父类(基类)中的函数可以被子类(派生类)重写或重载,这个就叫多态;
- 虚类型 virtual:因为子类中经常会重载父类中的函数,所以干脆父类中把可能会重载的函数加上virtual 来指明,有时甚至自己干脆都不实现了;
- 类的定义 new:可以直接Class AA{}; AA a; 也可以AA *p_a = new AA; 需要有个概念是new一个类时里面的构造函数会自动运行,这和C语言很不一样;
- 名词概念:类中的内容称为类的成员,变量称为类的属性或成员变量,类中的函数称为类的方法或者成员函数;因此,忘掉C语言中的全局变量、私有变量、函数的概念,开始使用属性和方法;
- protected:和private私有类似;
- 类的实例化:用类创建对象,类似于C语言中的定义(与定义相对应的就是声明);
- 类空间的释放 delete:
- auto变量:自动识别数据的类型;
- 增加nullptr空指针关键字;
- 异常处理:try、catch、throw
- 泛型编程,模板template:
- template ,有模板函数和模板类;类似于C语言中用宏定义拼接生成多个类似的结构体;
- 模板需要被实例化;
- 标准模板库(STL):容器vector、list等,迭代器iterator等
- Lambda 表达式:auto func = [](int x) { return x * x; };
- explicit关键字:用于修饰单参数构造函数或转换构造函数,禁止编译器进行隐式类型转换,避免意外的行为