[C++primer第六章]函数

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()的原因是,频繁的调用会极大的影响程序的性能,增加额外的开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值