何时使用指针参数、引用参数、按值传递?

1、什么是引用?如何使用引用?为什么要使用引用?

     1)什么是引用?

           引用变量是一种伪装指针,它允许为变量创建别名(另一个名称)。

           在初始化一个引用变量时,必须对其进行初始化。

     2)何时使用引用?

           引用变量主要被用作处理结构和类对象的函数的参数。

     3)为什么要使用引用?

  •     程序员能够修改调用函数中的数据对象
  •    通过传递引用而不是整个数据对象,可以提高程序的运行速度(这也是使用指针参数的原因。引用参数实际上是基于指针的代码的另一个接口)

       4)返回引用时的注意事项

 

2、什么时候应使用引用?什么时候应使用指针?什么时候又应按值传递呢?

对于使用传递的值而不作修改的函数:

        如果数据对象很小,如内置数据类型或小型结构,则按值传递。

        如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针。

        如果数据对象是较大的对象,则使用const指针或const引用,以提高程序的效率。这样可以节省复制结构所需的时间和空间

        如果数据对象是类对象,则使用const引用。传递类对象参数的标准方式是按引用传递。

对于修改调用函数中数据的函数:

          如果数据对象是内置数据类型,则使用引用。如fixit(&x),其中x是int型,则很明显,该函数将修改x

          如果数据对象是数组,则只能使用指针

           如果数据对象是结构,则使用引用或指针。

           如果数据对象是类对象,则使用引用。

 

即,数据对象为内置数据类型时,若参数不能被修改,则使用按值传递;若要修改参数,则使用引用。

        数据对象是数组时,只能使用指针。

        数据对象是较大的对象或结构,则可以使用指针或引用。

        数据对象是类对象,则使用引用。

 

3、

//mytime0.h
#ifndef MYTIME0_H
#define MYTIME0_H

class Time
{
private:
    int hours;
    int minutes;
public:
    Time();
    Time(int h,int m=0);
    void AddMin(int m);
    void AddHr(int h);
    void Reset(int h=0,int m=0);
    Time Sum(const Time & t) const;
    void show() const;
};

#endif // MYTIME0_H




//mytime0.cpp
#include<iostream>
#include"mytime0.h"

Time::Time()
{
    hours=minutes=0;
}

Time::Time(int h, int m)
{
    hours=h;
    minutes=m;
}

void Time::AddMin(int m)
{
    minutes+=m;
    hours+=minutes/60;
    minutes=minutes%60;
}

void Time::AddHr(int h)
{
    hours+=h;
}

void Time::Reset(int h, int m)
{
    hours=h;
    minutes=m;
}

Time Time::Sum(const Time &t) const
{
    Time sum;
    sum.minutes=minutes+t.minutes;
    sum.hours=hours+t.hours+sum.minutes/60;
    sum.minutes=sum.minutes%60;
    return sum;
}

void Time::show()const
{
    std::cout<<hours<<" hours, "<<minutes<<" minutes";
}



//usetime0.cpp
#include<iostream>
#include"mytime0.h"

int main()
{
    using std::cout;
    using std::endl;
    Time planning;
    Time coding(2,40);
    Time fixing(5,55);
    Time total;

    cout<<"planning time = ";
    planning.show();
    cout<<endl;

    cout<<"coding time = ";
    coding.show();
    cout<<endl;

    cout<<"fixing time = ";
    fixing.show();
    cout<<endl;

    total =coding.Sum(fixing);
    cout<<"coding.Sum(fixing) = ";
    total.show();
    cout<<endl;
    return 0;

}

        将参数声明为引用的目的的提高效率。返回对象将创建对象的拷贝,而调用函数可以使用它。

        如果返回类型为Time &,则引用的将是sum对象。但由于sum对象是局部变量,在函数结束时将被删除,因此引用将指向一个不存在的对象。然而,使用Time返回类型意味着程序将在删除sum之前构造它的拷贝,调用函数将得到该拷贝。

注意:不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值