关于C++11的一些新变动
nullpter:C++11新标准刚刚引如的一种方法,在C++中,对指针进行初始化赋值,nullpter比NULL要好的多
分离式编译:C++语言支持分离式编译机制,允许将程序分割成若干个文件,每个文件可被独立编译。C++将申明和定义区分开来,一个文件若想使用别处定义的名字则必须包含对那个名字的申明
申明关键字extern
constexpr:C++11新标准规定,允许将变量声明为constexpr来验证变量的值是否位一个常量表达式。
constexpr与指针:
const int *p = nullptr;
constexpr int *q = nullptr;
这两者完全不同,p是一个指向常量的指针,而q是一个常量指针。即p所指向的对象的值不可改变,p的值可以改变。而q的值不可改变,但其指向的对象则可以。
ifdef与#ifndef:
这两个指令分别检查某个指定的预处理变量是否已经定义:
#ifdef当且仅当变量已定义时为真
#ifndef当且仅当变量未定义时为真
一旦检查结果为真,则执行后续操作直至遇到#endif为止。
#ifndef SALSES_DATA_H
#define SALSES_DATA_H
```cpp
#include<string>
struct Sales_data
{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
#endif
作用:为了确保各个文件中类的定义一致,类通常被定义在头文件之中,而且类所在的头文件的名字应该和类的名字一样。例如将Sales_data类定义在名为Sales_data.h的头文件中。
**而SALSES_DATA_H这个全是大写的名字**,被定义为变量后,如果再一次使用此头文件,那么根据#ifndef的规则,他将直接跳过<string>的使用,避免头文件的重复使用。而为了避免与程序中的其他实体发生名字冲突,一般把预处理变量的名字全部大写。
**一般来说,程序员只要习惯性加上这些保护符即可,不必太在乎程序是否真的需要**
之前在ACM队的时候,总是看到一些大佬们加这#ifndef,#endif什么的,当初还以为这个是什么特别高级的东东,现在回头再看这个概念,才明白当初的自己对C++只是了解了一个大概,C++的学习切忌浮躁啊