1.返回数组的指针:
1)函数可以返回数组的指针或引用 : int (* func ( int i ) ) [10] 表示:func这个函数需要一个int实参,并且我们可以对函数调用后的结果进行
解引用,并且解引用之后得到的是一个大小为10,元素类型为int型的数组。
2)也可以使用尾置返回类型:尾置返回类型跟在形参列表后面并以一个 -> 符号开头,例如: auto func(int) -> int (*) [10] ,(让我想起了Swift
c++11
2.重载:
1)通过typedef or using new_type= old_type 的类型不能构成重载函数。
例子:
typedef size std::vector<int>::size;
auto func1(const size&);
auto funn1(const std::vector<int>::size&);
上面的一组函数是同一个函数。
除了返回类型不一样,形参表一样的函数,是一个错误,而不是一个重载。
2)在作用域里面声明函数,会覆盖外层函数(bad choice),c++的名字查找发生在类型检查之前。
3)默认实参:一旦某个姓餐被赋予了默认值,那么它后面的所有形参都必须有默认值。因为默认实参负责填补函数调用缺少的尾部实参,而不是哪里空缺填哪里。
4)顶层const 的形参无法和一个non_const 的形参区分开来,只有拥有底层const 的形参可以和 non_const 的形参区分开来。
3.constexpr 函数:指能用于常量表达式的函数,函数的返回类型及所有的形参的类型都得是字面值类型,并且函数体里面有且仅有一条return语句,
constexpr 函数被隐式地指定为内联函数,并且constexpr函数不一定返回常量表达式(?)。
4.函数指针:
1)例子:
bool lengthCompare(const std::string& first, const std::string& second);
bool (*pf)(const std::string&, const std::string&);
pf = lengthCompare;
pf = &lengthCompare;
bool b1 = pf("as","df");
bool b2 = pf("as","df");
bool b3 = lengthCompare("as","df");
第一行声明一个函数,接受两个const 的string类型的引用
第二行声明一个函数指针,表示这个pf是一个指向接受两个const 的string类型的引用的函数的指针
接下来两行是等价的pf指针初始化,当我们把函数名作为一个值使用时,该函数自动地转化为指针
接下来三行是等价的同一个函数的调用,pf照样有着解引用操作。
2)指向不同函数类型的指针间不存在转换规则,一旦声明了指针所指向的函数的返回类型和形参表,那么其他不匹配的返回类型和形参表的函数
就不能赋值给该指针。
3)函数指针形参:我们不能定义函数类型的形参,但是形参可以是指向函数的指针。
4)返回指向函数的指针:using PF = int (*) (int*,int) 这个声明表示的是: PF是这么一个类型:指向 接受两个参数,一个是int类型指针,一个是int 类型
并且返回int类型的函数 的 指针。
怎么使用:
PF func(int) : 相当于 func是一个函数,接受一个int型参数,返回一个指向 接受两个参数,一个是int类型 指针,一个是int类型并且返回int类型
的函数的指针。
我们使用尾置返回类型的方式更清晰: auto f1(int) -> int (*) (int* ,int);这种更加容易读清楚。