首页 > 编程 > C++ > 正文

庖丁解牛<c++primer>系列三:类型别名和自定义数据结构

2019-11-06 07:07:50
字体:
来源:转载
供稿:网友

随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性体现在两个方面。一是一些类型难于“拼写”,它们的名字既难记又容易写错,还无法明确体现其真实目的和含义。二是有时候根本搞不清到底需要什么类型,不得不回过头从程序的上下文中寻求帮助**

类型别名(type alias)是一个名字,它是某种类型的同义词。 主要分为typedef关键字和别名声明两部分。

typedef关键字typedef double wages; //wages和double是同义词,所表达的意思一样typedef wages base, *p; //base和double是同义词,*p和double *是同义词别名声明(alias declaration): 用using关键字作为别名声明的开始,后紧跟别名和等号。using SI= Sales_item; //SI和Sales_item 是同义词

auto类型说明符(c++11新标准):让编译器替我们去分析表达式所属的类型,而且必须有初始值。

auto item=val1+val2;//由val1和val2相加的结果可以推断出item的类型atuo i=0,*p=&i; //正确,i是整数,p是整形指针atuo sz=0,pi=3.14; //错误,sz和pi的类型不一致const int ci=i, &cr=ci;auto b=ci; //b是一个整数auto c=cr; //c是一个整数auto d=&i; //d是一个整形指针auto e=&ci; //e是一个指向整数常量的指针const atuo f=ci; //f是const int

decltype类型指针,作用是选择并返回操作数的数据类型 decltype(f()) sum=x; //sum类型就是说函数f的返回类型

在处理顶层const和引用时,如果decltype使用的表达式是一个变量,则decltype返回该变量的类型。

const int ci=0,&cj=ci;decltype(ci) x=0; //x的类型为const intdecltype(cj) y=x; //y的类型是const int&,y绑定变量xdecltype(cj) z; //错误:z是一个引用,必须初始化//decltype的结果是可以引用的类型int i=42,*p=&i,&r=i;decltype(r+0) b; //正确:加法的结果是int,因此b是intdecltype(*p) c; //错误,c是int&,必须初始化

自定义数据结构 数据结构是把一组相关的数据元素组织起来然后使用它们的策略和方法。C++允许用户以类的形式自定义数据结构,诸如string、istream等也都是以类的形式定义的。 注意:类右侧表示结束的花括号必须写一个分号,这是因为类体后面可以紧跟变量名表示对该类型对象的定义。

struct Sales_data{/*...*/};Sales_data accum,trans,*salesptr;

数据成员(data menber),类的数据成员定义了类的对象的具体内容,每个对象有自己的一份数据成员拷贝。修改一个对象的数据成员,不会影响其它对象。 定义数据成员的方法和定义普通变量一样:首先说明一个基本类型,随后紧跟一个或多个声明符。

头文件:为了确保各个文件钟类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字必须与类的名字一样。例如:库类型string在名为string的头文件钟定义。 注意:头文件一旦被改变,相关的源文件必须重新编译以获得更新过的声明。 预处理器(PReprocessor):确保头文件多次包含仍能够安全的工作,预处理器是在编译之前执行的一段程序,可以部分地改变我们所写的程序,比如常用的#include,当预处理器看到#include标记的时候就会用指定头文件的内容代替#include。 头文件保护符(header guard),头文件保护符依赖预处理变量,分为已定义和未定义两种状态。#define指令把一个名字设定为预处理变量,另外两个指令则分别检查某个指定的预处理变量是否已经定义;#ifdef当且仅当已定义为真时,#ifdef当且仅当未定义为真时。一旦检查结果为真,则执行后续操作直到遇到#endif结束。

#ifndef SALES_DATA_H#define SALES_DATA_H#include<string>struct Sales_data{ std::string bookNo; unsigned units_sold=0; double revenue-0.0;};#endif

第一次包含Sales_data.h时,#ifndef检查结果为真,预处理器将顺序执行后面内容直到遇到#endif结束。这时候预处理变量SALES_DATA_H的值变为已经定义,而且Sales_data.h也会被拷贝到我们程序中,如果再包含Sales_data.h则#ifndef的检查结果为假,后面不再执行#ifndef到#endif内容。 预处理器变量无视C++语言中关于作用域的规则。为了避免与程序中其它实体发生冲突,一般把预处理器变量名字全部大写。 提醒:头文件没有被包含在任何其他头文件中,也应该设置保护符。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选