1 范围for:
例:
vector <int> v={0,1,2,3,4,5,7,8};
for(auto &r : v)
r*=2;
范围for来源于:
for(auto beg=v.begin(),end=v.end();beg!=end;++beg)
{
auto &r=*beg;
r*=2;
}
因为范围for中使用了 v.end() ,所以范围for不可以用于给vector添加值;
2 分离式编译
文件为:factMain.cc、fact.cc、Chapter6.h
注意包含关系;main.cc、fact.cc分别包含fact.h文件;( Main.cc <-- Chapter.h---->fact.c)
编译过程:g++ factMain.c fact.cc -o main //得到可执行文件 main
//factMain.cc
#include "Chapter6.h" #include <iostream> int main() { std::cout << "5! is " << fact(5) << std::endl; std::cout << func() << std::endl; std::cout << abs(-9.78) << std::endl; }
//Chapter6.h
int fact(int val); int func(); template <typename T> T abs(T i) { return i >= 0 ? i : -i; }
//fact.cc
#include "Chapter6.h" #include <iostream> int fact(int val) { if (val == 0 || val == 1) return 1; else return val * fact(val-1); } int func() { int n, ret = 1; std::cout << "input a number: "; std::cin >> n; while (n > 1) ret *= n--; return ret; }
3 参数传递
调用函数时,子函数用传入的实参初始化形参;相等于 (int 形参=实参;)
问题;(形参=实参)形式的调用,会导致实参、形参失联;及形参值的改变不影响实参;
解决方法:
1 子函数用 return 返回所需值;
2 引用调用(推荐使用),及子函数这样定义(void fact(int &a,int &d));如此一来,(int &形参=实参;);该过程只是给原有的实参生命了别名,省内存;
3 指针形参,及子函数这样定义(void fact(int *a,int *d));如此一来,(int *形参=实参;),所以传入的实参也要是指针。该过程是产生新的指针,占用内存;
3.1 数组形参
3.2 main:处理命令行选项
main()函数位于可执行文件prog之内;int main(int argc,char *argv[]) { ... }int main (int argc, char **argv) { ... }第一个参数 argc:表示数字中字符串的个数;第二个参数argv:是一个数组,指向c风格字符串的指针;执行可执行文件prog的命令:prog infile outfileargc=3;argv[0]="prog";argv[1]="infile";
argv[2]="outfile";
4 内联函数
将函数指定为内联函数,可以使函数,在调用点展开;避免了非内联函数函数调用时的额外开销,适用于调用频繁的函数;
在子函数的返回值类型上,加上关键字inline,就可将它声明为内联函数:
如: