一、头文件
头文件一般包括类的定义、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
内联函数避免函数调用时的开销,将函数在程序调用点上“内联”的展开。