前言
本文主要用C语言和C++做对比来学习C++,便于个人理解。C++包含C语言,是对C语言的扩展,在C++中,支持C语言的语法使用,C++是C语言的超集
一、C++与C语言的区别
- C语言简单高效,适合低级系统编程和硬件相关的开发。
- C++更加灵活、强大,适合大型项目开发,尤其是需要面向对象、代码复用和复杂数据结构的应用。
1. 编程范式
- C语言:C是一种过程式编程语言,主要关注函数和过程。程序是通过一系列函数调用来执行任务的。
- C++:C++支持多种编程范式,最主要的是面向对象编程(OOP),同时也支持过程式编程。C++引入了类、对象、继承、多态、封装和抽象等OOP概念,使得代码可以更具模块化和可重用性。
2. 类和对象
- C语言:C不支持面向对象编程,没有类和对象的概念。
- C++:C++支持类和对象,允许开发者创建自定义的数据类型,进行更高级别的抽象和封装。
3. 函数重载和运算符重载
- C语言:C不支持函数重载或运算符重载,函数名必须是唯一的,运算符功能是固定的。
- C++:C++允许函数重载(同名函数可以有不同的参数)和运算符重载(例如,可以定义“+”来用于两个自定义对象之间的加法操作)。
4. 标准库
- C语言:C的标准库较为基础,主要提供了一些与输入输出、字符串处理、数学计算等相关的函数(如
stdio.h
,stdlib.h
等)。- C++:C++有更丰富的标准库,除了C语言的标准库外,还引入了STL(标准模板库),提供了常用的数据结构(如
vector
,list
,map
等)和算法。5. 内存管理
- C语言:C的内存管理主要通过
malloc
,calloc
,realloc
和free
来进行手动内存分配和释放。- C++:C++除了可以使用C的内存管理函数外,还引入了
new
和delete
运算符,用于动态内存分配和释放,这些运算符具有构造和析构对象的功能。6. 构造函数和析构函数
- C语言:C不支持构造函数和析构函数,结构体的初始化需要手动完成。
- C++:C++中的类可以有构造函数(对象创建时自动调用)和析构函数(对象销毁时自动调用),用于对象的初始化和清理工作。
7. 命名空间(namespace)
- C语言:C不支持命名空间,多个全局变量和函数可能会发生命名冲突。
- C++:C++引入了命名空间,通过
namespace
可以将函数和变量组织在一起,避免命名冲突。8. 模板编程
- C语言:C不支持模板编程。
- C++:C++引入了模板,可以编写泛型函数和类,支持代码重用和类型安全。例如,模板可以实现类型无关的函数和容器。
9. 异常处理
- C语言:C没有内置的异常处理机制。错误处理通常通过返回错误码或者设置全局变量来完成。
- C++:C++支持异常处理机制,通过
try
,throw
,catch
块来处理运行时错误,使得代码更加清晰和健壮。10. 引用(reference)
- C语言:C只支持指针,不支持引用。
- C++:C++引入了引用类型(reference),是一种更安全且更简洁的传递对象的方式,可以避免指针的一些常见错误(如空指针或指针操作中的内存泄漏问题)。
11. 兼容性
- C语言:C是C++的子集,大部分C语言代码可以直接在C++中运行。
- C++:C++是C的超集,但C++的一些特性(如类、模板等)在C中不可用。
12. 代码复杂性与应用领域
- C语言:C的语法较为简单直接,适用于系统级编程,如操作系统开发、嵌入式系统、驱动程序等领域。
- C++:C++功能更为复杂,适用于大型软件开发、游戏开发、高性能应用、GUI应用程序等。
二、C++中的各种用法
1、const用法
在C语言中呢,我们使用const修饰值,表示这是一个不可更改常量,但是我们在C++中,const的用法和C语言中的#define用法一致,用来做宏定义
#include<stdio.h> const int num=10; int main(int argc, const char *argv[]) { int a; int b[num+1]; b[num]=3; printf("hello c++\n"); printf("num=%d\n",num); printf("b[num]=%d\n",b[num]); return 0; } /*输出: hello c++ num=10 b[num]=3 */
2、引用
1、引用变量
引用:取别名,对原变量(数据),取一个别名,使用别名就是使用原变量名
引用只能对变量名字进行引用,引用名也表示原变量名
注意:引用需要与原变量的类型进行匹配
引用定义:必须初始化,必须引用一个变量名,不能空着,之后都是使用引用变量,不能再取别名 引用类型 & 引用名 = 变量名; // 引用类型 需要和 变量名匹配 如: int a; int & t_a = a;
2、引用常量(右值引用)
在11版本中
右值引用:对常量的引用,给常量取个别名,别名就可以代表这个常量数据
(使用别名就使用数据,作为变量进行使用,别名就是变量名)
#include<cstdio> //引用 int sum(int &&a,int &&b) { return a; } int main(int argc, const char *argv[]) { int a=10; printf("a=%d\n",a); //定义引用变量 int & t_a=a; t_a=20; printf("t_a=%d\n",t_a); int &&b=sum(1,2); printf("b=%d\n",b); return 0; }
3、函数默认参数
在C语言中,我们每次调用函数参数都得使用地址传递参数,但是在c++中,我们可以直接将函数的参数设置为默认值,如果在函数中不加参数,则使用默认参数,如果加入参数则使用加入的参数,这一点和python比较像,但是为了确保不会有二义性,在声明定义函数添加默认值时,需要从最后一个参数往前添加;在调用有默认值的参数时,添加实参从第一个依次往后添加;
4、内联函数
在C语言中,我们在main函数中调用函数时,要先跳转到调用的函数中,才能执行该函数,在跳转过程中会消耗时间,虽然很短,但是对于计算机来说还是很长的,因此我们就说在C++中引入了内联函数的概念,缩短程序运行的时间,使用内联函数就是在定义函数的时候在前面加入一个关键字online,来表示这是一个内联函数,当我们在主函数中调用内联函数时,不会跳转到该函数中执行,而是直接在主函数中将内联函数展开,大大缩短了程序运行时间,但是注意,如果在调用的函数中使用了循环,那么我们将这个函数设置为内联函数有些多余了,我们使用循环时,程序的运行时间和跳转的时间相比,跳转的时间可以忽略不记,使用加入内联函数没有必要。
5、函数重载
我们知道,在C语言中,不支持函数名重名,但是在C++中却支持函数名重名,但是这个重名有条件限制,否则还是无法区分函数。
在C++中,如果我们定义了多个相同的函数名,那么这些函数名的参数个数和参数类型一定是不能相同的,不然还是会出现错误。
例如:
int add(int a,int b) {} int add(int a,int b,int c) {} //函数重载
函数名相同,函数个数不一致,在调用函数的时候就不会出现错误