6.36 string (*func(int i))[10]
#include <iostream>
#include <vector>
using namespace std;
static string str[10] = {"0","1","2","3","4","5","6","7","8","9"};
string (*func(int i))[10]{
return &str;
}
int main() {
string (*strP)[10] = func(10);
for(size_t i = 0 ; i < 10 ; i ++){
cout<<((*strP)[i]).c_str()<<endl;
}
for(;;);
return 0;
}
6.37:
typedef:
typedef string strTypedef[10];
strTypedef *func(int i) {
return &str;
}
后置
auto func(int i)->string(*)[10]{
return &str;
}
decltype
decltype(&str) func(int i){
return &str;
}
个人喜欢后置型,可以不关注函数的整体结构,就可以清晰的了解返回值的类型
6.38
decltype(str) &arrPtr() {
return str;
}
string (&strP)[10] = arrPtr();
6.39
a:第二条声明函数的参数列表为顶层const,与第一条重复
b.仅仅是返回类型不同,无法表示重载
c.正确,
第一条传入int指针,返回int指针
第二条传入double指针,返回double指针
6.40
b是错误的,当形参被赋予默认实参时,该形参的右侧形参也必须有默认实参
6.41
a.是非法的,函数参数列表中并非所有参数都有默认实参,第一个参数必须传入
b.正确
c.与语义不符,'*'会默认转换成int整形传入,虽不非法,但不符合初衷
6.42
string make_plural(size_t ctr, const string& word = "s", const string& end = "") {
return (ctr>1)? word+end:word;
}
6.43
a的声明和定义都放头文件
b则拆开
6.44
inline bool
isShorter(const string& s1, const string& s2){
return s1.size()> s2.size();
}
6.45,当函数为规模较小,流程直接,频繁调用的情况时,可改写成内联函数
6.46.当传入参数为常量表达式时,可以改写