顶层const
顶层const 表示指针本身是一个常量,底层const表示指针所指的对象是一个常量
拷贝过程中,顶层const没有影响,底层const要求双方都是底层const或者两个对象的数据类型必须能够转换。
首先我们说说顶层const和底层const的通俗定义
顶层const: 表示指针本身是个常量,更简单的说顶层const作用对对象本身,表示对象是一个常量
底层const: 表示指针所指向的对象是个常量
所以有以下结论(个人总结)
将const考虑成向右结合
- 如果const右结合修饰的为 类型 或者 * ,那这个const就是一个 底层const
- 如果const右结合修饰的为 标识符 ,那这个const就是一个 顶层const
来自 <http://www.tuicool.com/articles/qqYJnaY>
constexpr和常量表达式
常量表达式(const expression)是指不会改变并且在编译过程就能得到计算结果的表达式。
因为 staff_size可以改变所以不是常量表达式
constexpr变量
c++11新标准规定允许将变量声明为constexpr类型,来让编译器去验证是否是一个常量表达式。
字面值类型 literal type,算术类型、引用和指针都属于字面值类型,自定义类、IO库、string类不属于,不能被定义为constexpr。如果指针和引用定义为constexpr,则指针的初始值必须是nullptr或者0或者是储存于某个固定地址中的对象。
处理类型
类型别名 type alias。使用typedef定义类型别名
typedef double wages; wages是double的同义词
typedef wages base, *p; //base是double同义词,p是double* 同义词(typedef wages * p)
在c++11标准中规定了新的方法 别名声明(alias declaration)
using SI = Sales_item; using作为别名声明的开始,后面紧跟别名和等号,作用是把等号左侧的名字规定成等号右侧的类型别名。
typedef char *pstring;
const pstring cstr=0;
const char *cstr =0;
对于上面,前声明了一个指向char的常量指针,后声明了一个指向const char的指针。
auto类型说明符
c++11新标准可以使用auto让编译器去分析表达式所属的类型。但是一条auto只能声明一个基本类型
auto会忽略顶层const留下底层const,想要保留需要const auto声明
decltype类型指示符
c++11新标准引入了第二种类型说明符decltype,选择并返回操作数的数据类型。
decltype(f()) sum =x;sum的类型就是f的返回类型。
如果变量多了一层括号,编译器就会把它当成一个表达式
双括号中,永远是引用,单括号只有生命本身是引用才会是引用。
自定义类
使用struct进行类名和类体定义。类定义末尾需要加上分号
在c++11中,可以对类成员提供类内初始值(in-class initializer)
class也可以定义类型。
预处理器 preprocessor
#开头 头文件保护 header guard
#define 指令把一个名字设定为预处理变量
#ifdef 当且仅当已定义为真时
#ifndef 当且仅当变量未定义时为真,一旦检查结果为真,则执行后续操作到#endif