函数
来源:互联网 发布:封狼居胥有几人 知乎 编辑:程序博客网 时间: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