【C++ primer学习】2.5 处理类型

1、类型别名

两种方式:

第一种、使用关键字typedef 

typedef double wages;    //wages是double的同义词
typedef wages *p;    //p是double*的同义词

第二种、使用别名声明(alias declaration)

using SI=Sales_items;    // SI是Sales_item的同义词
include
using namespace std;

int main()
{
    //第一种:typedef关键字
    typedef double *p;//p是double*的同义词
    //第二种:别名声明,把等号左侧的名字规定成等号右侧的别名。
    using wages=double;//wages是double的别名
    wages hourly,weekly;

    hourly=1;
    p point=&hourly;
    cout<"<

指针、常量和类别别名:

如果某个类别别名是复合类型或常量,在声明时应该注意。

p

typedef char *pstring;    //pstring是char*的别名
const pstring cstr=0;    //cstr是指向char的常量指针
const pstring *ps;    //ps是一个指针,它的对象是指向char的常量指针

pstring的实际类型是指向char的指针,因此const pstring就是指向char的常量指针,而不是指向常量字符的指针。

不能通过替换成本来的样子来判断,是常量指针或是指向常量的指针。

const char *cstr=0; 

const pstring cstr=0;

并不等价。使用pstring时,基本数据类型是指针。用char* 重写后,数据类型就变成了char,*成了声明符的一部分。前者声明了一个指向char常量的指针。

 

2、auto类型说明符

编程时,常常要求在声明变量的时候指定表达式的类型,然而这么做并不容易。C++11新标准引入了auto类型说明符,它能让编译器替我们去分析表达式的所属类型。

auto让编译器通过初始值来判断变量的类型,所以auto定义的变量必须有初始值

注意,使用auto可以在一条语句中声明多个变量。但是一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型必须一致。

auto i=0,*p=&i;    //正确:i是整数,p是整型指针
auto sz=0,pi=3.14;    //错误:sz和pi类型不一致

符合类型、常量和auto

auto一般会忽略顶层const,同时底层const则会保留下来。

int i=0;
const int ci=i, &cr=ci;
auto  b=ci;    //b是一个整数,ci的顶层const特性被忽略掉了
auto e=&ci;    //e是一个指向整形常量的指针,对常量对象取地址是一种底层const

3、decltype类型指示符

decltype,它的作用是选择并返回操作数的数据类型。希望从表达式的类型推断出要定义的变量的类型,但不想用该表达式的值初始化变量。

(1)使用的表达式是一个变量:返回变量的类型(包括顶层const和引用在内)问题:是否包括底层const呢。

(2)使用的表达式不是一个变量:返回表达式结果对应的类型

注意:

一、如果表达式的内容是解引用操作,则decltype将得到引用类型。

二、decltype((variable))的结果永远是引用。

decltype(variable)结果只有当variable本身就是一个引用时才是引用。

你可能感兴趣的:(cpp)