常量引用参数:
example:
const Employee& e
目的:定义一个参数,将其绑定到函数调用时传入的变量,从而避免函数参数传递时复制变量的开销。
ps:一般来说,在形参面前加上const&对对象来说是值得的,而对数值类型并不好。因为对于整形数字和浮点型数字来说,使用常量引用参数比使用值参数要慢。
////////////////////////////////////////
代码段注释
#if 0
//code..
#endif
这段代码不参加编译,若想临时引入改段代码,可以将#if 0改成 #if 1。与/*...*/不同,#if...#endif可以嵌套使用。
///////////////////////////////////////
空桩函数:实现为空,只是给出接口描述
example:
/**
Turns a digit into its English name.
@param n an integer between 1 and 9
@return the name of n ("one"..."nine")
*/
string digit_name(int n)
{
return "numble";
}
//////////////////
断言:
assert(expression);
example: assert(x>=0);
目的:如果表达式为真,则什么都不做;否则,则终止程序,显示当前出错的文件、代码行号和表达式。
编写程序时应该注意的问题:
1、给出所有输入值的前提条件(precondition),把函数不能接收的输入值清楚的在注释@param中描述 出来
2、在函数中加入assert语句,保证输入值满足前提条件。
3、保证在输入值满足前提条件时,函数能返回正确的结果。
example:
/**
Computes the value of an investment with compound interest.
@param initial_balance the initial value of the investment
@param p the interest rate in percent; must be >=0
@param n the number of periods the investment is held;must be >=0
@return the balance after n periods
*/
double future_value(double initial_balance, double p, int n)
{
assert(p>=0);
assert(n>=0);
return initial_balance * pow(1 + p / 100, n);
}
///////////////////////////////////
所有的访问成员函数(不修改隐式参数的数据成员的成员函数)都应该用const关键字来声明。只读
///////////////////////////////////
#ifndef procuct_h
#define procuct_h
....
#endif
防止重复定义
/////////////////////////////////////
尽量不用switch
/////////////////////////////////////
编码前设计测试用例
///////////////////////////////
释放动态数组
delete[] staff;
///////////////////////////////
创建和优化 vector
每一个 STL 容器都具备一个分配器(allocator),它是一个内建的内存管理器,能自动按需要重新分配容器的存储空间。因此,上面的程序可以得到大大简化,并摆脱 reallocator 函数。
第一步:创建 vector
用 vector 对象取代内建的数组来保存获取的数据。main() 中的循环读取 ISBN,检查它是否为 0,如果不为 0 ,则通过调用 push_back() 成员函数将值插入
vector: #include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <int> vi;
int isbn;
while(true)
{
cout << "enter an ISBN; press 0 to stop ";
cin >> isbn;
if (isbn==0)
break;
vi.push_back(isbn); // insert element into vector
}
}
在 vector 对象构造期间,它先分配一个由其实现定义的默认的缓存大小。一般 vector 分配的数据存储初始空间是 64-256 存储槽(slots)。当 vector 感觉存储空间不够时,它会自动重新分配更多的内存。实际上,只要你愿意,你可以调用 push_back() 任何多次,甚至都不用知道一次又一次的分配是在哪里发生的。
为了存取 vector 元素,使用重载的 [] 操作符。下列循环在屏幕上显示所有 vector 元素:
for (int n=0; n<vi.size(); ++n)
{
cout<<"ISBN: "<<vi[n]<<endl;
}
第二步:优化
在大多数情况下,你应该让 vector 自动管理自己的内存,就像我们在上面程序中所做的那样。但是,在注重时间的任务中,改写默认的分配方案也是很有用的。假设我们预先知道 ISBNs 的数量至少有 2000。那么就可以在对象构造期间指出容量,以便 vector 具有至少 2000 个元素的容量:
vector <int> vi(2000); // 初始容量为 2000 个元素
除此之外,我们还可以调用 resize() 成员函数:
vi.resize(2000);// 建立不小于 2000 个元素的空间
这样,便避免了中间的再分配,从而提高了效率。
////////////////////////////////////////////////////
使用字符数组和指针来操作字符串不仅麻烦而且容易出错。而string类可以安全方便地操作字符串。
/////////////////////////////////////////////
私有继承违背了继承机制的初衷——派生类对象拥有基类对象的功能。在派生类的定义中,应该总是使用公有继承,即加上关键字 public。
/////////////////////////////////////////////////
带有基类构造函数的派生类构造函数的定义
example:
Manager::Manager(string name, double salary, string dept)
:Employee(name, salary)
{
department = dept;
}
目的:在派生类构造函数的函数体执行之前,通过基类构造函数初始化基类数据成员。
/////////////////////////////////////////////////
最好将所有数据成员声明为私有。如果想给予派生类成员函数以访问基类私有数据的权限,可以考虑在基类中提供受保护的访问函数。
///////////////////////////////////////////////
读写文本文件
1 ifstream input_data;
2 input_data.open("input.dat");
3 int n;
double x;
input_data >> n >> x;
string s;
input_data >> s;/* read a word */
getline(input_data, s);/* read a line */
char ch;
input_data.get(ch);
if('0' <= ch && ch <= '9')/* it was digit */
{
input_data.unget();/* oops--didn't want to read it */
int n;
input_data >> n;/* read integer starting with ch*
}
4 input_data.close();
1 ofstream output_data;
2 output_data.open("output.dat");
3 output_data << n << " " << x << "\n";
output_data.put(ch);
4 output_data.close();
1 fstream datafile;
2 datafile.open("employee.dat");
///////////////////////////////////////////////
考虑类的定义次序时一般遵循如下规则:
◎如果一个类A中包含另一个类B的对象作为数据成员,则类B必须在类A定义之前定义;
◎如果一个类A中包含另一个类B的指针作为数据成员,则必须在类A的定义之前出现类B的定义(definition)或者声明(declaration)。
posted on 2006-03-15 15:15
苍羽 阅读(347)
评论(0) 编辑 收藏 引用 所属分类:
读书笔记