C++primer学习 12.17

一、头文件

头文件一般包括类的定义、extern变量的声明和函数的声明。

注意:头文件用于声明而非定义。(const对象可以);

如:extern int ival=10,;是定义。 int ficl;没有加extern,所以是定义。

为了避免头文件多重包含,我们采用预处理器变量:

#ifndef SALESITEM_H

#define SALESITEM_H

#endif

这保证了头文件在给定源文件中值处理一次。


二、函数

2.1 参数传递

(1)非引用形参

a、普通的非引用类型参数通过复制对应的实参实现初始化,不会修改实参的值。

b、指针形参:形参可以为指针,此时复制实参指针。若函数将新指针付给形参,实参指针不变。可以修改指针指向对象的值。

如:

void reset(int *ip)
{
	*ip=0;//改变了ip指针指向对象的值
	ip=0;//仅仅改变ip的值,实参不变
}
int main()
{
	int i=42;
	int *p=&i;
	cout<<"i="<<*p<<endl;//42
	reser(p);//改变了*p,但是p没变
	cout<<"i="<<*p<<endl;//0

	return 0;

}

如需保护指针指向的值,则可将形参定义为指向const对象的指针。

c、const形参

若函数形参非const非引用,则实参可为const或非const;

若函数非引用const,实参可为const或非const,但函数智只可读取形参。

(2)引用形参

可以改变实参

a、使用引用形参返回额外的信息

如:如何定义一个既返回迭代器又返回出现次数的函数?可以给函数定义一个额外的引用实参:

vector<int>::const_iterator findval(vector<int>::const_iterator beg,vector<int>::const_iterator end,int value,vector<int>::size_type &occurs)
{
	vector<int>::const_iterator res_iter=end;//value第一次出现的位置
	occurs=0;//value出现次数
	for(;beg!=end;++beg)
	{
		if(*beg==value)
		{
			if(res_iter==end)
				res_iter=beg;
			occurs++;
		}
	}
	return res_iter;
}
int main()
{
	vector<int>v(10);
	for(int i=0;i<9;i++)
		v.push_back(i);
	v.push_back(8);
	vector<int>::size_type ctr=0;
	vector<int>::const_iterator it;
	it=findval(v.begin(),v.end(),8,ctr);
	cout<<ctr<<endl;
	return 0;
}

b、引用形参可以避免复制时的浪费,加上const可以避免修改实参

如比较两个string的长度,string可能非常长,复制太浪费

bool isshorter(const string &s1,const string &s2)
{
	return s1.size()<s2.size();
}
c、传递指向指针的引用

void ptrswap(int *&v1,int *&v2)
{
	int *temp=v2;
	v2=v1;
	v1=temp;
}

int *&v1:v1是一个引用,是传递进函数的指针的别名。这个函数改变了实参。

2.2数组形参

数组形参定义:

void printValues(int *a){/*...*/}
void printValues(int a[]){/*...*/}
void printValues(int a[10]){/*...*/}

非引用形参,编译器不会检查实参和形参数组长度是否匹配,但引用传递时会检查

void printValues(int (&a)[10]){/*...*/}
强调:&a两边的括号是必须的,试比较:

int *matrix[10];//含所有十个指针的数组
int (*matrix)[10];//指向含有十个整数数组的指针

2.3局部变量

自动变量:当定义了它的函数被调用时才存在的对象成为自动变量,形参也是自动变量。函数结束,自动撤销。

静态局部变量:位于函数作用域,生命期跨越函数的多次调用。一旦创建,函数结束前不会撤销。

例:

int count_calls()
{
	static int  ctr=0;
	return ctr++;
}
int main()
{
	
	for(int i=0;i<10;i++)
		cout<<count_calls()<<endl;
	
	return 0;
}

输出:1,2,...,10。每次执行函数,ctr保留上一次调用时的值。


2.4内联函数inline

内联函数避免函数调用时的开销,将函数在程序调用点上“内联”的展开。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值