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之前构造它的拷贝,调用函数将得到该拷贝。
注意:不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。