第六章
函数基础
- 函数执行的第一步是隐式的定义并初始化他的形参。
- 如果局部静态变量没有显式的初始值,他将执行值初始化,内置类型的局部静态变量初始化为零。
- 在头文件中进行函数声明,含有函数声明的头文件应该被包含到定义函数的源文件中。
- 使用引用避免拷贝,效率高,而且某些类类型不支持拷贝操作。如果函数无需修改引用形参的值,声明为常量引用。
温习----指针引用与const
int i = 42;
const int *cp = &i; //正确:但是cp不能改变i
const int &r = i; // 正确:但是r不能改变i
const int &r2 = 42; //正确, 常量引用可以引用常量
int *p = cp; //错误: p的类型和cp的类型不匹配
int &r3 = r; //错误: r3的类型和r的类型不匹配
int &r4 = 42; //错误:不能用字面值初始化一-个非常量引用
尽量使用常量引用。
数组形参
温习
函数返回值
数组不能拷贝,所以函数不能返回数组。
声明一个返回数组指针的函数
//Type ( *function (parameter_ list) ) [dimension]
int (*func(int i)) [10] ;
- func(int i) 表示调用func函数时需要一个int类型的实参。
- (*func(inti)) 意味着我们可以对函数调用的结果执行解引用操作。
- (*func(int i)) [10]表示解引用func的调用将得到一个大小是10的数组。
- int (*func(int i)) [10]表示数组中的元素是int类型。
使用尾置返回类型
// func 接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组
auto func(int i) -> int(*) [10] ;
函数重载
Record lookup (Phone);
Record lookup (const Phone);//重复声明了Record lookup (Phone)
Record lookup (Phone*);
Record lookup (Phone* const);//重复声明了Record lookup (Phone*)
- 如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象可以实现函数重载
//对于接受引用或指针的函数来说,对象是常量还是非常量对应的形参不同
//定义了4个独立的重载函数
Record lookup (Account&); // 函数作用于Account 的引用
Record lookup (const Account&); // 新函数,作用于常量引用
Record lookup (Account*); //新函数,作用于指向Account的指针
Record lookup (const Account*); //新函数,作用于指向常量的指针
- const_cast:在下面这个版本的函数中,首先将它的实参强制转换成对const 的引用,然后调用了shorterString函数的const版本。const版本返回对const string 的引用,这个引用事实上绑定在了某个初始的非常量实参上。因此,我们可以再将其转换回一个普通的string&, 这显然是安全的。
string &shorterString(string &s1, string &s2){
auto &r = shorterString(const_cast<const string&>(s1),
const_cast<const string&> (s2) );
return const_cast<string&>(r);
}//发问:这样的意义是不重写一遍代码?
|