C++和C的一些差异
C语言是一种面向过程的语言,而C++是面向对象,C++在语法上比C语言更加严谨,下面我们列出一些他们之间的差异。
1.const修饰变量的差异
我们知道const修饰的变量往往意味着他的值无法被修改!但是在C语言中我们仍然可以使用指针来改变,看看下面这段代码在C语言中和在C++环境中编译结果有何差异。
#include <stdio.h>
int main()
{
const int a=5;
int *p=&a;
*p=10;
printf("a=%d\n",a);
}
运行结果如下图:可以发现虽然出现了警告但是运行后a的值发生了改变,可以看出C语言在一些语法上是不严谨的
那如果在C++环境下呢:可以看到我们编译器直接报了错误
2. define:在C语言中我们使用define来定义一些常量,但是在C++中一般不使用define而使用const
3.引用
引用也可以理解为给变量起别名,它有两种功能。
1.作为参数:形参改变就是实参改变(相当于直接操作实参本身,并没有进行赋值开辟新的形参地址空间)
2.作为返回值:返回的是变量本身而不是变量的值
例:
int a=5;
int &b=a;(a,b的地址都是一样的,b又可以叫a的别名)
还记得在C语言中我们要写一个函数来实现变量值的交换我们是怎么做的吗?我们使用了值传递,将变量的地址传给函数形参的指针变量来实现,而在C++中我们还可以使用引用来实现这个功能
代码如下:
#include <stdio.h>
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main(int argc,char* argv[])
{
int a,b;
a=5;
b=6;
printf("a=%d b=%d\n",a,b);
swap(a,b);
printf("a=%d b=%d\n",a,b);
}
运行结果如下:我们实现了交换的功能
如果引用作为函数返回值又会如何呢?让我们看看下面这段代码:我们函数返回值类型是int&,这说明我们返回的是变量而不是一个值,怎么检验我们的结论呢,我们在主函数中对返回值进行赋值如果返回值是一个值那么对他进行赋值操作就是错误的,反之正确
#include <stdio.h>
int& setval(int &a)
{
a=10;
return a;
}
int main(int argc,char* argv[])
{
int a;
a=5;
printf("a=%d\n",a);
setval(a)=10;
printf("a=%d\n",a);
}
让我们看看结果:我们的结论是正确的!
4.函数重载
在C语言中我们知道不同的函数,名字是不能重复的,但是在C++中我们可以使用相同的函数名,但是他的类型和参数不同
1.行为相似,但是逻辑不同使用重载。
2.行为相同,逻辑相同使用模板。
我们来看一段代码理解一下什么是重载:
#include <stdio.h>
int add(int a, int b)
{
printf("111111\n");
return a + b;
}
int add(int a, int b, int c)
{
printf("2222222\n");
return a + b + c;
}
double add(int a, double b)
{
printf("33333333\n");
return a+b;
}
int main()
{
int a = 1,b = 2,c = 3;
double d = 4.13,e = 3.14;
/*
第一个和第二个是参数的个数不同
第一个和第三个是参数的类型不同
他们都会自动匹配调用相应的函数
*/
add(a,b);
add(a,b,c);
add(a,d);
}
5.默认参数
默认参数只能写在函数声明中:
传参只能从左往右
默认参数一定是从右到左
注意:重载和默认参数可能会发生冲突!!!注意避免
看看代码:
#include <stdio.h>
int add(int i, int j = 2, int k = 3);
int add(int i, int j);
int add(int i, int j, int k)
{
return i + j + k;
}
int add(int i, int j)
{
return i + j;
}
int main()
{
int i = 5, j = 6;
printf("%d\n", add(i));
//add(i,j) 这里不知道是使用三个参数的还是使用两个的所有会有歧义
}
6.空指针
C中NULL代表空指针,是0地址,不仅可以赋值给指针变量
C++中用nullptr代指无效指针,只能赋值给指针变量!
7.mutable修饰的变量可以被更改(主要用于对象类),不能和const,static直接连用。
8.内敛函数
关键字:inline( 一般在函数声明的位置直接实现)
直接展开函数体,效率更高
限制:适用于逻辑简单的函数,不会有复杂逻辑(比如switch for等语句)一般不超过5行
9.开辟空间
1.C:用malloc开辟空间,free释放
2.C++:new开辟(new不是函数没有返回值,用异常来处理失败的情况)delete释放
例:
int *p=new int; //int *p=new int[3];
delete p;//delete [ ]p;
10.作用域
C:作用域区分为全局和局部
C++:全局,局部,名词空间作用类(namespace),类作用域(class)
11.全局变量
int a;
int a=5;
C中不会报错
C++中会报错