1.C和C++的区别

博客主要介绍了C和C++的区别,包括标准输入输出、const常量、引用、函数重载、函数默认值、堆区开辟空间等方面。还阐述了C中用malloc()和free()进行内存操作,C++中用new和delete进行内存操作的区别,如开辟内存方式、失败情况、存储区域和返回值等。

C和C++的区别

1.标准输入输出的区别

C语言中:标准输入输出流头文件是#include<stdio.h>
		标准输入用scanf()函数;标准输出用printf()函数;
C++中:标准输入输出流头文件是#include<iostream>
	   再加上名字空间作用域 using namespace std;
	   标准输入用cin>> ;标准输出用cout<<; 
eg:
	int a;
	char ch;
	scanf("%d,%c",&a,&ch);  <==> cin>>a>>ch;
	printf("a=%d ch=%c\n",a,ch); <==> cout<<"a="<<a<<"ch="<<ch<<endl;

2.const(常量的区别)

C语言中:const修饰的变量为:常变量
		常变量的处理规则在编译阶段,查询常变量是否做左值
		(如果做左值,就发生错误;如果没有做左值,那么处理规则和变量相同)。
C++中:const修饰的变量为:常量
	   常量的处理规则在编译阶段,用到常量的地方替换成常量
	   1.一定要初始化
	   2.不允许修改-》1.不允许直接访问(看常量是否做左值)
					 2.不允许间接访问(杜绝间接修改常量的风险)
eg:
int main()
{
	const int a = 10;
	int b = 0;
	int *p = (int *)&a;
	*p = 100;
	b = a;
	cout<<"a="<<a<<"b="<<b<<"*p="<<*p<<endl;
	return 0;
}
在编译时会发生替换变成下面:
int main()
{
	const int a = 10;
	int b = 0;
	int *p = (int*)&a;
	*p = 100;
	b = 10;
	cout<<"a="<<a<<"b="<<b<<"*p="<<*p<<endl;
}

3.引用的区别:
在这里插入图片描述

引用是C++中的新概念   &     //别名、外号
int a = 10;
int &b = a;
//b是引用,相当于给a起了一个别名b
引用的特点:1.一定要初始化
		   2.没有所谓的空引用
		   3.没有引用的引用(不能引用取地址的数据)
		   4.引用不能改变
引用的应用:
eg:
	c中:
	void Swap_Int(int *pa,int *pb)
	{
		int tmp = *pa;
		*pa = *pb;
		*pb = tmp;
	}//这种是通过间接方式改变
	c++中:
	void Swap_Int(int &a,int &b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}//这种是通过改变形参直接改变实参
	//引用比指针方便

4.函数重载

c中:区别函数靠函数名区分
c++中:区别函数靠返回值类型、函数名、参数列表(参数类型和参数个数和参数顺序)区分
函数重载的三要素:同名、不同参、同作用域

5.函数的默认值:

在c中不可以给函数形参设置默认值;
在c++中:
	形参有默认值,无实参,就用默认值
	1.定义函数时,可以带默认值,但要从右向左依次带默认值,不能间隔或跳跃的给默认值;
	2.调动函数时,实参要从左向右依次赋予;(实参和形参匹配顺序:自左向右)
	3.默认值不能重复赋予;
	4.默认值一般附在声明上。

6.堆区上开辟空间:

c语言中:开辟:malloc()函数
		销毁: free()函数
c++中:开辟:new关键字
		销毁:delete关键字
eg:
int *p = (int*)malloc(sizeof(int));//c
int *p = new int;//c++;还可以进行初始化//int *p = new int(10);

free(p); p = NULL;//c
delete p; p = NULL;//c++
开辟数组时:
int n;
cin>>n;
int *p = (int *)malloc(sizeof(int)*n);//c
int *p = new int[n];//c++
free(p); p = NULL;//c
delete []s;//c++

new/delete的区别:

C中:动态开辟内存 malloc() 函数开辟;free()函数释放。
malloc()函数原型:void* malloc(size_t size);(返回值类型不安全)开辟内存时有可能越界也有可能资源浪费。
eg:

	int *p = (int*)malloc(sizeof(int));
	*p = 20;
	free(p);

C++中:new关键字开辟内存;delete关键字释放内存

eg:

	int *p = new int;
	*p = 20;
	delete p;

1.动态开辟内存

(1). new 不仅能开辟内存,还能做初始化
	eg: int *p = new int(10);
	
	malloc函数只是单纯开辟内存
(2).new动态开辟一个数组,可做零初始化
	eg: int *p = new int[20];
	delete[] p;
	int *p = new int[20]();//给数组做了零初始化

	malloc()对其做不了初始化
(3).开辟二维数组
	c++中new动态开辟二位数组
		int **p = new int*[10]();
		for(int i = 0; i < 10; i++)
		{
			p[i] = new int [10]();
		}
	c中malloc动态开辟二维数组
		int **p = (int **)malloc(sizeof(int*)*10);//先开辟出二维
		for(int i = 0; i < 10; i++)
		{
			p[i] = (int*)malloc(sizeof(int)*10);//再给每个二维把相对应的一维数组开辟出来
		}

2.开辟内存失败

new内存开辟失败
	会抛出异常(异常处理机制)
malloc内存开辟失败
	会返回NULL

3.存储区域

	new开辟的内存块在自由存储区域	
	
	malloc开辟的内存块在堆上

4.返回值

new返回类型安全
malloc返回类型不安全
  1.  new不需要计算内存开辟的大小(系统计算开辟的大小);
     malloc需要计算内存开辟的大小(程序人员计算);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值