const修饰的类型有普通类型的大部分操作,如将const int类型转为bool类型。
int i = 0;const int ci = i;
int j = ci;
上述代码中关于const的操作:给ci赋值的时候不会考虑ci是常量类型,因为不会改变常量的值,同样的,将ci赋值给j的时候也是如此。
默认情况下,const对象仅在文件中有效。
如果需要在不同文件间共享const变量的值,则使用extern用于声明常量并非本文件独有。
常量引用
常量的引用类型需要使用常量引用,如下所示:
const int ci = 1;
const int &ri = ci;
int &r2 = ri; // error:non const reference to a const object
const pointer
指针本身是const,例如:
int num = 0;
int *const curNum = # // curNum will always point to num
const double pi = 3.14;
const double *const pip = π // pip is a const pointer to a const object
Top-level const
使用top-level const来标识指针本身是一个常量;如果指针指向一个const对象,那么我们说这个const是low-level const。
constexpr
常量表达式:当做const表达式时可以使用constexpr
类型处理typedef
alias
格式为:using a = A;
auto
自动判断类型
decltype
自动判断类型,但是不计算变量的值
decltype()中的解引用操作返回的结果是引用,而不是原始类型
在decltype中添加一对以上的括号,将返回引用类型
struct //定义struct的两种格式struct{
};
struct {...} a,b,*c;
struct中定义的成员变量会在对象定义的时候被默认初始化。
定义头文件一般只定义一次的内容放在头文件中,如类、const、constexpr变量等。
头文件一旦改变,相关的源文件需要重新编译来获取新的变量声明。
确保头文件多次包含仍能被正确处理的机制是预处理器(preprocessor)
预处理器看到#include会将内容替换掉#include
头文件保护符:使用以下代码来避免重复包含的发生:
#ifndef CPP_TEST_SALES_DATA_H#define CPP_TEST_SALES_DATA_H
struct sales_data{
};
#endif //CPP_TEST_SALES_DATA_H
与编译器无视关于作用域的规则
一般的做法是基于类的名字来构建保护符的名字
字:在指定机器上进行整数运算的自然单位
字符串、vector using格式为:using namespace::name
头文件不应该包含using描述,否则可能有名字冲突。
宏