//函数重载
顶层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 &);