【发布时间】:2020-09-06 05:19:24
【问题描述】:
假设我设计了一个这样的类:
// MyClass.h
#pragma once
class MyClass
{
public:
const int member = 1; // Since it is a const-integral type var...
static const int s_member;
...
};
然后我可以像这样访问每个成员:
// MyClass.cpp
const int MyClass::s_member = 2; // Initialization of a static member
int main()
{
MyClass* myClass = new MyClass;
std::cout << "access to an ordinary member : " << myClass->member << " OR " << (*myClass).member << std::endl;
std::cout << "access to a static member : " << MyClass::s_member << std::endl;
...
return 0;
}
(据我所知,通过指针访问类成员只会产生细微的差别:传递地址并取消引用它。)
在这里,我很好奇的是这与编译器访问静态成员的方式之间的区别。
我已经知道静态成员的内存位于类实例之外的某个地方,而不是在它内部。 (所以每个类实例都为其静态成员使用相同的内存。)
那么,访问静态的唯一区别是“从哪里访问”?还是存在着超越它的东西?
【问题讨论】:
-
如果我正确理解了您的问题,那么不,访问静态成员和非静态成员除了它们所在的位置之外没有区别。
-
静态成员变量、静态局部变量、静态全局变量和非静态全局变量——它们都具有被分配一次的共同性质(而不是每次调用函数或实例化对象时) ),因此在整个程序执行过程中具有相同的内存地址。
-
'编译器',或者说你的程序在运行时,通过它们的固定地址'访问'静态成员,通过它们与
this的当前值的偏移来'访问'非静态成员。 -
@Ahmn21 不,它没有。这个问题根本没有解决非静态非常量成员。
标签: c++