6.1 参数传递
- 用指针来传递多维数组时,仍然需要传递二维的具体参数;
可变形参
- initializer_list
个人感觉就是一个容器?
- initializer_list
代码如下class Class1{ public: Class1(int a, initializer_list<int>b){} private: int a; int b; }; class Class2{ public: Class2(int a, int b){} private: int a; int b; }; int main(){ Class1 c1(1,{2}); Class2 c2(1,2); return 0; }
- 省略号
莫名把赋值与判断合并就会出错,就很气
想来第一个参数还是要的,没见过不加第一个参数的写法#include <string> #include <iostream> #include <cstdarg> using namespace std; void fun(int n, ...){ va_list vl; va_start(vl,n); int arg; do{ arg = va_arg(vl,int); cout<<arg; }while(arg !=0); cout<<endl; va_end(vl); } int main(){ fun(1,2,3,4,0); fun(1,2,3,0); return 0; }
- 省略号
6.2 return语句
- return返回初始化列表也是可以的(初始化列表欢乐多!);
using 相比于 typedef 的一大优越
typedef int arr[10];//arr表示长度为10的int数组 using arr = int[10];//等价 arr* f(int i); arr* g(arr &a){ return &a;//值得关注 } int (*p)[10] = f(1);
- 尾置返回与decltype
一大重要目的是降低阅读难度
- 尾置返回
int (*f(int i))[5]{}
此函数可被化简为如下简明形式
auto f(int i) -> int(*)[5]
- decltype
int a[5];
decltype(a) *f(int i){}
- 尾置返回
6.4 函数重载
- 顶层const不能作为重载的要素;
const_cast在重载中的应用
const string &shorterString(const string &s1, const string &s2) {return s1.size() <= s2.size() ? s1 : s2;} string &shorterString(string &s1, string &s2){ auto &r = shorterString(const_cast<const string&>(s1), const_cast<const string&>(s2)); return const_cast<string &>(r); }
6.5 特殊用途语言
默认实参
初始值不一定是字面值,也可以是表达式;constexpr函数
- 只能有一条return语句;
- 可以有形参,但必须也是常量表达式或字面值;
- 函数内部不允许执行任何操作,但可以有类型别名;
assert 与 NDEBUG
- assert:用于判定,为假输出信息并停止程序运行,否则什么也不做;
- NDEBUG:定义了即关闭调试状态
- 形如:#ifndef NDEBUG
- 几个预处理器定义的用于调试的变量
- func存放函数名字
- FILE存放文件名
- TIME存放编译时间
- DATE存放编译日期
6.6 函数指针
int f1(int a, int b){
return a;
}
int f2(int a, int b){
return b;
}
int main(){
int (*p[2])(int, int) ={f1, f2};
cout<<p[0](1,2)<<endl;
cout<<p[1](1,2)<<endl;
return 0;
}