Const 引用
严格来说,“const 引用”的意思是“指向 const 对象的引用”。类似地,程序员使用术语“非 const 引用”表示指向非 const 类型的引用。
const 引用可以初始化为不同类型的对象或者初始化为右值
eg:
int i = 10;
const &pi1 = 11;
const &pi2 = i + pi1;
cosnt &pi3 = 11 + i + pi1;
同样的初始化对于非 const 引用却是不合法的,而且会导致编译时错误。
why:
对于不同类型的 const 引用:
double dpi = 3.14;
int &pi = dpi; //error
const int &pi = dpi; //ok
编译器会把这些代码转换成如以下形式的编码:
int tmp = dpi;
const int &pi = tmp;
所以当修改了dpi 的值以后,pi 的值仍为初始值:
makefile:
根据自己需求修改 SRC OBJ
输出:
3.14 3
4.30 3
既然已经知道了什么应该放在头文件中,那么我们下一个问题就是真正地编写头文件。我们知道要使用头文件,必须在源文件中#include该头文件。为了编写头文件,我们需要进一步理解 #include 指示是怎样工作的。#include 设施是C++ 预处理器的一部分。预处理器处理程序的源代码,在编译器之前运行。C++ 继承了 C 的非常精细的预处理器。现在的 C++ 程序以高度受限的方式使用预处理器。
#include 指示只接受一个参数:头文件名。预处理器用指定的头文件的内容替代每个 #include。我们自己的头文件存储在文件中。系统的头文件可能用特定于编译器的更高效的格式保存。无论头文件以何种格式保存,一般都含有支持分别编译所需的类定义及变量和函数的声明。
头文件经常 #include 其他头文件。头文件定义的实体经常使用其他头文件的设施。例如,定义 Sales_item 类的头文件必须包含 string 库。Sales_item 类含有一个 string 类型的数据成员,因此必须可以访问 string 头文件。
包含其他头文件是如此司空见惯,甚至一个头文件被多次包含进同一源文件也不稀奇。例如,使用 Sales_item 头文件的程序也可能使用 string 库。该程序不会(也不应该)知道 Sales_item 头文件使用了 string 库。在这种情况下,string 头文件被包含了两次:一次是通过程序本身直接包含,另一次是通过包含 Sales_item 头文件而间接包含。
因此,设计头文件时,应使其可以多次包含在同一源文件中,这一点很重要。我们必须保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。使得头文件安全的通用做法,是使用预处理器定义头文件保护符。头文件保护符用于避免在已经见到头文件的情况下重新处理该头文件的内容。
避免多重包含:
在编写头文件之前,我们需要引入一些额外的预处理器设施。预处理器允许我们自定义变量。
可以使用这些设施来预防多次包含同一头文件:
#ifndef SALESITEM_H
#define SALESITEM_H
// Definition of Sales_itemclass and related functions goes here
#endif
将库所定义的名字放至单独一个地方的机制。命名空间有助于避免无意的命名冲突。C++ 标准库所定义的名字在命名空间 std 中。
名字空间域就好比从不同的口袋拿工具,口袋1 口袋2都有扳手,using namespace 口袋1 那就使用口袋1中的扳手。
OK!一个简单的个人名字空间域:
zynamespace.h 定义了自己的一个printf 函数
在main 函数中进行调用
也可在main 前使用 using namespace zy
以后使用即可直接使用printf()输出
习惯了window下的file CFile 模式的文件操作. 今天发现一个很好用的流文件操作。fstream
#include <fstream>
using namespace std;
int main()
{
fstream cstr;
cstr.open(“able”, ios::out | ios::app);
cstr << “hello useful fstream” << endl;
cstr.close();
return 0;
}
make 以后就可以在当前目录生成一个文件able。
vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和 string 对象一样,标准库将负责管理与存储元素相关的内存。我们把 vector 称为容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。
使用 vector 之前,必须包含相应的头文件。本书给出的例子,都是假设已作了相应的 using 声明:
#include <vector>
using std::vector;
声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。以 vector 为例,必须说明 vector 保存何种对象的类型,通过将类型放在类型放在类模板名称后面的尖括号中来指定类型:
vector<int> ivec;
vector<Sales_item> Sales_vec;
vector 对象的定义和初始化:
vector 类定义了好几种构造函数,用来定义和初始化 vector 对象。
vector<int> v1; //定义默认构造为空的v1
vector<int> v2(v1); //v2是v1的一个副本
vector<int> v3(n,1); //v3包含值为1的n个元素
vector<int> v4(n); //v4包含值初始化的元素的n个副本
vector 对象的操作:
vector<int> v_i;
v_i.empty(); //判断是否为空
v_i.size(); //对象大小
v_i.push_back(T); //在v_i后添加一个T元素
v_i[n]; //返回v_i中n位的元素
= == < > != <= >= //操作符