一、通过引用来传递和返回对象
和其他变量一样,对象既可以通过传值方式,也可以通过引用方式来传递和返回。一般来说,除非迫不得已,都采用引用方式。这是因为通过传值方式来传递和返回对象需要面临对象间的拷贝操作,是数据变大,从而降低效率,浪费内存。(传递一个指向对象的指针与引用方式效果相同)
class Test
{
public:
void set(int n) { nNum = n; };
int get() const { return nNum; };
private:
int nNum;
};
void f(Test &test) {
test.set(999);
CString s;
s.Format(_T("%d"), test.get());
MessageBox(s);
};
Test& g() {
// 函数返回的是静态对象的引用,不是局部对象的引用
// 否则g返回给调用者的引用将参考到一个已经不存在的对象
static Test test;
test.set(-999);
return test;
};
// 用户调用
Test test1, test2;
f(test1);
test2 = g();
CString s;
s.Format(_T("%d"), test2.get());
MessageBox(s);
二、const类型参数的对象引用
通常对象作为函数参数通过引用传递时,而该函数又无需改变对象数据成员的值而改变对象的状态,此时可将参数表为const,防止对参数的误写。
class Test
{
public:
// n只是给成员变量赋值,并不会改变自身的值
void set(const int& n) { nNum = n; };
private:
int nNum;
};
三、const成员函数
如果成员函数无需直接或间接改变函数所属函数对象的任何数据成员,那么最好将该函数标记为const。const成员函数只能调用const成员函数,因为非const成员函数可能改变对象的数据成员,而const成员函数不能改变对象状态
class Test
{
public:
void set(int n) { nNum = n; };
// 因为get函数不改变类数据成员的值,所以可将该函数标位const
int get() const { return nNum; };
private:
int nNum;
};