Chapter 6 函数
#函数基础
- 声明:返回类型、函数名、形参列表、分号
- 定义:返回类型、函数名、形参列表、函数体
- 调用:函数或函数指针,实参列表
#参数传递
1.形参是引用类型,它将绑定到对应的实参上. 否则,将实参的值拷贝后赋给形参;
2.C++,建议使用引用类型的形参代替指针;
//传引用参数 void reset(int &i){ i = 0; } int j = 24; reset(j); cout << j << endl; //输出是0;
3.使用引用,避免拷贝. 若函数无须改变引用形参的值,最好将其声明成常量引用;
bool isShorter(const string &s1 , const string &s2){ return s1.size() < s2.size(); }
4.数组形参
数组有两个特殊的性质
-
不支持拷贝
-
数组名通常会自动转化为指针
5.main:处理命令行选项;
int main( int argc, char **argv ) {}
- 当使用 argv 中的实参时,一定要记得 可选的实参从 argv[1] 开始;argv[0]保持程序的名字,非用户输入
#返回类型与return语句
1.在含有return语句的循环后面应该也有一句return语句;
2.不要返回局部对象的引用或指针
3.引用返回左值: 如果函数返回的是引用类型的对象,可以直接对函数调用的结果进行赋值
getVal( s, 0 ) = 'A';
4.列表初始化返回值:
vector<string> process() { return {"Hi", "bye"}; }
5.返回数组指针
- 数组不能被拷贝,所以不能返回数组, 不过函数可以返回 数组的指针 或引用;
- 声明一个返回数组指针的函数:
//数组指针:指向数组的指针 int (*p)[10]; p即为指向数组的指针
Type (*function (parameter_lst) [dimension]
eg:int (*func(int i))[10];
/*
func( int i ) :表示调用func函数时需要一个int类型的实参;
( *func(int i) ) :意味着可以对函数调用结果执行 解引用 操作;( *func(int i) ) [10] : 表示解引用func的调用将得到一个大小是10的数组;
int
( *func(int i) ) [10] :表示数组中的元素是int类型;
*/
-
这种写法难免有些复杂,而复杂容易产生错误,有三种方式简化 P206
- 类型别名
- 尾置返回类型
//func接受一个int类型的实参,返回一个指针,该指针指向含有10个整型的数组; auto func(int i) -> int (*)[10];
- decltype:
int odd[] = {1,3,5,7,9}; int even[] = {0,2,4,6,8}; decltype(odd) *arrPtr(int i){ //注: * 符号 return (i%2) ? &odd : &even; } //decltype不负责把数组类型转换成对应的指针,所以要像表示arrPtr返回指针必须在声明时加一个 *符号;
6.函数重载
- main函数不能重载
- 最佳匹配
#特殊同于语句特性
1.内联函数( inline ):
- 可避免函数调用的开销 ;
inline const string & shorterString( const string &s1,const string &s2){ return s1.size() < s2.size(); }
2.constexpr函数:
//补充
3.调试帮助
- assert 预处理宏:首先对expr求值,若为false(0),assert输出信息并终止程序的执行 ;
assert ( expr )
- NDEBUG 预处理变量 :
4.函数指针:指向函数而非对象;
bool (*pf) (const string &s1,const string &s2); // *pf 两端的括号必不可少;
5.返回指向函数的指针;
int ( *f1(int ) )(int *, int ); //尾置 返回类型 auto f1(int ) -> int (*) (int * ,int );