一、namespace命名空间
1、C++命令空间
在C++中,在大规模的程序设计中,以及程序员使用各种各样的的C++库时,标识符的命名会发生冲突,为了避免这种情况,C++引入了关键字namespace(命名空间),可以更好的控制标识符的作用域。
std是C++标准命名空间,C++标准库里的所有标识符都被定义在std中,比如iostream等都定义在命名空间里,使用时要加上声明(using namespace std),或者显示使用std::cout等。
2、C++命名空间的定义
namespace name{......}
3、C++命令空间的使用
使用整个命名空间:using namespace name
使用命名空间的变量:using namespace name::variable
4、实验代码
#include "iostream"
using namespace std;
namespace nameA
{
int a = 10;
int b = 25;
}
namespace nameB
{
int a = 20;
namespace nameC
{
struct student
{
int age;
char name[20];
};
}
}
int main()
{
cout << "namespace std" << endl;
//因为前面声明了using namespace std,所以可以直接使用cout,不然需要std::cout
using namespace nameA;
using namespace nameB;
cout << "namespace nameA b = " << b << endl;
cout << "namespace nameA a = " << nameA::a << endl;
cout << "namespace nameB a = " << nameB::a << endl;
//显示的
nameB::nameC::student st;
st.age = 15;
//声明后再使用
using nameB::nameC::student;
student st1;
st1.age = 14;
system("pause");
return 0;
}
注意:当不同命名空间里有相同的变量时,变量前的的命名空间也必须写出来。
二、实用性增强-变量定义位置
1、变量定义位置
C语言中的变量必须定义在作用域的开始位置;
C++更强调语言的实用性,所有的变量都可以在需要使用时再定义。
2、实验代码
int main()
{
int i;
i = 10;
int j;
j = 15;
return 0;
}
上面的代码在C语言编译不通过,因为变量不在作用域开始的位置定义。
但是在C++中可以编译运行,这是C++对C在实用性上的增强,变量定义位置的加强。
三、register关键字增强
1、register的变化
register关键字请求编译器将变量直接放入寄存器中,速度快。
C语言中无法获取寄存器变量的地址,但是C++中可以获取寄存器变量的地址。
2、实验代码
int main()
{
register int i;
printf("&i = %p\n", &i);
system("pause");
return 0;
}
上面的代码在C语言中编译失败,无法获取i的地址,但是C++中可以正常编译运行。
3、注意
C++编译器有自己的优化方式,即使不用register变量,也会优化,将频繁使用的变量放入寄存器中,加快速度。
例如:
for(int i = 0,i < 1000,i++)
{
printf("i = %d\n",i);
}
四、struct关键字增强
C语言的struct关键字定义了一组变量的集合,C编译器并不认为这是一种数据类型。
C++中的struct是一个新类型的定义声明。
C实验代码:
#include "stdio.h"
struct Student
{
char name[10];
int age;
};
int main()
{
//Student st;
struct Student st;
system("pause");
return 0;
}
这里Student st;会报错,只有struct Student st;才能定义变量。
C++实验代码:
#include <iostream>
struct Student
{
char name[10];
int age;
};
int main()
{
Student st;
system("pause");
return 0;
}
这样可以正常定义变量。
五、C++中所有的变量和函数必须有类型
C++中所有的变量和函数必须有类型,C语音的默认类型在C++中是不合法的。
函数的返回值是什么类型,参数又是什么类型,参数有几个,这些在C++中都需要有。
例如以下定义在C中可以编译,但是在C++中编译失败:
funA(i)
{
printf("i = %d\n",i);
}
funB()
{
return 5;
}
在C语言中,
int fun();表示函数类型为int,接受任意参数的函数。
int fun(void);表示函数类型为int的无参函数。
C++更加强调类型,任意的程序元素都必须显示的指明类型。
六、变量检测增强
在C语言中,重复定义多个同名的全局变量是合法的。C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。
在C++中,不允许定义多个同名的全局变量,拒绝二义性的做法。
七、新增bool类型关键字
C++在C语言基础类型系统之上增加了bool,bool只能去true和false。理论上bool只有一个字节,但是多个bool变量定义在一起,可能会各占一个bit。
C++编译器会在赋值时将非0值转换为true,0值转为为false。
八、三目运算符的增强
实验代码:
int main()
{
int a = 10;
int b = 20;
(a > b ? a : b) = 30;
system("pause");
return 0;
}
上面的代码是在C编译器编译失败,在C++编译器编译成功。
分析:
C语言中三目运算符返回的是变量的值,不能作为左值使用。
C++中三目运算符可以直接返回变量本身,因此可以出现在程序任何地方。注意:三目运算符可能返回的值当中如果有一个是常量值,则不能作为左值使用。例如:(a > b ? 1 : b) = 30;这样是不行的。
当左值的条件,必须要有内存空间。