effective C++笔记之条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低。
2012-03-19 20:47
477 查看
有如下三种情况:
1.
现在,全局对象addr成为了scott.address的另一个名字,利用它可以随意读写scott.address。实际上,scott.address不再为private,而是public,访问级提升的根源在于成员函数personAddress。
2. 不仅仅是引用,指针也会产生以上问题,如下所示:
3. 指针还要考虑到成员函数,因为返回一个成员函数的指针也是有可能的。
由于公有成员函数verificationFunction返回了指向verifyAddress的指针,用户就可以这样做:
这样等同于没有限制地使用私有成员Person::verifyAddress。
但有时为了程序的性能不得不写像上面那样的函数—返回值是某个访问级较低的成员的指针或引用。但同时,你又不想牺牲private和protected为你提供的访问限制。这种情况下,可以通过返回指向const对象的指针或引用来达到两全其美的效果。
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对象的指针或引用来达到两全其美的效果。
相关文章推荐
- [Effective C++]条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低
- 条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低
- 条款 30: 避免这样的成员函数:其返回值是指向成员的非 const 指针或引用, 但成员的访问级比这个函数要低
- 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低
- effective C++笔记之条款19:分清成员函数,非成员函数和友元函数
- effective C++笔记之条款20、21:避免public接口出现数据成员、尽可能使用const
- effective C++笔记之条款24、25:在函数重载和设定参数缺省值间慎重选择、避免指针和数字类型重载
- effective c++条款21,22,23(返回对象时,别妄想反回其引用,将成员变量声明为private,宁可拿非成员非友元函数替换成员函数(增强封装性))
- effective C++笔记之条款31、32: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用、尽可能地推迟变量的定义
- Effective C++ 第二版 29)内部句柄 30)成员函数返回非const指针或引用
- 20140424 父类指针指向子类 子类指针指向父类 父类指针不能访问子类成员(虚函数例外)
- Effective C++笔记之二const_and_non-const 修饰的成员函数
- Java中堆内存和栈内存_在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)。修改栈指针就可以把栈中的内容销毁.这样最快
- c++11 条款22:当使用Pimpl(指向实现的指针)时,在实现文件里定义特定的成员函数
- effective C++笔记之条款45: 弄清C++在幕后为你所写、所调用的函数
- effective C++笔记之条款23:必须返回一个对象时不要试图返回一个引用
- 返回值为引用或指针的成员函数加const要注意
- 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
- C++const对象 常量数据 常量成员函数 const指针 const引用
- JavaSE8基础 函数返回抽象类的引用,这个引用指向的是子类的对象