第二章 面向对象的编程风格

第二章 面向对象的编程风格

2.1 如何撰写函数

函数定义四要素:函数的返回类型、函数的名称、函数的参数列表、函数体

占位符(placeholder) 函数原型(function prototype)

exit() 头文件cstdlib

求某个类型的最小最大值,可查询标准程序库中的numeric_limits class

#include <limits>
cout << numeric_limits<int>::max();

巧用default

switch(pox){
    default:
    case 2:
        cout << "1 ";
    case 1:
        cout << "1 ";
        break;
}

当超过2的时候全部输出1 1

2.2 调用一个函数

传址(by reference)、传值(by value)

void display( const vector<int> &vec)
加上const可以让阅读程序的人了解,我们以传址的方式来传递vector,为的是避免复制操作,而不是为了在函数之中对它进行修改。
等同于 void display( const vector<int> *vec);
比较:
效果相同,传递的都是对象的地址。
用法不同,一个*号,一个&号
pointer可能(也可能不)指向某个实际对象。当我们提领pointer时,一定要先确定其值并非为0,至于reference则必定会代表某个对象,所以不须检查。

生存空间(scope) 生存范围(extent) 局部对象(local object)

内置类型的对象,如果定义在file scope之内,必定被初始化为0,但如果它们被定义于local scope之内,那么除非程序员指定其初值,否则不会被初始化。

heap memory(堆内存) new表达式的另一种形式允许我们指定初值
int *pi; pi = new int(1024); //这不是之前的构造函数语法么
delete pi; 不需要检验pi是否为零,编译器会替我们检查 if(pi != 0) //define NULL 0

2.3 提供默认参数值(Default Parameter Values)

调试时候用

默认参数值从最右边开始进行。
默认值只能指定一次,可以在函数声明处,也可以在定义处。一般放在声明处。

void bubble_sort( vector<int> &vec, ofstream *ofil = 0){    if(!ofil){...} }
bubble_sort(vec);//不会产生调试信息
ofstream ofil( "data.txt" );
bubble_sort(vec, &ofil);//会产生调试信息

void bubble_sort( vector<int> &vec,ostream &ofil=cout)
bubble_sort(vec, ofil);    //调用,不用加取值符

ostream    处理流,基类,写
istream    处理流,基类,读
iostream    处理流,基类,读写

ofstream   处理文件流,子类,写
ifstream    处理文件流,子类,读
fstream    处理文件流,子类,读写

istringstream    从string读取数据
ostringstream    向string写入数据
stringstream    读写string

头文件可为函数带来更高的可见度

2.4 使用局部静态变量(local static objects)

局部静态对象所处的内存空间,即使在不同的函数调用过程中,依然持续存在。

static vector< int > elems;
elems.push_back( elems[ix-1]+elems[ix-2] );

vector class 提供有内存自动管理机制,动态内存。

2.5 声明一个 inline 函数

体积小,常被调用
inline函数的定义常常被置于头文件中

类内定义的函数被默认成内联函数。关键字inline 必须与函数定义体放在一起才能使函数成为内联

2.6 提供重载函数(overloaded functions)

返回值、函数名相同,参数列表不同(类型不同,个数不同,顺序不同(string s1, int s2)和(int s2, string s1)(本质还是类型不同))

2.7 定义并使用template functions(模版函数)

将参数列表中指定的所有(或部分)参数的类型信息抽离出来

加入类型为ostream的第三参数,并将其预设参数值为 cout,是更具弹性的一种做法。

template <typename elemType>
void display_message( const string &msg, const vector<elemType> &vec){
    cout << msg;
    for ( int ix = 0; ix < vec.size(); ++ix ){
        elemType t = vec[ ix ];
        cout << t << ' ';
    }
}

管家次typename(必须写)表示,elemType(任意名称)在display_message()函数中仍是一个临时放置类型的代称。

模版函数的参数列表通常由两类类型构成,一类是明确的类型,另一类是暂缓决定的类型。

//模版再经重载:
template <typename elemType>
void display_message( const string &msg, const vector<elemType> &vec );

template <typename elemType>
void display_message( const string &msg, const list<elemType> &lt );

2.8 函数指针(pointers to functions)带来更大的弹性

必须指明其所指向函数的返回值类型及参数列表。

const vector<int>* (*seq_ptr)( int );

需要重视这个问题!!!!

2.9 设定头文件(header files)

extern 跨文件范围,其他文件也能访问

发现这个写的挺好的:http://www.cnblogs.com/mend/archive/2012/05/02/2479460.html

千万别指望有人理解你
原文地址:https://www.cnblogs.com/Rodge/p/5134828.html