c++函数扩展

//函数重载

顶层const不影响传入函数的对象

int lookup(int x);

int lookup(const int x);//这两个函数一样

 

int lookup(int *p);

int lookup(int const *p);//这两个函数一样

 

底层const会受影响

int lookup(int &);

int lookup(const int &);//函数不一样

 

int lookup(double *);

int lookup(const double &);//函数不一样

 

//使用const_cast可以改变常量为非常量

int &loop(const int &x)

{

return const_cast<int&>(x);

}

 

 

函数的默热实参

默认实参要放到参数最右边

void deffun(int x, int y, int z = 9)

{

cout << x << " " << y << "  " << z << endl;

}

deffun(1,2);

deffun(1, 2, 3);

 

//内联函数:会在调用点内联展开,内联机制用于优化规模小、流程直接、频繁调用的函数

inline const string & shorterStr(const string &str1, const string &str2)

{

return str1.size() < str2.size() ? str1 : str2;

}

cout << shorterStr("aaaa", "bbb") << endl;

 

 

cout << "=======constexpr函数==========================" << endl;

constexpr函数:能用于常量表达式的函数

函数的返回类型及所有形参的类型都得是字面值类型,而函数中必须只能有一个return

为了能在编译过程中随时展开,constexpr函数被隐式地指定为内联函数

constexpr int new_sz(int x) { return 42*x; }

 

int i = 3;

int x(new_sz(i));

int arr[new_sz(i)];//错误 i不是常量表达式

cout << x << endl;

 

cout << "=======函数匹配==========================" << endl;

函数匹配:显示寻找最合适的函数,如果没有进行实参类型转换,找最接近的,再没有提示错误

出现二义性也会提示错误

 

函数指针:函数指针指向某种特定类型,由函数的返回类型和参数类型共同决定,与函数名无关

bool lengthCompare(const string &, const string &);

bool (*pf)(const string &, const string &);

pf = lengthCompare;

pf = &lengthCompare;//取地址符可以忽略,类型必须精确匹配

bool b1 = pf("aaaaaa","bbbb");

bool b2 = (*pf)("aaaaaa", "bbbb");

bool b3 = lengthCompare("aaaaaa", "bbbb");//这三个是等价的,无须使用解引用指针

 

 

可以把函数作为实参使用

第三个参数为函数,会自动转换成指向函数的指针

void useBigger(const string &str1, const string&str2, bool pf(const string &, const string &));

显式的将形参定义成指向函数的指针

void useBigger(const string &str1, const string&str2, bool (*pf)(const string &, const string &));

useBigger("aaa", "bbb", lengthCompare);

 

可以使用别名来定义

函数类型

typedef bool Func(const string &, const string&);

typedef decltype(lengthCompare) Func2;//这两个等价

 

指针类型,因为decltype不会将函数类型自动转换成指针类型

typedef bool (*FuncP)(const string &, const string&);

typedef decltype(lengthCompare) *FuncP2;//这两个等价

 

void useBigger(const string &str1, const string &str2, Func);

void useBigger(const string &str1, const string &str2, FuncP2);

 

string::size_type sumLength(const string &, const string &);

string::size_type largerLength(const string &, const string &);

 

getLen返回的是sumLength类型的指针

decltype(sumLength) *getLen(const string &);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值