C++ Primer_学习笔记_Day3

1,类型别名

两种方法定义类型别名:

传统方式关键字typedef:

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

C++新特性定了一种新方法,使用别名声明:

using SI = Sales_item;        //SI是Salles_item的同义词

指针、常量和类型别名

typebef  char *pstring;
const pstring cstr = 0;        //cstr是指向char的常量指针
const pstring *ps ;            //ps是一个指针,他的对象是指向char的常量指针

    上诉两条声明语句的基本数据类型都是const pstring,const是对给定类型的修饰,pstring实际上是指向char的指针,

因此,const pstring就是指向char的 常量指针,而非指向常量字符的指针。

    这里不能将类型别名替换成他本来的样子,来理解该句含义:

const char *cstr = 0;        //错误,不能这样理解

2,auto类型说明符(C++11新特性)

auto说明符,用它能让编译器替我们去分析表达式所属的类型。

需要通过初始值来演算变量的类型,所以,auto定义的变量必须有初始值。

aotu也能在一条语句中声明多个变量,但是该语句中所有变量的初始基本来下必须一致:

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

符合类型、常量和auto

aotu一般会忽略掉顶层const,同时底层const则会保留下来:(顶/底层const详见《C++ Primer_学习笔记_Day2》)

const int ci = i, &cr =ci;
auto b = ci;            //b是一个整数(ci的顶层cosnt特效被忽略掉了)
auto c = cr;            //c是一个整数(cr是ci的别名, ci本身是一个顶层cosnt)
auto d =&i;            //d是一个整形指针
auto e = &ci;          //e是一个指向整数常量的指针(底层const)

如果希望推断出auto类型是一个顶层const,需要明确指出:

const int ci = 0,&cj = ci;

decltype(ci)x = 0;

decltype(cj)y = x;

decltype(cj)z;

const auto f =ci;        

还可以将引用的类型设为auto:

auto &g = ci;            //正确:g是一个整型常量引用
auto &h =42;             //错误:非常量引用不能绑定字面值
银const auto &j = 42;    //正确:可以为常量引用绑定字面值

要在一条语句中定义多个变量时,符号*和&只从属于某个声明符,而非基本数据类型的一部分,因此初始值必须是同种类型:

auto k =ci,&l = i;        //正确:k是整数,l是整型引用
auto &m = ci,*p = &ci;    //正确:m是对整形常量的引用,p是指向整型常量的指针
auto &n = i,*p2 = &ci;    //错误:i的类型是int,&ci的类型是const int

3,decltype类型指示符(C++11新特性)

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

decltype(f()) sum =  x;        //sum的类型就是函数 f的返回类型

如果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;                //错误,引用必须初始化
注意:引用从来都作为其所指对象的同义词出现,只有用在decltype处是个例外。

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

int  i =42, *p = &i, &r = i;
decltype(r+0) b;                 //正确,加法结果是int
decltypr(*p)  c;                 //错误,c是int&,必须初始化

切记:decltype((variable))(双括号)的结果永远是引用,

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


赋值是会产生引用的一类典型表达式,引用类型就是左值的类型。

int a=3,b=4;
decltype(a) c = a;             // c 是 int 类型
decltype (a = b) d = a;        // d 是 int& 类型,绑定到a;

4,头文件保护符

为了有效防止重复包含的发生,用头预处理指令限制:

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

#ifdef 当且仅当变量已定义时为真    

#ifndef 当且仅当变量未定义时为真

#endif 用于结束一个变量是否已经定义

一旦检查结果为真,则执行后续操作直到遇到#endif为止。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值