C语言和C++的区别

1.函数的默认参数

C++允许给参数赋默认值,C语言不允许
函数调用的时候会有压栈开销,参数一般是从右向左压参

int  sub(int a = 10,  int b)			//错误
int sub(int a, int b = 10);			//正确

注意:

int sub(int a, int b = 10);	
int  sub(int a = 10,  int b)		

这种声明很熟的情况也是可以的
C++允许有缺省参数,但是必须是从右往左,依次填写,不能跳跃

2.inline

在C++ 中inline代替了宏,但是宏是在预编译阶段进行展开的,inline函数是在编译阶段进行展开的,宏没有类型安全检查,内联函数有类型安全检查。
inline函数和普通函数的区别:inline函数的声明和实现放在一起,一般放在头文件中,在编译的时候回在调用的地方展开,不存在重定义,不会生成符号表。
inline函数一般具有的特点是:

  • 函数体小
  • 递归函数不能是inline函数
  • inline函数只是一个建议
  • 在debug版本下不起作用,release版本下起作用
  • 不会生成符号表,没有调用函数栈帧的开销

3.函数重载

这主要是与命名修饰规则有关,C语言只考虑函数名,C++考虑函数名,参数类型。参数个数。

  • 静多态:函数的重载、模板
  • 动多态:继承中的多态(虚函数)
#include <iostreaaam>
using namespace std;

int sum(int a, int b)
{
	return a +b;
}

double sum(double a, double b)
{
	return a + b;
}

int main()
{
	//sum(int a, int b);
	sum(1, 2);
	sum(1.0, 2.0);
	return 0;
}

两个sum构成了重载,可以通过编译,分别调用了两个sum函数,但是当在main函数里面生命了第一个函数的时候,会说double类型转化成int类型会损失精度,可以搜索的时候现在局部作用域中先搜索。
函数的重载实现是依赖于命名修饰规则,必须是在同一作用域下的才是重载

4.const

C语言中被const修饰的变量,具有常属性,但是不是常量,不能单做左值引用,可以不初始化,但是最后就不能在初始化,不能当做数组的下标,可以通过指针修改。
C++中被const修改的变量,就是一个常量,必须初始化,可以通过指针修改。
C语言中是只读常量,C++中是真正的常量

5.引用

引用没有创建新的变量,只是给变量起了一个别名,可以操作变量,
引用和指针在底层的实现是一模一样的。

6.内存管理

C语言申请内存和释放内存用的是malloc、free
C++ 用的是new、delete
operator new封装了malloc 抛异常
new封装了operator new 调用构造函数

malloc->operator new -> new

抛异常调用构造和析构函数

7.命名空间

C语言作用域有全局作用域、局部作用域
C++有全局作用于、局部作用域、命名空间(namespace)

C语言C++在多个方面存在区别: - **编程思想**:C语言是面向过程的,如同按步骤做菜;C++则结合了面向对象泛型编程思想,可理解为定义厨师菜谱[^1]。 - **文件扩展名**:C语言源文件扩展名是 `.c`;C++源文件扩展名有 `.cpp`、`.cc` 等,头文件扩展名有 `.hpp` 等,文件后缀不同[^1]。 - **Hello World示例**:C语言使用 `printf("Hello")` 输出;C++使用 `cout << "Hello"` 输出,C语言用函数,C++用对象[^1]。 - **内存管理**:C语言使用 `malloc` `free` 进行内存分配释放;C++除了使用 `new` `delete` 外,还有智能指针,C++的内存管理更安全方便[^1]。 - **函数特性**:C语言不支持函数重载;C++支持函数重载,即同名函数可以做不同的事[^1]。 - **数据结构**:C语言主要使用结构体(`struct`);C++使用类(`class`),类相当于结构体加上方法,可看作是给结构体“添加技能”[^1]。 - **标准版本**:常用的C语言是C89标准,C++C++99标准,如今最新的是C11C++11标准,不同标准功能有所不同,且越新的版本支持的编译器越少[^2]。 - **命名空间**:C语言只有一个全局作用域,标识符可能发生冲突;C++引入了命名空间(名字空间),通过命名空间将全局作用域分成不同部分,不同命名空间里的标识符可以相同[^3]。 ### 代码示例 #### C语言 ```c #include <stdio.h> #include <stdlib.h> // 定义结构体 struct Person { char name[20]; int age; }; // 分配内存 void allocate_memory() { struct Person *p = (struct Person *)malloc(sizeof(struct Person)); if (p != NULL) { free(p); } } int main() { printf("Hello\n"); allocate_memory(); return 0; } ``` #### C++ ```cpp #include <iostream> #include <memory> // 定义类 class Person { public: char name[20]; int age; void print_info() { std::cout << "Name: " << name << ", Age: " << age << std::endl; } }; // 分配内存 void allocate_memory() { std::unique_ptr<Person> p = std::make_unique<Person>(); } int main() { using namespace std; cout << "Hello" << endl; allocate_memory(); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值