赞
踩
其他章节:C++ Primer 学习心得
程序复杂,用的的类型也复杂:
两种方法定义类型别名:
typedef
含有typedef
的声明语句,声明符可以包含类型修饰,也能由基本数据类型构造出复合类型来。
typedef double wages; // wages是double的同义词
typedef wages base, *p; // base是double的同义词,p是double*的同义词
使用关键字using
作为别名声明的开始,紧跟别名和等号,把等号左侧的名字规定为等号右侧类型的别名。
using SI = Sales_item; // SI是Sales_item的同义词
某个类型别名指代的是复合类型或常量,用到声明语句会有意想不到的结果。
typedef char *pstring; // pstring是char*的别名,const pstring就是指向char的常量指针,而非指向常量字符的指针
const pstring cstr = 0; // cstr是指向char的常量指针(顶层)
const pstring *ps; // ps是一个指针,它的对象是指向char的常量指针
使用类型别名的声明语句,不能简单的替换进行理解。
auto
类型说明符auto
类型说明符,让编译器分析表达式所属的类型,通过初始值来推算变量的类型,auto
类型必须有初始值。
使用auto
语句也能在一条语句中声明多个变量,一条声明语句只能有一个数据类型,该语句中所有变量的初始基本数据类型必须一样。
auto
编译器推断出来的auto
类型有时和初始值的类型不完全一样,会适当的改变结果类型使其更符合初始化规则。
auto
的类型。auto
忽略顶层const
,底层const
保留下来。int i = 0; const int ci = i, &cr = ci;
auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr; // c是一个整数(cr是ci的别名,ci本身是一个顶层const)
auto d = &i; // d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci; // e是一个指向整数常量的指针(对常量对象取地址是一种底层const)
auto
类型是一个顶层const
,要明确指出const auto f = ci; // ci推演类型是int,f是const int
auto
的引用时,初始值的顶层常量仍然保留。初始值绑定一个引用,常量就不再是顶层常量。auto &g = ci; // g是一个整型常量引用,绑定到ci
auto &h = 42; // 错误:不能为非常量引用绑定字面值
const auto &j = 42; //正确:可以为常量引用绑定字面值
&
与*
属于声明符,不属于基本数据类型,初始值必须是同一种类型。auto k = ci,&l = i; // k是整数,1是整型引用
auto &m = ci,*p = &ci; // m是对整型常量的引用,p是指向整型常量的指针
auto &n = i,*p2 = &ci; // 错误:i的类型是int而&ci的类型是const int
const int i = 42; // const int
auto j = i; // int
const auto &k = i; // const int&
auto *p = &i; // const int*
const auto j2 = i, &k2 = i; // const int / const int&
decltype
类型指示符decltype
:选择并返回操作数的数据类型,过程中编译器分析表达式并得到他的类型,但不计算表达式的值。
decltype(f(n)) sum = x; // sum类型就是函数f的返回类型
decltype
处理顶层const
和引用的方式与auto
有所不同:decltype
使用的表达式是一个变量,则decltype
返回该变量的类型(包括顶层const
和引用在内)。
const int ci = 0, &cj = ci;
decltype(ci) x = 0; // x的类型是const int
decltype(cj) y = x; // y的类型是const int&,y绑定到变量x
decltype(cj) z; //错误:z是一个引用,必须初始化
decltype
和引用decltype
使用的表达式,则返回表达式结果对应的类型。有些表达式将向decltype
返回一个引用类型,该表达式的对象可以中作为一条赋值语句的左值。//decltype的结果可以是引用类型
int i = 42,*p = &i, &r = i;
decltype(r+0) b; // 正确:加法的结果是int,因此b是一个(未初始化的)int
decltype(*p) c; // 错误:c是int&,必须初始化
r
是引用,decltype(r)
结果是引用类型,decltype(r+0)
结果是r
所指的类型,具体值而非引用。p
是指针,decltype(*p)
结果是引用类型,得到指针所指的对象,还能给这个对象赋值。decltype
的结果类型与表达式形式密切相关。
decltype
使用的是一个不加括号的变量,得到的结果是该变量的类型。decltype
得到引用类型。// decltype的表达式如果是加上了括号的变量,结果将是引用
decltype((i)) d; // 错误:d是int&,必须初始化
decltype(i) e; // 正确:e是一个(未初始化的)int
decltype((variable))
(注意是双层括号)的结果永远是引用,而decltype(variable)
结果只有当variable
本身就是一个引用时才是引用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。