变量和基本类型
七、枚举
枚举不但定义了整数常量集,并且还把它们聚集成组。 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码。 一看便知:
[cpp] view plaincopyprint?
- enum {input, output, append};
- const int input = 0;
- const int output = 1;
- const int append = 2;
enum {input, output, append}; const int input = 0; const int output = 1; const int append = 2;
1、定义并初始化枚举
[cpp] view plaincopyprint" class="About" href="http://blog.csdn.net/zjf280441589/article/details/22932157#">?
- //默认地,第一个枚举成员赋值为0,后面每一个枚举成员赋的值比前一个大1.
- enum open_modes{input,output,append};
//默认地,第一个枚举成员赋值为0,后面每一个枚举成员赋的值比前一个大1. enum open_modes{input,output,append};
2、枚举成员是常量
用来初始化枚举成员的值必须是一个常量表达式,常量表达式是编译器在编译时就行计算出结果的整数表达式。
枚举成员值能够是不唯一的:
[cpp] view plaincopyprint?
- enum Points {point2d = 2,point2w,
- point3d = 3,point3w
- };
- Points a = point3w; //正确
- Points a = 4; //错误
enum Points {point2d = 2,point2w, point3d = 3,point3w }; Points a = point3w; //正确 Points a = 4; //错误
八、类类型
C++中,通过类来自己定义数据类型。
类定义了该类型的对象包括的数据和该类型的对象能够运行的操作。
1、从操作開始设计类
在定义类时,一般是先定义类的接口。即该类所提供的操作,通过这些操作。能够决定该类完毕其功能所须要的数据,以及是否须要定义一些函数来支持该类的实现。
定义Sales_item类:
[cpp] view plaincopyprint?
- class Sales_item
- {
- public:
- //...
- private:
- std::string isbn;
- unsigned units_sold;
- double revenue;
- };//不要忘记分号
class Sales_item { public: //... private: std::string isbn; unsigned units_sold; double revenue; };//不要忘记分号
2、public与private訪问标号控制类的成员在类外能否够訪问。
3、类的数据成员定义了该类类型对象的内容。
4、一般,不能把类成员的初始化作为其定义的一部分!。。
5、类的成员函数能够使用类的不论什么成员,而无论其訪问权限。而不是类的组成部分的代码不能訪问private成员!
6、用class和structkeyword定义类的唯一差别在于默认訪问级别!
[cpp] view plaincopyprint?
- //P57 习题2.28,编译下列程序,注意出错信息
- class Foo
- {
- //empty
- }
- int main()
- {
- return 0;
- }
//P57 习题2.28,编译下列程序。注意出错信息 class Foo { //empty } int main() { return 0; }
九、编写自己的头文件
为了实现程序能够由多个文件组成。C++支持分别编译!
1、头文件一般包括:类的定义,extern变量声明和函数的声明
2、头文件的正确使用可以带来的优点:
1)可以保证全部文件使用给定实体的同一个声明。
2)当声明须要改动时。仅仅有头文件须要改动。
P58《编译和链接多个源文件》很好,值得一读。
3、头文件用于声明而不是定义
例外情况:
1)头文件能够定义类
2)值在编译时就已知的const对象
3)inline函数
【这些实体能够在多个文件里定义,仅仅要每一个源文件里的定义是同样的】
4、一些const对象定义在头文件里
1)const变量默认是定义在该变量的文件的局部变量,因此,同意const变量定义在头文件里。
并且,常量表达式是编译器在编译的时候就行计算出结果的表达式。
2)在实践中,大部分的编译器在编译时都会用对应的常量表达式来替换这些const变量的使用,所以,在实践中,不会有不论什么的存储空间用于存储用常量表达式初始化的const对象。
3)假设const对象不是用常量表达式初始化的。那么他就不应该在头文件里定义。相反的,他的变量就应该和其它变量一样。在源文件里定义并初始化。而应该在头文件里加入extern生命。以使其可以被多个文件共享。
[cpp] view plaincopyprint" class="About" href="http://blog.csdn.net/zjf280441589/article/details/22932157#">?
- //P60习题2.32 下列哪些语句应该放在源文件里,哪些引该放在头文件里?
- int var;
- const double PI = 3.1415926;
- extern int total = 255;
- const double sq = squt(2.0);
//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)、我们能够用定义在头文件中面的实体(如类)来命名处理器变量来避免处理器变量重名的问题!
[cpp] view plaincopyprint" class="About" href="http://blog.csdn.net/zjf280441589/article/details/22932157#">?
- #ifndef SALESITEM_H
- #define SALESITEM_H
- //...
- #endif // SALESITEM_H
#ifndef SALESITEM_H #define SALESITEM_H //... #endif // SALESITEM_H
6、使用自己的头文件
[cpp] view plaincopyprint?
- /*
- * 标准头文件。编译器将会在提前定义的位置来查找该头文件,
- *当然该位置能够通过设置设置查找路径变量或者通过命令行选项来改动
- */
- #include <standard_header>
- /*
- *假设文件名称包括在””中。表名是非系统头文件,
- *非系统头文件的查找通常開始于源文件所在路径
- */
- #include "my_file.h"