函数

来源:互联网 发布:封狼居胥有几人 知乎 编辑:程序博客网 时间:2024/06/05 01:57

  • 函数
    • 局部静态变量
    • 函数形参和实参
      • 传引用参数
      • 数组形参
      • 多维数组形参
      • 含有可变形参的函数
    • 函数返回
    • 函数重载
    • 函数指针

函数

局部静态变量

在程序第一次执行到此路径时进行初始化,并且到程序终止才销毁。

  • 例:
size_t count_calls(){    static size_t ctr = 0;    return ++ctr;}int main(){    for(int i = 0;i<10;i++)        cout<<count_calls()<<endl;    return 0;}

输出1到10的连续序列

  • 例:单例模式的一种实现方法,该实现方法无法释放系统资源
class Singleton{public:    Singleton* getInstance(){        static Singleton instance;        return &instance;    }private:    Singleton(){}};

函数形参和实参

传引用参数

  • 避免拷贝操作,在自定义类型时十分有用
  • 使用引用返回额外信息
/*由于C++返回值只能有一个,可以传入一个引用型的参数,将一个结果保留其中,使得函数能够返回额外的信息*/string::size_type fing_char(const string &s,char c,string::size_type &location);
  • 把不会改变的形参定义成普通引用(非const引用)是错误的
    • 使用普通引用限制了形参传入的可能性,有时候会导致编译错误

数组形参

  • 传入函数时,数组会被转换成指针
//几种等价的声明void print(const int*);void print(const int[]);void print(const int[10]);//注意,实际传入的参数可以不是10个元素//几种管理数组形参的方式//标准库规范void print(const int *beg,const int *end){    while(beg!=end)        cout<< *beg++ <<endl;}//指针+数组大小void print(const int *ia,size_t size){    for(size_t i = 0;i != size;i++)        cout<<ia[i]<<endl;}

多维数组形参

  • 数组第二维及其之后的纬度是数组类型的一部分,不可以省略
//matrix是一个指向由十个整数构成的数组的指针void print(int (*matirx)[10],size_t rowSize);//等价定义void print(int matrix[][10],size_t rowSize);
  • 命令行选项利用了多维数组形参

含有可变形参的函数

  • initializer_list形参
    • 用于实参数量未知但是类型是相同时
    • 与vector不同的是 initializer_list中的元素永远是常量值,不可改变
//声明void error_msg(ErrorCode e,intitializer_list list);//使用initializer_list时,一般使用花括号传参error_msg(ErrorCode(42),{"stackoverflow"});

函数返回

  • 函数返回一个值的方式和初始化一个变量或形参的方式一样
  • 不要返回局部对象的引用或指针

函数重载

顶层const和底层const
底层const的概念仅限于指针和引用,当指针或引用所指的对象是常量的,我们称这种const为底层const

const int i = 10;//顶层constconst int &j = i;//底层constconst int *k = &i;//底层constint* const p = &i;;//顶层const
  • 在重载时,顶层const是无用的,底层const有作用
Record lookup(Phone);Record lookup(const Phone);//重复声明Record lookup(const Phone*);Record lookup(Phone*);//新函数
  • 利用const_cast来减少函数重载代码量
//假设已经有了cosnt string& &shorterString(const string//&s1,const string &s2);的实现string &shorterString(string &s1,string &s2){    auto &r = shorterString(const_cast<const string&>(s1),    const_cast<const string&>(s2));    return const_cast<string&>(r);}

函数指针

//pf指向一个函数,该函数的参数是两个const string&,返回值是boolbool (*pf)(const string &,const string &);
1 0
原创粉丝点击