您的位置:首页 > 编程语言 > C语言/C++

effective C++笔记之条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低。

2012-03-19 20:47 477 查看
有如下三种情况:

1.

class Address { …};
class Person{
public:
Address& personAddress() { return address; }
private:
Address  address;
};

Person scott(..);
Address& addr = scott.personAddress();


现在,全局对象addr成为了scott.address的另一个名字,利用它可以随意读写scott.address。实际上,scott.address不再为private,而是public,访问级提升的根源在于成员函数personAddress。

2. 不仅仅是引用,指针也会产生以上问题,如下所示:

class Person
{
public:
Address* personAddress() { return &address; }
private:
Address address;
}
Address *addPtr = scott.personAddress();   //问题类似


3. 指针还要考虑到成员函数,因为返回一个成员函数的指针也是有可能的。

class Person;
typedef void (Person::*PPMF)(); //指向Person成员函数的指针
class Person
{
public:
static PPMF verticationFunction()
{return &Person::verfyAddress; }
private:
Address address;
void verifyAddress();
};


由于公有成员函数verificationFunction返回了指向verifyAddress的指针,用户就可以这样做:

PPMF pmf = scott.verificationFunction();
(scott.*pmf)();  //等同于调用 scott.verifyAddress


这样等同于没有限制地使用私有成员Person::verifyAddress。

但有时为了程序的性能不得不写像上面那样的函数—返回值是某个访问级较低的成员的指针或引用。但同时,你又不想牺牲private和protected为你提供的访问限制。这种情况下,可以通过返回指向const对象的指针或引用来达到两全其美的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐