C++Primer(第五版)学习笔记——处理类型和自定义数据结构(第二章)

类型别名:

typedef:

关键字作为声明语句中的基本数据类型的一部分。:

typedef double wages;        

typedef wages base, *p; //有传递性、声明符可以包含类型修饰符、可以同时声明多个类型别名

using(别名声明):

关键字using作为别名声明的开始,其后紧跟 别名、等号以及类型名。

using wages = double

有一点要注意的是,在理解用类型别名声明的变量时,不能将类型别名替换成他本来的样子来理解语义,例如:

typedef char *pstring;
const pstring *p;       //p是一个指向一个指向char的常量指针的指针。而不是一个指向一个指向const char的指针。

auto类型说明符:

auto是根据变量的初始值(或函数的返回值)来判断类型的,所以auto的变量必须有初始值。

当引用被用作初始值时,真正参与初始化的其实是引用绑定的对象的值,所以auto的类型是引用绑定的对象的类型。

auto一般会忽略顶层const,保留底层const。

如果希望推断出的auto类型是一个顶层const,需要手动写入:

const int  i = 0;
const auto v = i;

设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。(常量引用才可以绑定一个常量):

const int i  = 1;
auto & v  = i;           //illegal
cosnt &v1 = i;           //legal

decltype类型指示符:

decltype的作用是选择并返回操作数的数据类型,编译器分析表达式得到他的类型,却并不实际计算表达式的值。

如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用)。

如果decltype使用的表达是不是一个变量,则decltype返回表达式结果对应的类型。

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

如果给变量加上一层或多层括号,比编译器会把他当作一个表达式,decltype会得到引用类型。

自定义数据结构:

定义类的时候,类体右侧表示结束的花括号后必须写一个分号因为可以这样声明对象:

struct Saes (/*     */}accum,trans,*salptr;

可以为数据成员提供一个类内初始值,创建对象时,类内初始值用来初始化数据成员,没有初始值的成员执行默认初始化。

类内初始值必须写在等号右侧或者花括号内,不能写在圆括号内(好像是因为编译器会把能理解城函数声明的都理解成函数声明?

预处理器:

用来确保头文件被多次包含仍能安全工作。

#define指令把一个名字设定为预处理变量。

#ifdef和#ifndef检测这个预处理处理变量是否已经被定义。一旦检查结果为真,就执行直到遇到#endif指令为止。

预处理变量无视关于作用域的规则。

整个程序中预处理变量和头文件保护符必须唯一,一般用全大写的类名来构建保护符的名字

本部分遗留下来的问题:

类的初始值为什么不能写在圆括号内?

头文件保护符是什么?

decltype的表达式不是变量时,我记得+运算符返回的是左侧运算对象的引用,为什么int & r= 1;decltype(r+0)得到的类型是int?


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值