1.命名空间。
C++标准库 #include <iostream> , 命名空间为 std
namespace 是C++中的关键字,用来定义一个命名空间,语法格式为:
namespace name
{
变量
函数
类
}
name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围,
且命名空间可以嵌套。
以下是一个实例
#include <iostream>
using namespace std;
namespace A
{
int a = 1;
void print()
{
cout<<"a ="<< a <<endl;
}
}
namespace B
{
int a = 2;
}
namespace C
{
namespace D
{
struct test
{
int a;
int b;
};
}
}
int main()
{
using namespace A;
cout<<"a =" << a <<endl;
using B::a;
cout<<"a =" << a <<endl;
print();
C::D::test t;
return 0;
}
2.实用性的加强
C语言中的变量都必须在作用域开始的位置定义。
C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。
#include <iostream>
using namespace std;
int main()
{
for (int i = 0; i < 10; i++)
{
cout << i << endl;
}
return 0;
}
3.register关键字
register关键字请求“编译器”将局部变量存储于寄存器中,
C语言中无法取得register变量地址。
在C++中依然支持register关键字
1、C++编译器有自己的优化方式,不使用register也可能做优化
2、C++中可以取得register变量的地址
C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
4.变量检测加强
在C语言中重复定义多个全局变量是合法的
这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上。
C++中不允许定义多个同名的全局变量
#include <stdio.h>
int a;
int a = 1;
int main()
{
return 0;
}
用gcc编译完全可以,但用g++编译时编译器会报错
5.struct类型的加强
C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型。
C++中的struct是一个新类型的定义声明。
C语言中 struct 定义了一组数据的集合,而不是一种新的数据类型,
所以在定义变量的时候需要在前面加上 struct 关键字进行修饰。
C++中 struct 定义了一种新的数据类型,可以直接用来定义变量。
#include <iostream>
using namespace std;
struct Student
{
char name[20];
int age;
};
int main()
{
Student stu1 = {"wcy", 10};
return 0;
}
6.类型和返回值
C中函数可以没有返回参数类型,函数参数可以没有数据类型,
没有参数的函数可以接收任意个参数。
在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数。
C++更加强调类型,任意的程序元素都必须显示指明类型,都必须要有类型。
7.bool类型关键字
C++中的布尔类型
C++在C语言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占用一个字节,
如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现。
true代表真值,编译器内部用1来表示。
false代表非真值,编译器内部用0来表示。
bool类型只有true(非0)和false(0)两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false。
8.三目运算符的加强
C语言返回变量的值, C++语言是返回变量本身。
C语言中的三目运算符返回的是变量值,不能作为左值使用。
本质上,C++编辑器已经自己做了取地址的操作。
在C中怎么才能实现和C++一样的效果,只需取地址就可以了
#include <stdio.h>
int main()
{
int a = 1, b = 2;
int c = (a > b) ? a : b;
*((a > b) ? &a : &b) = 10;
return 0;
}