【问题标题】:C++ static member functions and their scopeC++ 静态成员函数及其作用域
【发布时间】:2009-12-09 03:16:30
【问题描述】:

我有两个问题。

在 C++ 中,静态成员函数可以直接访问同一类中定义的公共非静态数据成员吗? 假的

在 C++ 中,非静态成员函数可以直接访问同一类中定义的私有静态数据成员吗? 是的

我的笔记说第一个问题是假的,第二个问题是真的。我就是不知道为什么?你能解释这是为什么吗?谢谢。

附:我正在为我的期末考试而学习,但我似乎无法弄清楚为什么。

【问题讨论】:

  • 诚实+1 - 我希望每个人都对自己的动机如此坦率,即使很明显。
  • goodl 回答大家谢谢。我现在明白了。

标签: c++ scope


【解决方案1】:

每个人都同意,但应该非常小心他们的措辞,因为实际上静态成员函数确实可以访问公共的非静态数据成员。就此而言,他们也可以访问私有的非静态数据成员。他们只需要一个对象来操作,访问它的成员。这可以是一个参数,或者一个全局的,或者在静态成员函数中创建的,或者通过这些东西之一获得。

下面的代码没问题:

class foo {
public:
    int a;
    // static member function "get_a" ...
    static int get_a(foo *f) {
        // ... accesses public non-static data member "a"
        return f->a;
    }
};

所以我们问自己,“访问”和“直接访问”有什么区别?

我猜这里“直接访问”的意思一定是“只使用数据成员的名称,而不指定对象”。每个人总是需要拥有一个对象才能访问非静态成员——这就是非静态的意思。如果不想,非静态成员函数就不必提及 which 对象,因为 this 是隐含的。因此,他们可以直接访问非静态数据成员。

非静态成员函数可以直接访问私有静态数据成员的原因首先是代码在类的成员中,因此它可以访问私有数据成员。其次,您永远不需要对象来访问静态数据成员(如果需要,您可以指定一个,但使用的只是表达式的静态类型,而不是实际对象),因此访问是直接的。

【讨论】:

    【解决方案2】:

    这里有一个提示:回想一下,“非静态数据成员”是指您的类的特定实例的数据成员。静态成员函数不会在任何特定实例的上下文中运行。

    【讨论】:

      【解决方案3】:

      静态成员函数不能访问实例变量(非静态数据),因为实例变量需要类的实例才能操作。

      请记住,静态数据成员或函数被定义和分配一次(不是每个实例),因此可以通过非静态函数访问,就像访问全局变量等一样。

      (在内部,静态函数不会像常规成员函数那样传递 this 指针。即,它们使用不同的调用约定。因此,它们无法引用 this->foo,这就是当您引用时真正发生的情况成员函数中的成员foo。)

      【讨论】:

        【解决方案4】:

        许多面向对象的专家/专家倾向于默默地说,你错了。 错了,不是因为答案错了,而是思维过程需要重新排序。

        假设您是一名潜艇设计师。你设计了尼赫鲁级潜艇。你有蓝图,但没有潜艇。在尼赫鲁级的蓝图上,你有设计师的名字——索尼娅·甘地。所以现在人们可以静态地指代尼赫鲁->设计师,它产生了“索尼娅甘地”的价值。

        现在,每艘潜艇都有一名船长。由于还没有建造潜艇,你不能指代任何船长,因此引用尼赫鲁->船长是不合逻辑的。

        然后你建造 10 艘尼赫鲁级潜艇,每艘分配一名船长。其中一些潜艇是孟买号、德里号、拉斐尔·雅各布号、里希·卡普尔号。

        你仍然不能参考尼赫鲁->船长来得到十个船长中的任何一个。你可以说德里->船长、孟买->船长或里希·卡普尔->船长并得到各自船长的名字,但不会有任何像尼赫鲁->船长这样的有效参考,因为尼赫鲁参考是一个职业设计而不是一个船。

        但是,您可以引用德里->设计师或孟买->设计师或拉斐尔·雅各布->设计师,这将产生“索尼娅·甘地”,就像尼赫鲁->设计师一样。

        好了,明白了吗?

        【讨论】:

          【解决方案5】:

          除了 Greg Hewgill 的回答之外,您还可以将静态函数视为具有更窄的范围 - 即成员函数可以访问静态函数所做的一切以及所有实例变量。静态函数虽然只能访问静态成员,这很符合逻辑。

          class MyClass {
          
            static int m_iStatic;      
            int m_iInstance;
          
            static void StaticFunc() {
              m_iStatic = 8; //OK
              m_iInstance = 8; //not OK
            }
          
            void InstanceFunc() {
              m_iStatic = 8; //OK
              m_iInstance = 8; //OK
            }
          }
          

          【讨论】:

            【解决方案6】:

            在 C++ 中,静态成员函数具有 直接访问公共非静态 同一类中定义的数据成员? 假的

            由于静态成员函数未绑定到实例,因此静态成员函数无法访问类的非静态数据。就此而言,可以在没有任何对象的情况下访问静态函数。静态成员函数中不能访问任何对象特定的数据。

            在 C++ 中,一个非静态成员函数 可以直接访问私有静态 同一类中定义的数据成员? 是的

            同样,由于静态数据成员不属于任何特定对象,因此该类的所有实例都可以访问它。

            【讨论】:

              【解决方案7】:

              为了让事情变得更容易,让我们剥离公共/私人。

              要访问对象的数据成员(属性),您需要知道“对象”是谁/在哪里。 静态成员函数在 objectS 之间共享,因此当您要求他获取数据成员时,它需要额外的信息。

              image对象为family,child为数据成员,boardSchoolBus为静态函数。 每个孩子都可以上校车,但如果让校车来接孩子,那就得知道该去哪个家庭了吧?

              【讨论】:

                猜你喜欢
                • 2012-04-30
                • 1970-01-01
                • 1970-01-01
                • 2023-04-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多