何時使用指針參數、引用參數、按值傳遞?

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之前構造它的拷貝,調用函數將得到該拷貝。

注意:不要返回指向局部變量或臨時對象的引用。函數執行完畢後,局部變量和臨時對象將消失,引用將指向不存在的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章