注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

又一个部落格

换过很多备忘录,不知道这本怎么样!

 
 
 

日志

 
 

再谈函数  

2010-02-09 15:01:27|  分类: c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

传值(call-by-value)和传址(Call-by-reference)
传址有两种方式,一种是使用指针参数
#include <iostream>
using namespace std;

void f(int *i);

int main(){
    int val = 1;
    f(&val);
    cout << val;
}

void f(int *i){
    *i = 3;
}

因为指针参数操作的时候比较麻烦,所以使用下面的方法比较合适
使用引用参数
#include <iostream>
using namespace std;

void f(int &i);

int main(){
    int val = 1;
    f(val);
    cout << val;
}

void f(int &i){
    i =3;
}

在使用引用参数的时候 不需要使用*, 如果使用* 会报错
上面的 f函数的参数i  其实就是等于传指针的 *i,
在使用引用参数的时候,可以使用 &, 下面就可以看出 &i 和 &val 是等值的
#include <iostream>
using namespace std;

void f(int &i);

int main(){
    int val = 1;
    cout << &val << endl;
    f(val);
    cout << val<< endl;
}

void f(int &i){
    cout << &i<< endl;
    i =3;
}


返回引用
申明 double &f();
这种情况用的比较少,因为可能导致程序 不容易读懂
看下面的例子
#include <iostream>
using namespace std;

double &f();
double val = 100.0;

int main(){
    double x;
    cout << f() <<endl;

    x= f();
    cout << x<< endl;
    f() = 99.1; // 给 val 赋值 99.1
    cout << f()<<endl;
    return 0;
}

double &f(){
    //自动的返回 val的引用
    return val;
}

输出是
100
100
99.1

注意的是,返回引用,不能返回超过变量生存期的变量,例如:
int &f(){
    int i= 10;
    return i; // 错误的做法, i 将被销毁
}

独立引用
意思就是 引用没有应用在参数上,直接声明了一个引用变量.
int j;
int &i = j ;// i相当于 int *k; k=&j; i就是这里的 *k
看下面的程序
#include <iostream>
using namespace std;
int main(){
    int j,k;
    int & i= j;
    j=10;
    cout <<j<<" "<<i;
    k =121;
    i =k;
    cout << endl <<j;
    return 0;
}
输出为
10 10
121


函数的重载
函数的重载实现了 c++的多态性
条件有两个
1. 参数类型不同
2. 或者参数数量不同
返回值不予考虑
void f(int i);
void f(double k);
void f(int i, int j);

类型的自动转换和重载
在c++基础文章中我们提到 自动转换有两跳规则
第一条是说  char 和 short int 会被自动转成 int型
第二条说  小类型会变成大类型
看下面的例子
#include <iostream>
using namespace std;

void f(int x);
void f(double x);

int main(){
    short s=99;
    float r=11.5F;

    f(s); //自动转换成 int
    f(r); // 自动转换成 double
    return 0;
}

void f(int x){
    cout<<x<<endl;
}

void f(double x){
    cout<<x<<endl;
}

结果  
99
11.5

以上结果只有在没有找到直接匹配的函数才会发生自动转换

函数默认参数
void myfunc(int x = 0, int y = 100);
调用
myfunc(1, 2); // pass explicit values
myfunc(10); // pass x a value, let y default
myfunc(); // let both x and y default

看例子
#include <iostream>
using namespace std;

void f(int x=100);//默认值在这个时候给
int main(){
    f();
    //return 0;
}

//如果这里再给默认是 会报错 void f(int x = 100){
void f(int x){
    cout<<x<<endl;
}

默认值必须放在参数的右侧,比如下面的写法是错误的
void f(int a = 1, int b);

应该避免定义和使用几种有歧义的函数重载
    void f(double i);
    void f(float i);
    当调用时 f(1); 时,编译器会不知道应该调用哪个函数,以为两个都是合法的转换

    void f(unsigned char ch);
    void f(char ch);
    当调用时 f(88);编译器也不知道该调用哪个
    
    int f(int i);
    int f(int i, int j = 0);
    这个错误更加明显
   
  评论这张
 
阅读(133)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017