gpt4 book ai didi

c++ - 通过对象实例访问私有(private)静态成员

转载 作者:太空狗 更新时间:2023-10-29 20:12:43 26 4
gpt4 key购买 nike

我试图更多地了解静态成员,并且我一直在尝试使用代码片段来查看哪些有效/合法,哪些无效。

我的理解是静态变量不驻留在类/结构中,而是分开的。换句话说,下面代码中的变量 y 应该被 A::y 而不是 this->y 访问,因此我的假设是下面的代码无法编译。我很惊讶它确实如此 (MingGW)。

谁能解释一下这种访问机制是如何工作和实现的。

// ClassA.h
class A{
private:
int x;
static int y;
public:
void setX(int x){this->x = x;}
void setY(int y){this->y = y;}
}

// main.cpp
#include "ClassA.h"

int main (int argc,char* argv[]){
A my_A;
my_A.setX(5);
my_A.setY(10);
return 0;
}

最佳答案

之所以可行,是因为语言允许这样做。 this 指针仅用于此上下文中的类型;当发现该成员是静态成员时,将不会使用该指针。也就是说,编译后的代码根本不会使用指针。

因此这两者是等价的1,尽管编译器可能会对此发出警告。您应该更喜欢使用类型名称来访问静态成员,因为它更好地代表了实际发生的事情,因此更加清晰。

进一步阅读:Accessing static members via an instance (包含此技术何时有用的一些示例)


1 当指针或对象是具有副作用的表达式时,情况并非总是如此。例如,给定以下代码:

#include <iostream>

class Foo {
public:
static int x;
};

int Foo::x = 0;

Foo aFoo;

Foo & test() {
std::cout << "test()" << std::endl;
return aFoo;
}

int main(void) {
test().x = 1;

return 0;
}

编译器在编译时知道 test().x 在哪里,因为它知道 test() 返回对 Foo 的引用>,并且 Foo::x 是静态的——但即使编译器知道在哪里可以找到 test().x 而无需实际发出评估 test( ) 它仍然发出函数调用并简单地忽略结果,因为替代方案(根本不进行调用)可能会更加困惑。

在此示例中,test().x = 1; 等同于 (test(), Foo::x = 1);

关于c++ - 通过对象实例访问私有(private)静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26007021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com