C++ Primer 学习笔记_5_变量跟基本类型(续2)

C++ Primer 学习笔记_5_变量和基本类型(续2)

变量和基本类型



七、枚举

    枚举不但递归难以了整数常量集,而且还把它们聚集成组。

1、定义并初始化枚举

	//默认地,第一个枚举成员赋值为0,后面每个枚举成员赋的值比前一个大1.
	enum open_modes{input,output,append};

2、枚举成员是常量

    用来初始化枚举成员的值必须是一个常量表达式,常量表达式是编译器在编译时就能够计算出结果的整数表达式。

    枚举成员值可以是不唯一的:

	 enum Points {point2d = 2,point2w,
                point3d = 3,point3w
               };
    Points a = point3w;		//正确
    Points a = 4;		//错误

八、类类型

C++中,通过类来自定义数据类型。类定义了该类型的对象包含的数据和该类型的对象可以执行的操作。

1、从操作开始设计类

    在定义类时,通常是先定义类的接口,即该类所提供的操作,通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。

    定义Sales_item类:

class Sales_item
{
public:
	//...

private:
	std::string isbn;
	unsigned units_sold;
	double revenue;
};//不要忘记分号

2publicprivate访问标号控制类的成员在类外是否可以访问。

3、类的数据成员定义了该类类型对象的内容。

4、一般,不能把类成员的初始化作为其定义的一部分!!!

5、类的成员函数可以使用类的任何成员,而不管其访问权限。而不是类的组成部分的代码不能访问private成员!

6、用classstruct关键字定义类的唯一区别在于默认访问级别!


//P57 习题2.28,编译下列程序,注意出错信息
class Foo
{
	//empty
}

int main()
{
    return 0;
}

九、编写自己的头文件

    为了实现程序可以由多个文件组成,C++支持分别编译!

1 头文件一般包含:类的定义,extern变量声明和函数的声明

2、头文件的正确使用能够带来的好处:

    1)能够保证所有文件使用给定实体的同一个声明。

    2)当声明需要修改时,只有头文件需要修改。

    P58《编译和链接多个源文件》非常好,值得一读。


3、头文件用于声明而不是定义

   例外情况:

      1)头文件可以定义类

      2)值在编译时就已知的const对象

      3inline函数

  【这些实体可以在多个文件中定义,只要每个源文件中的定义是相同的】


4、一些const对象定义在头文件中

    1const变量默认是定义在该变量的文件的局部变量,因此,允许const变量定义在头文件中。

    而且,常量表达式是编译器在编译的时候就能够计算出结果的表达式。

    2)在实践中,大部分的编译器在编译时都会用相应的常量表达式来替换这些const变量的使用,所以,在实践中,不会有任何的存储空间用于存储用常量表达式初始化的const对象。

    3)如果const对象不是用常量表达式初始化的,那么他就不应该在头文件中定义。相反的,他的变量就应该和其他变量一样,在源文件中定义并初始化。而应该在头文件中添加extern生命,以使其能够被多个文件共享。

//P60习题2.32 下列哪些语句应该放在源文件中,哪些引该放在头文件中?
	int var;
	const double PI = 3.1415926;
	extern int total = 255;
	const double sq = squt(2.0);

5、避免多重包含

    1)、在设计头文件时,应该使其可以多次包含在同一个源文件中。我们必须保证多次包含同一个头文件不会应其该头文件的定义的类和对象被多次定义。通常我们需要使用头文件保护符(header guard)

    2)、#define表示接受一个名字并定义改名作为预处理器变量

    3)、为了保证头文件在更定的源文件中只处理过一次,我们首先检测#ifndef,如果预处理器未定义,那么跟在其后的所有指示都会被处理,直到#endif,如果#ifndef发现SALESITEM_H已经定义,那么程序会忽略该头文件的剩余部分。

    4)、头文件应该含有保护符!

    5)、我们可以用定义在头文件里面的实体(如类)来命名处理器变量来避免处理器变量重名的问题!

#ifndef SALESITEM_H
#define SALESITEM_H
//...
#endif // SALESITEM_H

6、使用自己的头文件

/*
* 标准头文件,编译器将会在预定义的位置来查找该头文件,
*当然该位置可以通过设置设置查找路径变量或者通过命令行选项来修改
*/
#include <standard_header>
/*
*如果文件名包含在””中,表名是非系统头文件,
*非系统头文件的查找通常开始于源文件所在路径
*/
#include "my_file.h"