命名空间:
C++中引入命名空间解决大型软件开发中多位程序员对变量函数的命名冲突;
命名空间将全局作用域分成不同的部分
不同命名空间中的标识符可以同名而不会发生冲突
命名空间可以相互嵌套
全局作用域也叫默认命名空间
#include <iostream>
using namespace std;
namespace A//定义命名空间
{
int a = 1;
void print()
{
cout << "namespace A" << endl;
}
}
namespace B//定义命名空间
{
int a = 2;
void print()
{
cout << "namespace B" << endl;
}
}
namespace C//嵌套定义命名空间
{
namespace D
{
struct test
{
int a;
};
}
}
int main()
{
using namespace A;//声明使用命名空间A中a,以后的程序中如果出现未指明命名空间的a,就使用A命名空间里的a
cout << "a = " << a << endl;
cout << "a = " << B::a << endl;//::是一个新符号,称为域解析操作符,在C++中用来指明要使用的命名空间
using B::a;//声明使用命名空间B中的a
cout << "a = " << a << endl;
print();
C::D::test t;//使用命名空间C中命名空间D中的test
return 0;
}
实用性加强:
C++变量可以在使用时再定义,C变量必须在作用域开始的位置定义;
register关键字(register关键字请求“编译器”将局部变量存储于寄存器中):
C语言中无法取得register变量地址;C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
变量检测:
在C语言中重复定义多个全局变量是合法的, 这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上 在C++中不允许定义多个同名的全局变量
变量与函数类型:
在C语言中
int f( );表示返回值为int,接受任意参数的函数int f(void);表示返回值为int的无参函数 在 C++中 int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型
struct类型:
C语言中 struct 定义了一组数据的集合,而不是一种新的数据类型,所以在定义变量的时候需要在前面加上 struct 关键字进行修饰; C++中 struct 定义了一种新的数据类型,可以直接用来定义变量
bool类型:
C++中增加了bool类型,bool可取的值只有true(非0)和false(0)理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
三目运算符:
C语言中的三目运算符返回的是变量值,不能作为左值使用,C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方(三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用 )
const:
C语言中 const修饰的变量是一个 常变量,本质还是变量,有自己的地址空间 C++中 当碰见常量声明时,在符号表中放入常量,编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C),但是编译过程中若发现使用常量则直接以符号表中的值替换,即使给该常量分配了空间,也并不使用里面的值。C++中的const常量类似于宏定义。const常量是由编译器处理的,提供类型检查和作用域检查。宏定义由预处理器处理,单纯的文本替换
引用:
C++中,引用可以看作一个已定义变量的别名。引用的语法:Type& name = var;普通引用在声明时必须用其它的变量进行初始化引用在C++中的内部实现是一个常指针。当我们使用引用语法的时,我们不去关心编译器引用是怎么做的,当我们分析奇怪的语法现象的时,我们才去考虑c++编译器是怎么做的
默认参数:
C++中,可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替只有参数列表后面部分的参数才可以提供默认参数值,一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值
占位参数:
C++中,占位参数只有参数类型声明,而没有参数名声明,一般情况下,在函数体内部无法使用占位参数。占位参数是为以后程序的扩展留下线索和为了兼容C语言程序中可能出现的不规范写法
函数重载:
C++中,用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同。参数个数不同,参数类型不同,参数顺序不同是函数重载的判断条件。函数返回值不是函数重载的判断条件