C++引用/枚举/typedef/头文件/预编译器/自定义头文件

来源:互联网 发布:ubuntu 笔记本 编辑:程序博客网 时间:2024/05/29 14:38

引用是别名
int &refVal2;//引用类型定义必须初始化
int &refVal3 = 10;//引用初始化必须是对象
当初始化后,只要改引用存在,他就保持绑定到初始化时指向的对象。不可能将引用绑定到另一个对象。
要理解重要概念是引用只是对象的另一个名字。
初始化是指明引用指向哪个对象的唯一方法。

定义多个引用
可以在一个类型定义行中定义多个引用。必须在每个引用标识符前添加”&”符号。

const引用 //————需要仔细研读
指向const对象的引用。
const int ival = 1024;
const int &refVal = iVal;
int &ref2 = ival// error: const引用指向const对象。
const引用可以初始化不同类型对象或者初始化为右值。
const 引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量。
int i = 42;
const int &r = 42;
const int &r2 = r + i;
同样的初始化对于非const引用却是不合法的,而且会导致编译时错误。其原因非常微妙,值得解释一下。
引用绑定到不同的类型时所发生的事情,最容易理解为上述行为。假如我们编写。
double dval = 3.14
const int &ref = dval;
编译器会把这些代码转换为以下形式编码:
int temp = dval ;
const int &ri = temp;
如果 ri不是const ,那么可以给ri赋一个新值。这样做不会修改dval,而修改了temp。期望对ri的赋值会修改dval的程序员会发现dval并没有向被修改。
仅允许const引用绑定到需要临时使用的值完全避免了这个问题,因为const是只读的。

typedef 可以用来定义类型的同义词
typedef double wages;
typedef int exam_score;
typedef wages salary;
typedef 通常被用于三点目的:
为了隐藏特定类型的实现,强调使用类型目的
简化复杂的类型定义,使其更易理解
允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。

枚举
我们经常需要为某些属性定义一组可选择的值。例如,文件打开的状态可能会有三种:输入、输出和追加。
定义和初始化枚举:枚举的定义包括关键字,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员。
默认的,第一个枚举成员赋值为0,后面的每个枚举成员赋值的值比前面的大1.
枚举成员是常量

class关键字与struct关键字的区别。
class关键字来定义类,第一个访问标号前的任何成员都隐式指定为private,
struct关键字定义类,第一个标号前的任何成员都隐式指定为public。使用class或者是struct定义类,仅仅影响默认的初始访问级别。

头文件
头文件一般包括类的定义,extern,变量的声明和函数的声明。
头文件的正确使用能够带来两个好处:保证所有文件使用给定实体的统一声明;当生命需要修改时,只有头文件需要更新。
设计头文件还学要主意以下几点:头文件中所能做的声明在逻辑上应该是适于放在一起的。
编译头文件需要一定的时间。如果头文件太大,程序员可能不太愿意承受包含该头文件所带来的编译时代价。
头文件用于生命而不是用于定义
语句的定义不应该放在头文件里。
应为头文件包含在多个源文件里,所以不应该含有变量或函数的定义。
对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、之在编译时就已知的const对象和inline函数。
在头文件中定义这些实体,是因为编译器需要它们的定义来产生代码。
例如:为了产生能定义或使用类的对象的代码,编译器需要知道组成该类型的数据成员。同样还需要知道能够在这些对象上执行的操作。类定义提供所需要的信息。
一些const对象定义在头文件中
一般来说,常量表达式是 编译器在编译时就能计算出结果的表达式。当const整形变量通过常量表达式自我初始化时,这个const整型变量就可能是常量表达式。
而const变量和他的初始化式必须是每个文件都可见的。要使初始化式可见,一般都把这样的const变量定义在头文件中。
那样的话,无论const变量何时使用,编译器都能够看见其初始化形式。

const变量放入头文件有一个很重要的含义:当我们在头文件定义了一个const变量之后,每个包含该头文件的源文件都有了自己的const变量,其名称和值都一样。
当const变量是用于常量表达式初始化时,可以保证所有的变量都有相同的值。但实践中,大部分的编译器在编译时都会用相应的常量表达式来替换对那些const常量的使用。
所以,在实践中不会有任何存储空间用于存储用常量表达式初始化的const常量
如果const变量不是用常量表达式初始化,那么他就不应该在头文件中定义。相反,和其他的变量一样const变量应该在一个源文件中定义并初始化。
应在头文件中为它添加extern声明以使其能被多个文件共享。

预处理器的简单介绍
设计头文件时,应使其可以多次包含在同一源文件中,这一点很重要。我们必须保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。
使得头文件安全通过的通用做法,是使用预处理器定义头文件保护符。
避免多重包含。
编译头文件之前,我们需要引入一些额外的预处理器设施。预处理器允许我们自定义变量。
预处理器的名字在程序中必须是唯一的。任何与预处理器变量相匹配的的名字的使用都关联到该预处理器变量
预处理器有两种状态:已定义或未定义。
定义预处理器变量和检测其状态所用的预处理器指示不同.

头文件保护符

ifdef SALESTIEM_H#define SALESTIEM_H#endif

define 指示接受 一个名字并定义改名字为预处理器变量。 #ifndef指示检测指定的预处理器变量是否未定义。如果预处理器未定义,那么跟在其后的所有指示都被处理,直到出现#endif

使用自定义的头文件
如果头文件名包括在尖括号里(<>),那么认为该头文件是标准文件。编译器会在预定义位置集查找该头文件,
这些预定义位置可以通过设置查找路径环境变量或者通过命令行选项来修改,使用的查找方法因编译器的不同而迥异。
如果头文件括在一对引号里,那么认为他是非系统头文件,非系统头文件的查找通常开始于源文件所在的路径。

原创粉丝点击