C ++静态成员函数及其作用域

时间:2009-12-09 03:16:30

标签: c++ scope

我有两个问题。

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

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

我的笔记对第一个问题说错误,对第二个问题说错。我只是找不到原因?你能解释一下这是为什么吗?谢谢。

P.S。我正在为我的决赛而学习,我似乎无法弄明白为什么。

7 个答案:

答案 0 :(得分:13)

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

以下代码没问题:

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;
    }
};

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

我猜这里“直接访问”的含义必须是“仅使用数据成员的名称,而不指定对象”。每个人总是需要拥有一个对象才能访问非静态成员 - 这就是非静态意味着什么。非静态成员函数不必提及哪个对象(如果他们不想要),因为this是隐式的。因此,他们对非静态数据成员的访问可以是直接的。

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

假设您是潜艇设计师。你设计了尼赫鲁级潜艇。你有蓝图但不是潜艇。在尼赫鲁级别的蓝图上,你有设计师的名字 - 索尼娅甘地。所以现在人们可以静静地提到Nehru->设计师,它产生了价值“Sonia Gandhi”。

现在,每艘潜艇都有一名船长。由于尚未建造潜艇,因此您不能参考任何船长,因此参考Nehru->船长不符合逻辑。

然后你建造了10艘尼赫鲁级潜艇,每艘潜艇都分配了一名船长。一些潜艇是孟买,德里,拉斐尔雅各布,Rishi Kapoor。

你仍然不能指尼赫鲁 - >船长获得十名船长的名字。你可以说德里 - >船长,孟买 - >船长或者Rishi Kapoor->船长并获得相应船长的名字,但是没有任何这样的有效参考作为Nehru->船长,因为尼赫鲁参考是一个类设计而不是船。

然而,您可以参考德里 - >设计师或孟买 - >设计师或Rafael Jacob->设计师,它将像Nehru->设计师那样产生“Sonia Gandhi”。

在那里,得到了吗?

答案 4 :(得分:0)

除了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
  }
}

答案 5 :(得分:0)

  

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

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

  

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

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

答案 6 :(得分:0)

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

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

图像对象为家庭,子对象是数据成员,boardSchoolBus是静态函数。 每个孩子都可以登上校车,但是如果你要求校车去接孩子,就需要知道哪个家庭要去吧?