1.局部静态对象
局部静态对象在对象定义语句时初始化,并且到程序终止才被销毁,在此期间,即使对象所在的函数结束执行也不会对它有影响。
#include<iostream> #include<string> using namespace std; size_t count_calls(){ static size_t count=0; return ++count; } int main(){ for(size_t i=0;i!=10;++i) cout<<count_calls()<<" "; //输出1到10 cout<<endl; system("pause"); return 0; }
2.参数传递
如果形参是引用类型,它将绑定到对应的实参上,否则,将实参的值拷贝后赋给形参。
3.数组形参
由于不允许拷贝数组,所以我们无法以值传递的方式使用数组参数,因为数组会转换成指针,所以当我们为函数传递一个数组时,实际传递的是指向数组首元素的指针。
void print(const int*); void print(const int[]); void print(const int[10]);上面三个print函数是等价的,每个函数都有一个const int*类型的形参
4.initializer_list形参
initializer_list用于表示某种特定类型的值的数组,定义initializer_list对象时,必须说明列表中所含元素的类型。
initializer_list<string> ls; // initializer_list的元素类型是string
initializer_list对象中的元素永远是常量值。
5.列表初始化返回值
c++11线标准规定,函数可以返回花括号包围的列表。
#include<iostream> #include<string> #include<vector> using namespace std; vector<string> process(){ return{ "aaa", "bbb" }; } int main(){ vector<string> vec(process()); for (auto &c : vec) //输出aaa,bbb,VS2013支持 cout << c << " "; cout << endl; system("pause"); return 0; }
6.返回数组指针
返回数组指针的函数形式如下:
int (*function(parameter_list))[dimension]具体例子:
int (*func(int i))[10];
说明:
func(int i)表示调用func函数时需要一个int类型的实参
(* func(int i))表示我们对函数调用的结果执行解引用操作
(* func(int i))[10]表示解引用func的调用将得到一个大小是10的数组
c++11新标准有另一种简化上述func声明的方法,称作尾指返回类型
auto func(int i)-> int(*)[10]; //func接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组
7. 函数重载
如果同一作用域内的几个函数名字相同但形参列表不同,我们称为重载函数。
8.内联函数
将函数指定为内联函数,就是将它在每个调用点上”内联地"展开。
如:
inline const string &shortString(const string &s1,const string &s2){ return s1.size()<=s2.size()?s1:s2; }调用
cout<<shortString(s1,s2)<<endl;将在编译过程中展开成类似下面的形式
cout<<(s1.size()<=s2.size()?s1:s2)<<endl;
9.函数指针
#include<iostream> #include<string> #include<vector> using namespace std; const string &shortString(const string &s1,const string &s2){ return s1.size()<=s2.size()?s1:s2; } int main(){ const string&(*pf)(const string &s1,const string &s2); //声明指向shortString函数的指针 pf=shortString; //将pf指向shortString函数 cout<<pf("aa","bbb")<<endl; //调用shortString函数,输出aa system("pause"); return 0; }