2.5 处理类型
类型别名:提高代码可读性
解决程序复杂,变量复杂,拼写困难问题
typedef double wages; //注意这里并不是声明变量, typedef 声明别名 typedef wages base, *p;//base是double的同义词,p是double*的同义词 using p = double*; //C++11,声明别名 wages hourly, weekly; p p1;//等价于double* p1
指针(复合类型)使用类型别名
typedef char* pstring; const pstring p1 =0; //const 和 pstring都是用来修饰 p1的 //指向char*的 指针常量 const pstring *ps; //const是修饰pstring的,修饰符的匹配原则,从右往左 //ps是指针变量,它的对象是指向char的指针常量
auto 类型说明符:C++11让编译器通过初始值推断变量类型
auto i =0,*p = &i; //正确 auto a =0, b =3.14;//错误,auto已经被推断为int型
int i =0, &r = i; auto a = r; //a是int型 const int c1 = i, &r1 = c1; //auto在推断类型时,顶层const会忽略(对于等号左边而言) auto b = c1; //b是int型,c1的顶层const被忽略 auto c = r1; //c是int型,c1顶层const被忽略 auto d = &i; //d是int*,整型的地址就是指向整型的指针 auto e = &c1;//e是const int* 常量指针,底层const没被忽略 const auto f = c1;//auto推演类型为int,f类型为const int auto &g = c1; // const int 整型常量引用,即引用的对象是一个常量 auto &h =42; //错误,规定:不能对非常量引用绑定字面值 const auto &h =42;//正确,可以为常量引用绑定字面值
decltype类型说明符: 选择并返回操作数的数据类型
引用都是其对象的同义词,但decltype是一个例外
const int c1 =0,&c2 = c1; decltype(c1) x =0; //const int decltype(c2) y =0; //const int& decltype(c2) z;//错误,必须初始化
如果表达式内容是解引用操作,则decltype会得到引用类型
decltype(val)的结果永远为引用,val本身也可以是引用
int i =42, *p = &i, &r = i; decltype(r +0) b; //正确,int //注意,*不是出现在声明中,而是在表达式中的解引用符 decltype(*p) c;//错误,解引用表达式,c的类型为引用必须初始化 //变量如果是加上括号,decltype的结果为引用 decltype((i)) d;//错误,int&类型必须初始化 decltype(((i))) d1 = i; //正确 decltype(i) e;//正确,e是一个未初始化的int
解引用操作符 :*,得到指针所指对象的引用
int ival; int *ip = &ival; int &iref = *ip; //*ip就是ival的引用,等价于 int &iref = ival
2.6 自定义数据结构,类和文件
自定义数据结构 :一组数据以及相关操作的集合
类定义:类定义可以是关键字 class 或 struct
默认继承访问权限不同,struct 是 public ,class 是 private
//数据成员定义了类对象的具体内容,每个对象有自己的一份拷贝 struct Sales_data{ std::string bookNo; unsigned units_sold =0; double pi =3.14; }; //类定义的最后需要加上分号
类使用
类通常定义在头文件中
#ifndef SALES_DATA_H#ifndef SALES_DATA_H#include<string>struct Sales_data{ std::string bookNo; unsigned units_sold =0; double pi =3.14; }; #endif
//*ip就是ival的引用,等价于 int &iref = ival
## 2.6 自定义数据结构,类和文件**自定义数据结构** :一组数据以及相关操作的集合 **类定义**:类定义可以是关键字 class 或 struct 默认继承访问权限不同,struct 是 public ,class 是 private ```c++//数据成员定义了类对象的具体内容,每个对象有自己的一份拷贝struct Sales_data{ std::string bookNo; unsigned units_sold = 0; double pi = 3.14;}; //类定义的最后需要加上分号
类使用
类通常定义在头文件中
#ifndef SALES_DATA_H#ifndef SALES_DATA_H#include<string>struct Sales_data{ std::string bookNo; unsigned units_sold =0; double pi =3.14; }; #endif
附 思维导图
第二章完整思维导图,便于记忆