Java程序员的C++回归路 (7)

除此之外,还可以使用NDEBUG来编写一些根据NDEBUG的值判断是否执行的代码:

#ifndef NDEBUG
#endif

如果NDEBUG没有定义,则上面块中的代码将被执行。

C++预处理器提供了一些用于调试的变量:

__func__ 当前函数

__FILE__ 当前文件

__LINE__ 当前行

DATE 编译日期

TIME 编译时间

重载

函数重载的选择:所有数学转换优先级都是相等的,如:

void test(float f);
void test(long l);
//调用test(1)时会出现ambiguous

C++中不能将const类型的引用赋值给普通类型的引用(暂时可以助记为初始化常量引用时的限制没有普通引用多)

函数指针

定义类型: bool (*pf)(const string&)

可以直接使用函数指针来调用函数,而不需要进行解引用:

bool (*pf)(const string&);
pf("hello");
(*pf)("hello");

给函数指针赋值时,需要返回值类型和参数类型完全一致才可以赋值,函数指针之间不存在指针的转换

函数指针指向重载函数时,需要指定具体使用的函数,通过确定的变量

函数指针作为参数,可以直接使用函数作为参数,该函数实际上会作为一个指针来处理:

void test(bool pf(const string&));
void test(bool (*pf)(const string&));

或者,也可以使用typedef和decltype来简化代码:

//Func和Func2是函数类型
typedef bool Func(const string&);
typedef decltype(test) Func2;

//Funcp和Funcp2是函数指针类型
typedef bool(*Funcp)(const string&);
typedef decltype(test) *Funcp2;

返回指针类型


//声明函数指针
using F = int(int*);  // F是一个函数类型,而不是一个函数指针
using PF = int(*)(int*);  // PF是函数指针
//定义函数指针
PF f1(int);
F *f1(int);
//上面的定义等于:
int (*f1(int))(int*);
//可以使用auto和decltype
auto f1(int) -> int(*)(int*)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzpps.html