const对象的初始化
const对象定义时必须初始化,一旦创建,其值不能被修改
const对象的作用域
用常量表达式初始化的const对象,其作用域是定义它的文件。不能在多个文件之间共享。
对于不是是常量表达式初始化的const变量,在cpp文件中定义时前面加extern,在头文件中声明前加extern,即可实现多文件共享该const变量
const 的引用
const 的引用是对常量的引用,例,
const float f=2.1;
const float &rf=f;
const的引用只能用来读,例如,
int f2=2*rf;
std::cout<<rf<<f2<<std::endl;
因此,对const 的引用初始化时,赋值运算符右侧不仅可以是常变量,也可以是非常量对象,字面值常量,甚至是一般表达式。
float f2=2.3;const float &rf2=f2;
const float &rf3=2.3;
const float &rf4=2*f2;
std::cout<<rf2<<" "<<rf3<<" "<<rf4<<std::endl;
输出2.3 2.3 4.6
而且不要求赋值运算符两侧基本数据类型一样,只要右侧可以转换成左侧数据类型即可。例,
const int &ri=f2;
std::cout<<ristd::endl;
输出2
注意:非const 的引用初始化时,赋值运算符右侧不能是const变量
指针和引用类似。
常量表达式
字面值是常量表达式,用常量表达式初始化的const对象也是常量表达式
constexpr
用constexpr声明的变量一定是常量,且用来初始化的值必须是常量表达式
用constexpr声明的变量类型必须是字面值类型,即算术,引用,指针,某些属于字面值类型的类,枚举型
用constexpr声明的指针变量是常量指针,并没有将指针所指的对象设置为常变量
例constexpr int *pi=nullptr;则pi是指向整型的常量指针
constexpr是c++11新增的。将变量声明为constexpr,则编译器会负责验证变量的值是否是常量表达式,如果不是,则该声明语句不正确
类型别名
typedef double wages,*pw;
则wages与double等价,出现wages的地方可用double替换。
而pw是double类型的指针,不能简单地在出现pw的地方用double*替换。例,
const pw=0;则pw是指向double类型的常量指针。这点需要特别注意。
using base=double,此时wages也被定义为double的别名.这是c++11中规定定义类型别名的新方法
auto类型说明符
由C++11引入。auto使得C++的变量定义更方便随意。
在变量前用auto代替基本类型说明符,这样编译器会替我们确定变量的类型。
使用auto,可以同时定义多个变量,但是注意,这多个变量的初始值类型一定要一致。
如果初始值有const属性,那么定义一般变量时,编译器都将忽略初始值的顶层const属性,保留初始值的底层const属性。如果定义的引用或者指针,则情况比较特殊,初始值的const属性被保留。
若想定义的变量有顶层const属性,要明确写上const,即写成const auto 变量名=初始值
decltype类型说明符
由C++11引入。它与auto有几点不同。
1.用来确定类型的表达式不同
decltype(表达式) 标识符=初始值 ,其中是用表达式的类型来确定变量类型
auto 标识符=初始值表达式 ,其中是用初始值来确定变量类型。
且decltype不计算表达式的值,只是用其类型。
2.decltype得到的类型与表达式类型完全一致,而使用auto时,编译器会改变表达式类型以更符合初始化规则。例如
const int ci=0,&cj=ci,*pi=&ci;
decltype(ci) x=0;ci是const int
decltype(cj) y=ci;y是const int&
decltype(*pi) c=ci;c是const int&
auto z=ci;z是int
auto m=cj;m是int
auto d=*pi;d是int
3.decltype(变量)与decltype((变量))表现行为有区别
decltype(ci) x=0;ci是const int
decltype((ci)) l=ci;l是const int&
4.auto会退化成指向数组的指针,除非被声明为引用
int a[9]; auto j = a; cout<<typeid(j).name()<<endl; // This will print int* auto& k = a; cout<<typeid(k).name()<<endl; // This will print int [9]