函数

函数

局部静态变量

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

  • 例:
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;//顶层const
const int &j = i;//底层const
const int *k = &i;//底层const
int* 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&,返回值是bool
bool (*pf)(const string &,const string &);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值