随笔-5  评论-3  文章-2  trackbacks-0

常量引用参数:
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 苍羽 阅读(351) 评论(0)  编辑 收藏 引用 所属分类: 读书笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理