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之前構造它的拷貝,調用函數將得到該拷貝。
注意:不要返回指向局部變量或臨時對象的引用。函數執行完畢後,局部變量和臨時對象將消失,引用將指向不存在的數據。