notes/ch06.md
(),作用于一个表达式,该表达式是函数或者指向函数的指针。void表示函数不返回任何值。函数的返回类型不能是数组类型或者函数类型,但可以是指向数组或者函数的指针。static类型的局部变量,生命周期贯穿函数调用前后。CC a.cc b.cc直接编译生成可执行文件;CC -c a.cc b.cc编译生成对象代码a.o b.o; CC a.o b.o编译生成可执行文件。C++建议使用引用类型的形参代替指针。void swap(int &v1, int &v2)const被忽略。void func(const int i);调用时既可以传入const int也可以传入int。const对象,但是反过来不行。int main(int argc, char *argv[]){...}initializer_list提供的操作(C++11):
| 操作 | 解释 |
|---|---|
initializer_list<T> lst; | 默认初始化;T类型元素的空列表 |
initializer_list<T> lst{a,b,c...}; | lst的元素数量和初始值一样多;lst的元素是对应初始值的副本;列表中的元素是const。 |
lst2(lst) | 拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本共享元素。 |
lst2 = lst | 同上 |
lst.size() | 列表中的元素数量 |
lst.begin() | 返回指向lst中首元素的指针 |
lst.end() | 返回指向lst中微元素下一位置的指针 |
initializer_list使用demo:
void err_msg(ErrCode e, initializer_list<string> il){
cout << e.msg << endl;
for (auto bed = il.begin(); beg != il.end(); ++ beg)
cout << *beg << " ";
cout << endl;
}
err_msg(ErrCode(0), {"functionX", "okay});
initializer_list的标准库类型。可变参数模板。...,便于C++访问某些C代码,这些C代码使用了 varargs的C标准功能。没有返回值的 return语句只能用在返回类型是 void的函数中,返回 void的函数不要求非得有 return语句。
return语句的返回值的类型必须和函数的返回类型相同,或者能够隐式地转换成函数的返回类型。C++11)return,编译器将隐式地插入一条返回0的return语句。返回0代表执行成功。Type (*function (parameter_list))[dimension]typedef int arrT[10]; 或者 using arrT = int[10;],然后 arrT* func() {...}decltype: decltype(odd) *arrPtr(int i) {...}->开始:auto func(int i) -> int(*)[10](C++11)main函数不能重载。Record lookup(Phone* const)和 Record lookup(Phone*)无法区分。Record lookup(Account*)和 Record lookup(const Account*)可以区分。string screen(sz ht = 24, sz wid = 80, char backgrnd = ' ');inline函数可以避免函数调用的开销,可以让编译器在编译时内联地展开该函数。inline函数应该在头文件中定义。constexpr int new_sz() {return 42;}constexpr函数应该在头文件中定义。assert预处理宏(preprocessor macro):assert(expr);开关调试状态:
CC -D NDEBUG main.c可以定义这个变量NDEBUG。
void print(){
#ifndef NDEBUG
cerr << __func__ << "..." << endl;
#endif
}
bool (*pf)(const string &, const string &); 注:两端的括号不可少。decltype。