一、分离式编译
分离式编译允许我们把程序分割到几个文件中去,每个文件独立编译。
-c和-o都是gcc编译器的可选参数。-c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件,一般是.o文件。-o用于指定输出(out)文件名。不用-o的话,一般会在当前文件夹下生成默认的a.out文件作为可执行程序。
二、(1)使用引用参数,当我们的参数很大或者根本无法拷贝时(因为值参数需要将实参拷贝给形参)使用引用参数就很好的解决了这个问题,并且尽量去使用引用参数而不是指针参数。
(2)使用形参返回额外信息
其实就是在函数多加了一个形参,因为可以直接利用引用参数改变实参的值,所以在函数中我们可以把引用参数的值改变以达到改变实参的值。而获得函数中想要得到的值。
1 int Temp(int &count, string &s) 2 { 3 auto temp = s.size(); 4 for (size_t i = 0; i != temp; i++) 5 { 6 s[i] = 'F'; 7 count++; 8 } 9 return count; 10 }
从这个函数中我们可以得到count的值和s的值。
(3)、尽量使用常量引用,来避免一些不必要的错误。
三、数组作为形参的时候,其实编译器把数组转化成了指针。数组也可以作为引用形参,但是应该注意是 sum(int (&temp)[5]){} ,而不是int &temp[5].
四、含有可变形参的函数
(1)、initializer_list形参
如何函数的实参数量未知,而实参的数据类型相同,我们就可以用initializer_list。initializer_list定义在同名的头文件中。和vector一样,initializer_list也是一个模板,不一样的是initializer_list的元素永远是常量值。我们无法改变他的对象中元素的值。如果我们编写一个输出错误信息的函数:
1 err_msg(initializer_list <string> msg) 2 { 3 auto temp = msg.begin(); 4 while(msg.end != temp) 5 { 6 cout << *temp << endl; 7 ++temp; 8 } 9 }
补充一点在for循环中的条件中,不管是++i还是i++,其结果都是一样的,而我们一般为了性能选择++i。因为i++会复制i的副本。
五、返回类型和return语句
return语句终止当前正在执行的函数并返回到调用该函数的后面。
列表初始化返回值
1 vector<string> msg() 2 { 3 if(expected.empty()) 4 { 5 return {}; 6 }else 7 { 8 return {"functionX", expected}; 9 } 10 }
六、重载和顶层const
一个拥有顶层const的形参无法和一个不含const区分开来
int function(int const temp){} int function(int temp){}
七、内联函数
在我们定义的一个小、精简函数前面加一个inline,就变成了内联函数,内联函数可以优化我们的代码,避免函数调用的开销。注意的是很多编译器都不支持内联函数的递归。和其他函数不一样的是,内联函数一般定义在头文件中。
inline const bool &result(string parameter1, string parameter2) { return parameter1 > parameter2 ? true : false; }