相对与c语言而言,C++的实用性有所增强
C语言中的变量必须在作用域开始的位置定义,而c++中更强调语言的实用性,所有的变量都可以在需要使用的时候再定义
register关键字的增强:关键字,请求编译器直接变量放在寄存器里,速度快;在C语言中寄存器里是没办法取地址的,也就是说不能在寄存器变量上取地址;而在C++中是可以在寄存器变量上取地址的
register关键字的变化
1、register关键字请求“编译器”将局部变量存储于寄存器中,C语言无法取得register变量地址,在C++中依然支持register关键字,C++编译器有自己的优化方式,不使用register也可能做优化,在C++中可以取得register变量的地址
2、C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效
3、早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。
函数类型检测增强
在C语言中,重复定义多个同名的全局变量是合法的;
在C++中,不允许定义多个同名的全局变量;
C语言中多个同名的全局变量最终会被链接到同一个地址空间上:
int g_var;
int g_var=1; 结果是对的
C++直接拒绝这种二义性的做法
int g_var;
int g_var=1;编译后会报错
struct的增强:
在C语言中,struct定义了一组变量的集合,编译器并不认为这是一种新的类型
在C++中,struct是一个新类型的定义声明,并且struct可以完成与class相同的功能
例:
#include<iostream>
using namespace std;
struct Stu
{
public:int m;
private:int n;
protected:char a[100];
};
int main()
{
Stu Stu1; //在C语言中这样写是错误的,C语言中这样定义 struct Stu Stu1;
Stu1.m = 10;
cout << Stu1.m<< endl;
system("pause");
}
C++中的函数和变量都必须有类型
这就说明,在C++ 中对类型的检查将更加严格,而C中的默认类型在C++中是不合法的;
C++新增Bool类型关键字
C++在C语言的基础类型系统之上增加了Bool,bool类型可取的值只有true和false;理论上bool只占用一个字节,但是如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现;
true代表真值,编译器内部用1来表示;
false代表非真值,编译器内部用0表示;
boo类型只有true(非0)和false(0)两个值,C++编译器会在赋值时将非0值转换为false
#include<iostream>
using namespace std;
int main()
{
bool b,b1,b2,b3;
b = true;
//cout <<"sizeof(b):"<<sizeof(b)<< endl;//bool所占内存空间为一个字节
b1 = 10;
cout <<"b1="<<b1 << endl;
b2 = -10;
cout << "b2="<<b2<< endl;
b3 = 0;
cout <<"b3="<<b3 << endl;
system("pause");
}
三目运算符功能增强
1、在C语言中,表达式的元素结果,放在寄存器中,表达式的返回值,是一个数;在C++里面,表达式返回的是变量本身
2、C++编译器是如何做到让表达式是返回的是变量本身,也就是说让表达式返回一个内存空间,即内存首地址。
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
(a < b ? a:b) = 30;
cout << "a="<<a<< endl;
cout << "b=" << b << endl;
system("pause");
}
在C语言中依然可以实现用表达式当左值得效果
#include<stdio.h>
int main()
{
int a=10;
int b=20;
*(a<b?&a:&b)=30;
printf("a=%d\n",a);
printf("b=%d\n",b);
}
3、本质:C++编译器帮我们程序员完成了以上我们要在C语言中完成的工作,即C++编译器帮我们取了一个地址而已
需要注意的是:一旦三目运算符中可能返回的值为一个常量值,则不能作为左值使用