`
kmplayer
  • 浏览: 508830 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款30:避免写出member function,传回一个non-const function或reference并指向private或protect成员

 
阅读更多
1,先看一个例子:
class Address { ... };           // where someone lives

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

Person scott();            
Address& addr = scott.personAddress(); //addr看作一个全局对象
这个时候addr乘了scott.address的另一个名称,可以通过addr任意读写address.
因此,scott.addres不再是private,变成了public.

2,相同的道理,适用于指针成员.
例如:
class Person
{
public:
  Address * personAddress() { return &address; }
private:
  Address address;
};

Address *addrPtr = scott.personAddress();  // same problem as above
改写*addrPtr,即可改变address的值.

3,也适用于成员函数.
如:
class Person;                   // forward declaration
typedef void (Person::*PPMF)();

class Person
{
public:
static PPMF verificationFunction()
{
return &Person::verifyAddress;
}

private:
Address address;
void verifyAddress();
};

下面这个动作:
PPMF pmf = scott.verificationFunction();
(scott.*pmf)(); //等同于调用scott.verificationFunction.
分享到:
评论

相关推荐

    non-const lvalue reference cannot bind to rvalue(解决方案).md

    non-const lvalue reference cannot bind to rvalue(解决方案).md

    initializer for array of non-const data member(解决方案).md

    initializer for array of non-const data member(解决方案).md

    Effective C++(第三版)

    条款25:考虑写出一个不抛异常的swap函数 consider support for a non-throwing swap. 5. 实现 implementations 条款26:尽可能延后变量定义式的出现时间 postpone variable definitions as long as possible. 条款...

    条款20: 宁以pass-by-reference-to-const 替换 pass-by-value

    1、为什么要宁以pass-by-reference-to-const 替换 pass-by-value 效率方面 缺省情况下,C++以by value 方式传递对象至(或来自)函数。 除非你另外指定,否则函数参数都是以实际实参的副本为初值,而调用段所获得的...

    Effective C++ 中文版

    条款25:考虑写出一个不抛异常的swap函数 5.实现 条款26:尽可能延后变量定义式的出现时间 条款27:尽量少做转型动作 条款28:避免返回handles指向对象内部成分 条款29:为“异常安全”而努力是值得的 条款30...

    Effective.C++.中文第二版.50条款doc文档.chm

    条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引 条款32: 尽可能地推迟变量的...

    普通成员函数、类成员函数和类静态成员函数实例(VS2010)

    这是因为每个普通成员函数都有一个隐含的参数,即指向类实例的指针`this`。通过`this`指针,函数可以直接操作对象的状态。例如: ```cpp class MyClass { public: void normalFunction() { // 可以访问类的...

    C++中const用法总结

    - 由于 `Var` 是形参,所以这个 `const` 修饰符在这里并无实际意义,因为即使没有这个 `const`,形参也无法修改实参的值。 2. **修饰指针参数**: - `void function(const char *Var);` - 表示 `Var` 指向的内容...

    const用法 const int *a; int * const a;

    `:函数返回一个常量整型值,但这个常量只是函数内部的一个副本,可以被赋值给`const`或非`const`变量。 - 对于用户自定义类型,返回`const`对象通常很重要,因为它确保对象不被意外修改。 6. **常量指针与函数**...

    EFFECTIVE C++ 条款03 尽量使用const 思维导图

    EFFECTIVE C++ 条款03 尽量使用const 思维导图 在 C++ 编程中,使用 const 关键字可以提高代码的可读性、可维护性和安全性。本文将详细介绍 EFFECTIVE C++ 的第三条款:尽量使用 const 思维导图。 一、const ...

    const修饰类的成员函数

    这意味着即使一个成员函数被声明为`const`,它也可以返回一个非常量的引用或指针等。 #### 六、总结 通过使用`const`关键字修饰类的成员函数,可以有效地提高程序的安全性和可维护性。它不仅帮助开发者更好地管理...

    Const,Const函数,Const变量,函数后面的Const.txt

    通过在成员函数声明后添加`const`关键字,编译器可以检查并确保该成员函数没有修改任何成员变量。 - **示例**:考虑一个栈类`Stack`中的计数函数: ```cpp class Stack { public: int GetCount() const; // ...

    类的static,const,static const,const static成员的初始化

    在一个类里,const 成员变量不能在类定义中赋初值,因为编译器不知道 const 的内容是什么,所以不能把它用作编译期间的常量。因此,const 成员变量必须在构造函数中初始化,而不可以在类定义中进行初始化。 例如: ...

    const成员函数、初始化列表、static成员1

    在上面的代码中,get_buffer()函数是const 成员函数,它不能修改对象的状态,而是返回一个const 指针,指向缓冲区。 初始化列表 C++11 标准引入了初始化列表的概念,允许在数据成员后直接赋值。这种方法可以简化...

    关于const 的用法

    `const`关键字主要用于声明常量或对象的不可变性,它能提高代码的安全性和效率,避免无意中的修改,并在多线程环境下提供额外的保护。 ### 1. 声明常量 在C++中,`const`可以用于声明一个不会被改变的变量,即常量...

    应用Dephi 开发佳能照相机API

    This function delete all the reference or list objects that user has forgotten to delete. Parameters: In: None Out: None Returns: Returns EDS_ERR_OK if successful. In other cases, see ...

    Google C++ Style Guide_英文版.pdf

    - **Use of const:** Use const for read-only data and const-correctness to improve code quality. - **Use of constexpr:** Use constexpr for constant expressions that can be evaluated at compile time. - ...

    C++/C 面试题 const

    在C++和C编程语言中,`const`关键字是一个非常重要的概念,它涉及到常量、常量指针、指针常量以及常量指针常量等多方面的知识。`const`关键字的主要作用是限制变量的修改,以提高程序的安全性和可读性。下面将详细...

Global site tag (gtag.js) - Google Analytics