“实用性”增强
C语言中的变量都必须在作用域开始的位置定义
C++中增强了语言的“实用性”,所有的变量都可以在需要使用时再定义
例如:
int main()
{
int i = 0;
printf("aaaaa");
int j;
system("pause");
return 0;
}
C编译器会报错,而C++编译器则不会。
register关键字增强
regist关键字修饰的变量,编译器将其直接放到寄存器里面,速度快
C语言中无法取得regist变量的地址,C++中可以取得regist变量的地址
变量检测增强
C语言中,重复定义多个同名的全局变量是合法的
C++中不允许定义多个同名的全局变量
如下:
int g_var;
int g_var = 1;
C编译器不会报错,C++编译器报错
struct类型加强
C语言中struct是一种定义了一组变量的集合,定义结构体变量需要使用如:struct Student stu;这种格式。
C语言中的struct是一种新类型的定义声明,定义结构体变量如:Student stu;不需要加struct关键字。
C++多结构体进行了增强,使其具有和类相同的特性,他们之间唯一的不同是:结构体的默认访问类型是public,而类的默认访问类型是private。
函数格式增强
C语言中的函数可以没有返回类型,可以不指定参数类型甚至不指定参数,如下:
fun()
{
return 0;
}
fun2(i)
{
printf("i=%d\n", i);
}
int main()
{
fun(1,2,3,4);
fun2(5);
}
C++和java一样,更加强调类型,任意程序元素都必须显示的指定类型。
新增 Bool 类型
bool类型只有true(非0) 和 false(0)两个值
三目运算符功能的增强
C语言中三目运算符返回的是变量的值,不能作为左值使用。
C++中的三目运算符当左值时,返回的是变量本身,注意:三目运算符返回的值中如果有一个是常量值,则不能作为左值使用。
C语言如何支持类似C++的这一特性呢?
思考:当左值的条件——>要有内存空间
C++下:
int a, b;
a = 1;
b= 2;
(a < b ? a : b) = 10;// 编译成功,成功修改a的值为10
C下:
int a, b;
a = 1;
b= 2;
(a < b ? a : b) = 10;// 编译出错
*(a < b ? &a : &b) = 10;// 编译成功,成功修改a的值为10,达到类似C++的三目运算符当左值的效果
const常量增强
C下:
int main()
{
const int a = 10;
int *p = (int*)&a;
*p = 20;
printf("a=%d \n", a);
system("pause");
}
结果 a = 20
C++下:
void main() {
const int a = 10;
int *p = (int*)&a;
*p = 20;
printf("a=%d \n", a);
system("pause");
}
结果 a = 10
C语言中的const变量是只读变量,有自己的存储空间。
C++中的const常量,被放置在一个叫符号表(不属于内存四区的任何一区)的单元中。C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在const修饰的常量编译期间,就已经确定下来了。
如何解释取地址???
编译过程中若发现使用常量则直接以符号表中的值替换,若发现以下情况,则给对应的常量分配存储空间(兼容C)
当const常量为全局,并且需要在其它文件中使用,会分配存储空间
当使用&操作符,取const常量的地址时,会分配存储空间
当const int &a = 10; const修饰引用时,也会分配存储空间
命名空间(名称空间)
C++新增了命名空间,即通过定义一种新的声明区域来创建命名的名称空间,这样做的目的是提供一个声明名称的区域,一个名称空间中的名称不会与另一个名称空间中的相同的名称发生冲突。
名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。
using声明 和 using编译指令
我们不希望每次使用名称空间都对它进行限定如std::cout, C++提供了两种机制:using声明 和 using编译指令来简化对名称空间的使用。using声明使特定的标识符可用,using编译指令使整个名称空间可用。
需要注意的是:
假如名称空间和使用它的作用区域中定义了相同的名称,如果试图使用using声明来将名称空间中的名称导入该作用区域,则这两个名称会发生冲突,从而出错。如果使用using编译指令将名称空间的名称导入到该作用区域,则局部作用区域中名称将隐藏命名空间中的名称。
示例如下:
#include <iostream>
using namespace std;
namespace Test {
int a;
double b;
}
int a;
void main()
{
using Test::a;// 使用using声明来将名称空间中的名称导入该作用区域
double a;// 和Test::a 冲突,报错cpp(14): error C2371: “Test::a”: 重定义;不同的基类型
cin >> a;
cout << a << endl;
system("pause");
}
#include <iostream>
using namespace std;
namespace Test {
int a;
double b;
}
int a;
void main()
{
using namespace Test;// 使用using编译指令
double a;// a隐藏了Test::a
a = 10;
cout << a << endl;// 结果:10;
cout << Test::a << endl;// 结果:0
system("pause");
}