C++学习笔记-const对象,类型别名,auto和decltype

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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值