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


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

    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

    千万别指望有人理解你
  • 相关阅读:
    jpa summary
    web service 参考文档
    jap 事务总结
    jap 事务
    PriorityQueue优先队列深入解析(含源码分析,方法使用)
    【LeetCode】703.数据流中的第K大元素(二叉搜索树解法,java实现)
    做移动端的你竟然不知道Flex布局?快来看看!
    【LeetCode】450.删除二叉搜索树中的节点(java实现,详细图解)
    #linux vscode 保存总提示“Retry as sudo”
    java 面向对象(十八):包装类的使用
  • 原文地址:https://www.cnblogs.com/Rodge/p/5134828.html
Copyright © 2020-2023  润新知