- 论坛徽章:
- 0
|
许多程序员都推荐你只要有可能就用引用来取代指针。例如,当函数通过引用(const或者非const型)来获取参数比实现用指针作为参数的同样功能的函数要简单许多。同样的还有读取函数——掌握它简单多了。
然而,当你开发非算符类(non-functor class)类时,相对于引用,你会更喜欢使用指针。当你面对使用引用成员变量还是指向成员变量的指针时,你一般选择指针。
如果你的类包含了一个或者一个以上引用,那么就无法为它实现一个默认构造函数。还有,编译器也无法实现默认的运算符“=”;如果你希望定义运算符“=”,你不得不采取某些技巧。由于你会经常碰到诸如“a=b”的情况,这就可能导致问题的出现。
请考虑下面的类:
structCTest
{
int & m_n;
};
上面的代码不会编译成功,因为它不能产生默认的构造函数或者说初始化引用。我们把它修改成:
structCTest
{
CTest( int & n)
: m_n( n)
{}
int & m_n;
};
int main()
{
inti;
CTest a( i), b( i);
//错误!由于*this,编译器不能产生默认运算符“=”,
//你不能引用‘m_n’到
//其它对象上
a = b;
}
为了可以编译“a=b”,我们不得不再次修改代码:
#include <new>;
structCTest
{
CTest( int & n)
: m_n( n)
{}
CTest & operator=( const CTest & other)
{
CTest * pThis = this;
pThis->;~CTest();
new(pThis) CTest( other);
}
int & m_n;
};
int main()
{
inti, j;
CTest a( i), b( j);
// 现在,下面一行代码可以正常工作了
a = b;
}
Class CTest could be written much easier:
structCTest
{
CTest( int & n)
: m_pN( &n)
{}
CTest()
: m_pN( NULL)
{}
// ……如果需要,你的代码还应该有:
// void reset( int & n)
// { m_pN = & }
int * m_pN;
};
int main()
{
inti, j;
CTest a( i), b;
b = a;
}
你应该注意到上面的规则并不适合算符类。这是因为算符总是拷贝构造(copy-constructed);当然,也就不需要运算符“=”了。如果算符内部有引用的话,那么你就需要设计一个自定义构造函数来初始化引用,而且你不需要默认构造函数。 |
|