c++函数扩展

it2025-03-31  25

//函数重载

顶层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)