C++与C语言的区别

前言

        本文主要用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.hstdlib.h等)。
  • C++:C++有更丰富的标准库,除了C语言的标准库外,还引入了STL(标准模板库),提供了常用的数据结构(如vectorlistmap等)和算法。

5. 内存管理

  • C语言:C的内存管理主要通过malloccallocreallocfree来进行手动内存分配和释放。
  • C++:C++除了可以使用C的内存管理函数外,还引入了newdelete运算符,用于动态内存分配和释放,这些运算符具有构造和析构对象的功能。

6. 构造函数和析构函数

  • C语言:C不支持构造函数和析构函数,结构体的初始化需要手动完成。
  • C++:C++中的类可以有构造函数(对象创建时自动调用)和析构函数(对象销毁时自动调用),用于对象的初始化和清理工作。

7. 命名空间(namespace)

  • C语言:C不支持命名空间,多个全局变量和函数可能会发生命名冲突。
  • C++:C++引入了命名空间,通过namespace可以将函数和变量组织在一起,避免命名冲突。

8. 模板编程

  • C语言:C不支持模板编程。
  • C++:C++引入了模板,可以编写泛型函数和类,支持代码重用和类型安全。例如,模板可以实现类型无关的函数和容器。

9. 异常处理

  • C语言:C没有内置的异常处理机制。错误处理通常通过返回错误码或者设置全局变量来完成。
  • C++:C++支持异常处理机制,通过trythrowcatch块来处理运行时错误,使得代码更加清晰和健壮。

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)
{}
//函数重载

函数名相同,函数个数不一致,在调用函数的时候就不会出现错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值