C++对C的加强
1 namespace命名空间
c++标准为了和c区分开来,也为了可以正确使用命名空间,规定头文件不使用后缀.hnamespace 可以嵌套
2 实用性增加 C语言中的变量必须在作用域的开始位置定义
C++,所有变量都可以在需要使用时在定义
举例子: 在vc下
int main()
{
int i=0;
printf("Hello...\n");
int k;
//system("pause);
return 0;
}
编译器报错(VC6.0).
但是在vs中写C++代码时便没有这个问题。
3register(请求编译器让变量直接放在寄存器里面,访问速度快) 关键字增强
c语言中无法取得register的地址。在C++中依然支持register关键字。C++有自己的优化方式不使用 register也可能做优化。(for循环中i被多次访问,就可能把i放在寄存器中,即等同于被register修饰)。C++可以取得register变量的地址。
4 变量检测增强
c语言中,重复定义多个变量名字是合法的 C++中不允许这样定义c语言中多个同名的全局变量最终被链接到全局数据区的同一个地址空间上 int g_var; int g_var=100;(无论定义顺序的先后,最终的结果都是g_var是100.c++拒绝这种二义性的做法
5 struct 类型加强
在C语言中定义一组变量的集合,C编译器不认为它是一种变量,比如struct Teacher{…};你无法在定义变量时,直接 Teacher t1;这样是报错的。你必须struct Teacher t1;才可以。在C++中你直接可以 Teacher t1;
6 C++中所有的变量和函数必须又类型
例如 在C语言中
f(i)
{
printf("i=%d\n",i);
}
g()
{
return 5;
}
int main()
{
f(10);
printf("g() = %d\n",g(1,2,3,4,5));
return 0;
}
以上的代码是合法的
在vc中运行的结果是:
但是在C++中,严格检查类型和函数的参数。
以上条目所有内容都为语法级别的增强
7 新增 bool类型的变量
假只有一种(0)真有千千万(所有除了 0 之外的正数或者负数都为真理论上 bool只占用一个字节
8 三目运算符功能增强。
例子:
int main()
{
int a = 10;
int b = 20;
//返回一个最小数 并且给最小数赋值成3
//三目运算符是一个表达式 ,表达式不可能做左值
(a < b ? a : b )= 30;
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
在VC(C编译器)中返回的a是一个常量,是无法向常量赋值的所以编译出错。但是在VS(C++编译器)中返回的是a变量本身,是可以向它赋值的。
9 const 修饰符
#include <stdio.h>
int main()
{
const int a =10;
int *p= (int *)&a;
*p=20;
printf("%d\n",a);
return 0;
}
关于以上代码在VC中是可以编译通过运行的,虽然使用const修饰了a为只读内存块,但是我们依然可以通过指针间接的去修改a的值,这便是C的缺陷与不足之处。
但是C++的编译器对此做出了严格的判断。C++采用符号表的方法,防止了指针对常变量的间接的赋值。(C++虽然可能为const常量分配空间,但不会使用其存储空间的值)
10 引用
引用是C++的概念引用是变量的别名,在一些场合可以替代指针相对于指针来说有更好的可读性和实用性。单独定义引用的时候必须初始化,引用作为函数参数的时候可以不必初始化引用是一个有地址的常量,有自己的空间(4字节)。引用在C++中的内部实现是一个常指针。