C++对于C语言的不同之处
这里就说一些我们常见到的,记住这些就没什么问题了
不同之处如下:命名空间 namespce 的加入、struct类型加强、所有的C++函数和变量必须明确类型(以前c语言是编译器默类型)、新增bool类型、三目运算符功能增强、const关键字功能增强、枚举的功能增强
新增之处:加入了引用、函数重载、函数默认参数和占位参数
下面详细介绍不同之处:
- 命名空间namespace的加入
首先我们要弄清楚什么是命名空间,它相当于是定义了c++一套标准标识符,namespce是用来确定一个变量的作用域的。
怎么说呢?我们如果在c++中没有定义 using namespace std;那么cout<<“hello”<<endl;就是错误的。因为编译器不知道cout是哪里的标识符。(编译器报错:未定义标识符cout)
所以在没有定义using namespce std;的时候,我们要输出一个hello应该是:std::cout<<“hello”<<std::endl;
这里的std::cout就是向编译器解释cout是属于标准标识库作用域里面的一个关键字。
同样using namespace std;我们一般是在文件开头书写,这是为什么呢?
#include<fstream>
void func()
{
using namespace std;
cout << "abcd";//没有报错
}
int main(void)
{
cout << "abcd";//报错未定义标识符cout
return 0;
}
因为using name space std;也是有作用域的,就和我们任何一个语句一样的,他的作用域也是一样的。
-
第二点不同之处是struct关键字的作用增强
在语言中
#include <stdio.h> struct band { int num; char name[100]; }; void func() { char *temp="hello"; band b1;//报错:error: unknown type name 'band'| b1 = { 2,"hello"}; } int main() { func(); return 0; }
这样会报错:不知道band是什么类型,因为c语言没有把struct定义为一个新类型的声明
在c++中,struct是一个可以定义新类型的关键字。
上面的代码在c++编译器中就不会报错
3.所有的c++变量都必须初始化,没有编译器默认初始化
例如以下代码
#include<stdio> func() { } int main(void) { func(); return 0; }
其在c语言编译器就会编译通过,c++编译器就不行。因为c++所有类型都必须明确,func函数不明确返回值类型,c语言会默认为void返回类型,c++则会报错。
-
新增入了一个类型bool类型,以前在c语言编译器中想实现bool类型得自己写一个枚举如下
typedef enum {false,true} bool;
c++增加了bool类型,0为假,非0为真
-
三木运算符在c++语言中功能得到增强
具体看下面代码
#include<stdio.h> int main(void) { int a=1,b=2,c=3; c=(a>b)?a:b;//编译通过 (a>b)?a:b=c;//编译报错在c编译器,编译通过在c++编译器 }
什么原因呢?因为C语言编译得三木运算符返回的是变量得值,是一个常量,不能用来做左值,而c++返回得是变量本身,可以用来做左值。(左值可以简单理解为在等号左边的值,一般只能是允许改变得值才可以做左值)
-
const关键字得作用在c++中也得到了加强。
以前在c语言里面得定义得局部const常量只是一个由编译器维护的伪常量,我们可以通过以下代码去修改const常量。
#include <stdio.h>
int main(void)
{
const int a=1;
int *p=&a;
*p=2;
printf("a=%d",a);//c语言编译器结果为a=2;,c++结果为a=1;
return 0;
}
上面的代码说明,在c语言里,const常量只是一个普通的由编译器维护的不能被修改的变量,而我们还是可以通过a的地址去改变a的值。a在c语言里还是存放在栈区,可以被取地址改变
在c++中,我们为什么通过a的地址改变a的值没有成功呢?因为c++里面是把所有的常量做了一个常量表,只要是出现a的地方都用a代表的const常量来替换。
那为什么我们还可以取得a的地址呢?因为c++编译器临时建立了一个变量,temp,temp=a;int p=&temp;c++编译器在后面做了这么一套动作。
7.* 枚举的语法也在c++里面得到了增强,具体如下**
#inlcude <stdio.h>
enum DAY
{
MON,
TUE,
WED
THU,
FRI,
SAT,
SUN,
};
int main(void)
{
enum DAY a=MON;
enum DAY b=0;//这在c语言中通过,在c++中不行
}
二、新增之处
-
引用
int a=1; int &b=a; //引用b一旦指定a,就不能修改 int c=2; &b=c;//编译器会报错,说是无法修改&b b=c;//编译通过,因为这里相当于是 *(&a)=c;
对于引用的使用有以下几点规则
- 引用其实是存储着一个变量的地址,c++编译器把a的地址赋值给了b,有b的地方,都由编译器变成了 *a
的地址。
- 声 明的时候必须初始化,一经声明,不可变更。
- 可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
- &符号前有数据类型时,是引用。其它皆为取地址。
-
c++多了函数重载,和函数的形参的占位参数,默认参数
#include<iostream> using namespace std; int func(int) {};//这里的int是占位参数,说明这里有一个int int func1(int a = 2) { cout << a << endl; } int func1(double a = 2.0)//这里就是函数重载 { cout << a << endl; } int func2(int a = 2) { cout << a << endl; } int main(void) { func(1); func2();//int func2(int a=2)这里没有参数输入,就默认a为2; func1(3);//输出 3,有实参输入,默认参数就被替换 double a = 2.34; int b = 3; func1(a);//这里调用的是fun1(double a=2.0) func1(b);//这里调用的是fun1(int a=2) return 0; }
关于默认参数有以下注意点
- int func(in b ,int a=2),默认参数必须在形参的左边,且默认参数之后必须全是默认形参,如int func(int a=1,int b)错误,int fun(int a,int b=1,inc)//错误
- 默认参数当有具体实参输入时,会被覆盖
关于函数重载有以下规则
- 函数名相同,作用域相同
- 函数输入参数个数不同,或者输入参数类型不同
- 函数返回值的异同不能作为函数重载的条件