6.1函数基础
实参和形参,实参是形参的初试值
6.1.1 局部对象
名字有作用域,对象有生命周期。
- 名字的作用域是程序文本的一部分,名字在其中可见。
- 对象的生命周期是程序执行过程中该对象存在的一段时间。
形参和函数体内部定义的变量统称为局部变量。
自动对象
我们把只存在于块执行期间的对象称为自动对象。
形参是一种自动对象,我们用传递给函数的实参初始化形参对应的自动对象。
局部静态对象
可以用static将局部变量贯穿于函数调用之后,static定义的对象只在执行第一次初始化,程序终结才销毁。
int calls()
{
static int ctr = 0;
return ++ctr;
}
int main()
{
for(int i=0;i<10;i++)
cout<<calls()<<endl;
}
输出1-10;
6.1.2函数声明
int print(int x,int y)
6.1.3分离式编译
编译产生obj文件,再链接在一起
--------------------------------------------------------
$ gcc -c factMain.cc
$ gcc -c fact.cc
$ gcc factMain.o fact..o
$ gcc factMain.o fact.o -o main
6.2参数传递
6.3 返回类型和return语句
有两种形式
return ;
return expression;
6.3.无返回值函数(void)
第一种只能用在返回值是void的函数中,void中提前退出可以用return;
6.3.2 有返回值函数
return语句返回值的类型必须于函数返回类型相同,或者能隐式地转换
注意:在含有return语句的循环后面,记得要添上一个return,保证程序有出口。
值是如何被返回的。
int gcd(int a,int b)
{
if(b != 0)
return gcd(b,a%b);
else
return a;
}
不要返回局部对象的引用或指针(没看懂)
const string &manip()
{
string ret;
if(!ret.empty())
return ret;
else
return"EMPTY";
}
"EMPTY“是一个局部临时量,不能返回。
引用返回左值
char &get_val(string &str, size_type ix)
{
return str[ix];
}
int main()
{
string a = "a value";
cout<<a<<endl;
get_val = 'A';
cout<<a<<endl;
}
注意::返回量是常量是不能修改的!!
shortstring(s1,s2) = "X" ; // wa
6.4函数重载
如果同一个作用域的几个函数名字相同,但形参列表不同,称之为重载overloaded函数。
当调用这些函数的时候,编译器会根据传递的实参类型推断出想要的是哪个函数。
const和const_cast P145复习
6.5调试帮助
1.assert的使用
assert是一种预处理宏,由预处理器管理,而非编译器。
如果是真,什么也不做。
如果是假,报错。
用来测试语句是否错误。
assert(expression);
已放弃使用assert()的原因是,频繁的调用会极大的影响程序的性能,增加额外的开销。