1、求最大公约数的函数:辗转相除法:
![]()
![]()
![]()
int gcd(int v1,int v2)
{
while(v2)
{
int temp=v2;
v2=v1%v2;
v1=temp;
}
return v1;
} 2.、参数传递(对实参的拷贝)
每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。
形参的初始化与变量的初始化一样:如果形参具有非引用类型,
则复制实参的值,如果形参为引用类型(第 2.5 节),则它只
是实参的别名。 3、复制实参的局限性
复制实参并不是在所有的情况下都适合,不适宜复制实参的情况包括:
•当需要在函数中修改实参的值时。
•当需要以大型对象作为实参传递时。对实际的应用而言,复制对象所付出的时间和存储空间代价往往过在。
•当没有办法实现对象的复制时。
对于上述几种情况,有效的解决办法是将形参定义为引用或指针类型。
4、引用形参
与所有引用一样,引用形参直接关联到其所绑定的圣贤,而并非这些对象的副本。
定义引用时,必须用与该引用绑定的对象初始化该引用。引用形参完全以相同的方式工作。
每次调用函数,引用形参被创建并与相应实参关联。
调用:
//引用形参
cout<<"形参引用测试"<<endl;
int a=5;
int b=3;
cout<<a<<'\t'<<b<<endl;
//swap1(&a,&b);
swap2(a,b);
cout<<a<<'\t'<<b<<endl;
//交换地址所指向值
void swap1(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp;
} void swap2(int &p1,int &p2)
{
int temp=p1;
p1=p2;
p2=temp;
}
5、利用const引用避免复制:
编写一个比较两个 string 对象长度的函数作为例子。这个函数需要访问每
个 string 对象的 size,但不必修改这些对象。由于 string 对象可能相当长,
所以我们希望避免复制操作。使用 const 引用就可避免复制:
// compare the length of two strings
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
} //引用要注意的地方
short int val1=0;
int &v=val1;//引用类型要匹配
const int val2=42;
int &v2=val2;//非const引用绑定const对象
int val3=incr(val1);//引用类型要匹配
val3=incr(val2);
val3 = incr(v3+v4);//引用不能传递右值
//函数
int incr(int &val)
{
return ++val;
}
6、应该将不修改相应实参的形参定义为 const 引用。如果将这样的形参定义
为非 const 引用,则毫无必要地限制了该函数的使用。
例如,可编写下面的程序在一个 string 对象中查找一个指定的字符:
//引用函数的调用
string::size_type val=find_char("string",'i');
//函数定义
string::size_type find_char(/*const */string &s,char c)
{
return 1;
}
问题:函数的调用出现问题,编译无法通过,提示:不能将const char 转化为string &,
如果将形参定义为const则可用.
7、数组形参
//形参数组的测试
int vall3=1;
//形参为int *
int vall4[10]={0,1,1};
PrintValue(&vall3);
PrintValue(vall4);//数组名即为数组的首地址 void PrintValue(int a[10])
{
for(size_t i=0;i!=10;++i)
{
cout<<a[i]<<endl;
}
}
8、通过引用传递数组
//引用传递数组
void printValue(int (&arr)[10])
{
}
//区别
int *matrix[10]; // array of 10 pointers
int (*matrix)[10]; // pointer to an array of 10 ints
9、main函数允许没有返回值.
千万不要返回局部对象的引用
9、千万不要返回指向局部对象的指针
10、引用返回左值
//将ia数组值置0
int ia[10]={1,2,3,4,5};
for (int i = 0; i != 10; ++i)
get1(ia, i) = 0;
int &get1(int *arry, int index)
{ return arry[index];
}
给函数返回值赋值可能让人惊讶,由于函数返回的是一个引用,因此这是正
确的,该引用是被返回元素的同义词。
11. 函数声明
一个函数只能定义一次,但可以声明多次.
12、内联函数:避免函数调用时的开销。
13、重载函数
出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重
载函数。
注意:main 函数不能重载。
形参与 const 形参的等价性仅适用于非引用形参。有 const 引
用形参的函数与有非 const 引用形参的函数是不同的。类似地,如果函数带有
指向 const 类型的指针形参,则与带有指向相同类型的非 const 对象的指针形
参的函数不相同。