首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++静态成员函数及其作用域

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

Stack Overflow用户
提问于 2009-12-09 11:16:30
回答 7查看 6.5K关注 0票数 1

我有两个问题。

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

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

我的笔记说第一个问题为假,第二个问题为真。我就是找不到原因?你能解释一下为什么会这样吗?谢谢。

另外,我正在为期末考试做准备,但我似乎不知道为什么。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-12-09 12:07:46

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

下面的代码很好用:

代码语言:javascript
运行
复制
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是隐式的。因此它们对非静态数据成员的访问可以是直接的。

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

票数 13
EN

Stack Overflow用户

发布于 2009-12-09 11:20:06

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

票数 5
EN

Stack Overflow用户

发布于 2009-12-09 11:21:58

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1871379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档