2.4 const 限定符
- const 对象一旦初始化, 他的值就不会改变, 因而const对象必须初始化, 可以是任意复杂表达式, 允许运行时初始化
const int j = get_size();
const int i = 42;
- 对于const对象的主要限制是, 只能在const类型的对象上执行不改变其内容的操作
- 如果使用一个对象去初始化另一个对象, 是不是const对象其实无所谓
- 默认情况下, const对象仅在文件内有效, 在多个文件中出现了同名的const变量时候, 其实等同在不同的文件中定义了独立的变量。
- 如果需要在一个文件中定义一个const,而在多个文件中能够使用它,解决方法: 对于const变量不管是定义还是声明都添加extern字段
- 对于const, C++编译器处理方式类似 #define 宏定义, 在使用到这个变量值得地方都替换成对应的值。 这也就解释了, 用const_cast 脱掉const之后, 还是没有能够修改const的值得原因了
2.4.1 const引用
- 对常量的引用不能被用作修改他所绑定的对象
- 引用类型必须与其所引用的对象的类型保持一致,但是
- 初始化常量的时候, 允许任意表达式作为初值, 只要表达式结果可以转化成引用的类型即可, 特别的, 允许为一个常量引用绑定非常量的对象, 字面值, 甚至是一个一般表达式 , (此时本质是绑定了一个临时对象)
- 对const的引用可能引用一个并非const的对象, const 仅对引用参与的操作,进行了限定,而对原始数据没有进行限制
2.4.2 指针和const
- 类似的, 指针的类型必须与其所指向的对象的类型保持一致, 但是
- 允许令一个指向常量的指针指向一个非常量对象, const 仅限制不能通过这个指针的方式修改对象的值。
- ps:书中说有两个例外,只找到上面这个 <-_->!!
- 所谓指向常量的指针和引用, 不过是指针和引用“自以为是”罢了, 他们以为自己指向的是常量, 所以自觉的不去改变所指的对象
- const 指针, 指针指向不变, 但指向的对象内容可变
2.4.3 顶层const
- 顶层const表示指针本身是个常量, 底层const表示指针所指的内容是个常量, 更一般的, 顶层const可以表示任意对象是常量
- 声明引用的const都是底层const
- 执行拷贝操作的时候, 不会改变拷贝对象的值, 因而, 拷入烤出的对象是否是常量都没有什么影响, 但底层const不能忽略, 拷贝时候, 底层const必须保持一致
2.4.4 constexpr 和常量表达式
- 常量表达式是指不会改变并且在编译过程中就能够得到计算结果的表达式。
- C++11 规定, 允许将变量声明为constexpr类型以便由编译器来验证变量的表达式是否是一个常量表达式。
- 一般, 如果认定变量是一个常量表达式, 就把他声明成constexpr类型
- 一般常量表达式多为字面值类型, ex. 算术类型, 指针, 引用
- 一个constexpr指针的初始值必须是nullptr 或者 0, 或者是一个存储在某个固定地址中的对象。 ex. 定义在函数体外的对象, 或者作用范围超过函数的变量
- constexpr定义的是一个顶层const, 限定指针的指向保持不变
2.5 处理类型
2.5.1 类型别名
- 可以使用别名声明来顶一个类型的别名:
usingSI=Sales_item
- 如果某个类型别名指代的是复合类型或者常量, 那么把他用到声明中会有特别的效果 。 不要错误的尝试把类型别名替换成他本来的样子进行理解!!!
typedef char *pstring;
const pstring cstr = 0; // cstr 是指向char的常量指针
const pstring * ps; // ps 是个指针, 对象是指向char的常量指针
2.5.2 auto类型说明符
- auto 能让编译器自动分析表达式所属的类型
- auto 一般会忽略顶层const, 保留底层const, 如果希望推断出来的auto类型是一个顶层const, 需要明确指定 const auto
2.5.3 decltype类型指示符
- 用于选择并返回操作数的数据类型, 此时, 编译器只分析表达式得到类型, 不做实际计算
- decltype返回的类型, 包含顶层const
- 如果表达式的内容是解引用操作, 得到 引用类型
- decltype((variable)) 得到引用, 而 decltype(variable) 得到variable类型
2.6 自定义数据结构
- 不要把类的定义和对象的定义放在一起。
- C++11 允许为数据成员提供一个类内初始值
struct Sales_date{ std::string bookNo; unsigned units_sold = 0; double revenue = 0.0; }
- 使用预编译指令避免头文件重复包含, 预处理变量无视作用域规则
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-08-20 16:26:25