【问题标题】:do Members of the class can only be accessed indirectly via set and get-methods?类的成员只能通过 set 和 get 方法间接访问吗?
【发布时间】:2015-05-19 07:56:57
【问题描述】:

我知道类的成员只能通过 set 和 get 方法间接访问。以下 C++ 程序的输出是什么?为什么这可能?有人可以向我解释为什么这是一种糟糕的编程风格吗?

#include <iostream>
using std::cout;
using std::endl;

class Test
{
private:
    int N;
public:
    void setN(int N_in) { N = N_in; };
    int getN(){ return N; };
    int* getptrN(){ return &N; };
};

int main()
{
    Test A;
    A.setN(5);
    int* ptr = A.getptrN();
    cout << A.getN() << endl;
    *ptr = 10;
    cout << ptr << endl;
    cout << A.getN() << endl;
    return 0;
}

【问题讨论】:

  • 听起来像是功课。
  • 你聪明 =) 你不会帮忙吗?...我还有更多要问的!
  • 提供一个返回指向成员的指针的方法可以绕过封装。因此,这是一个坏主意,因为您无法保证对象处于已定义的状态。
  • “下面的 C++ 程序的输出是什么?” 你连运行都不知道吗?即使您的 PC/设备上没有编译器,您也可以将代码剪切并粘贴到在线编译器(例如 ideone.com)中。

标签: c++ class private


【解决方案1】:

public、protected 和 private 访问说明符适用于成员名称。它们让您按名称 指定类的用户可以使用哪些数据和功能。如果在运行时您通过其他方式(例如通过指针或引用)授予对变量或函数的访问权限,则编译时访问说明符将不再起作用。

封装的基本思想是,您希望对象代表您尝试解决的问题中的值,并且希望这些值始终有意义。您可以限制一个对象可以具有哪些状态,以便该对象只能代表有意义的个状态。

例如,长度为负是没有意义的,因此假设的setLength 成员函数在给定负参数值时应该永远不会成功。

通过授予对对象成员的无限制访问权限,您允许以不一定产生有效状态的方式对其进行修改,这可能会使您的程序行为不正确。如果x 假设它的长度永远是非负的,但你说*x.getPtrLength() = -1;,那么所有的赌注都没有了。

【讨论】:

    【解决方案2】:

    public、private 尝试将封装的概念引入我们的代码。这个概念有助于将班级内部发生的事情与外部世界分开。这并不意味着您无法访问对象的内存空间。因为您已经创建了 Test 对象的实例,所以您可以访问它;您只需要内部变量的地址(由return &amp;N 提供)。

    【讨论】:

      【解决方案3】:

      不确定我是否完全理解您的问题(您在代码中看到的具体问题是什么),但您需要在public: 和private: 上刷新您的记忆。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-24
        • 2019-06-30
        • 2012-01-06
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        相关资源
        最近更新 更多