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返回类型不安全
-
new不需要计算内存开辟的大小(系统计算开辟的大小); malloc需要计算内存开辟的大小(程序人员计算);
博客主要介绍了C和C++的区别,包括标准输入输出、const常量、引用、函数重载、函数默认值、堆区开辟空间等方面。还阐述了C中用malloc()和free()进行内存操作,C++中用new和delete进行内存操作的区别,如开辟内存方式、失败情况、存储区域和返回值等。
593

被折叠的 条评论
为什么被折叠?



