C++primer 函数

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(iai) = 0;
    

int &get1(int *arryint index)
return arry[index]; 
} 

给函数返回值赋值可能让人惊讶,由于函数返回的是一个引用,因此这是正
确的,该引用是被返回元素的同义词  


11. 函数声明  
    一个函数只能定义一次,但可以声明多次.

12、内联函数:避免函数调用时的开销。

13、重载函数
    出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重
载函数。

    注意:main 函数不能重载。

    形参与 const 形参的等价性仅适用于非引用形参。有 const 引
用形参的函数与有非 const 引用形参的函数是不同的。类似地,如果函数带有
指向 const 类型的指针形参,则与带有指向相同类型的非 const 对象的指针形
参的函数不相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值