C++ primer第六章
1 引用的底层实现是指针常量 int* const
但是指针常量>引用 比如数组就不可以用引用的方式,比如int &arr[] 这样会导致arr[0] = 8 ,程序不知道是将数组下标0的内容置为8,还是所引用的值置为8.
2 函数传参的时候会忽略顶层const
3 函数传参的时候,如果不改变参数的值,还是设置为常量比较好,这样可以传入字符串字面值
4
编写一个函数声明,使其返回数组的引用并且该数组包含10个string对象。不用使用尾置返回类型、decltype或者类型别名。
std::string (&fun(std::string (&arrs)[10]))[10];
5
为上一题的函数再写三个声明,一个使用类型别名,另一个使用尾置返回类型,最后一个使用decltype关键字。你觉得哪种形式最好?为什么?
using ARRS = std::string[10];
ARRS &fun(ARRS &arrs);
auto fun(std::string (&arrs)[10]) -> std::string (&)[10];
std::string arrs1[10];
decltype(arrs1) &fun(decltype(arrs1) &arrs);
using 最简洁
6
int ff(int a, int b = 0, int c = 0);
char* init(int ht = 24, int wd, char bckgrnd);
第一条声明是正确的。
第二条声明是错误的,因为形参ht被赋予了默认值,那么它后面的所有形参wd,bckgrnd必须要有默认值。
7
char* init(int ht, int wd = 80, char bckgrnd = ' ');
int main() {
init(); //错误:第一个形参没有初始化
init(24, 10); //正确
init(14, '*'); //正确:但是与程序员意图不符合,等价于init(14,'*',' ')
//此处是将char类型转换成int类型再初始化了wd
init(14,80, '*'); //更改后
}
8
内联函数在程序中可以多次定义,它的多个定义必须完全一致,所以放在头文件中比较好;
9
不能。
因为constexpr函数要求返回值类型一定是constexpr类型。而s1.size()<s2.size()无法构成常量表达式,原因有下:
1、constexpr关键字不能进行强制类型转换:即无法将s1.size()<s2.size()的结果强制转成constexpr类型。
2、虽然s1.size()<s2.size()的结果可以强制转换成常量类型,但由于常量≠常量表达式,即const≠constexpr,原因是:一个常量可能在运行时才能确定值,而常量表达式要求在编译阶段就确定值。因此在这里s1.size()<s2.size()无法构成常量表达式(它们在运行时才能确定值,只可能转成常量)
10
using pf = int(*)(int,int);
vecotr<pf> vec;//6.54
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int divide(int a, int b) { return b != 0 ? a / b : 0; }
int main()
{
vector<int (*)(int, int)> vf{add, subtract, multiply, divide};
for(const auto &e : vf) cout << e(4, 2) << endl;
return 0;
}//6.56
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理