我正在尝试更多地了解静态成员,并且我一直在尝试使用代码片段来查看哪些有效/合法,哪些无效.
我的理解是静态变量不在类/结构内,而是分开的.换句话说,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;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为语言允许它.该this指针仅用于其在这方面的类型; 当发现该成员是静态的时,将不使用该指针.也就是说,编译后的代码根本不会使用指针.
因此,两者相当于1,但编译器可能会发出警告.您应该更喜欢使用类型名称来访问静态成员,因为它更能代表实际发生的情况,因此更清楚.
进一步阅读:通过实例访问静态成员(包含这种技术何时有用的一些示例)
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;
}
Run Code Online (Sandbox Code Playgroud)
编译器在编译时知道它在哪里test().x,因为它知道test()返回对a的引用Foo,并且Foo::x是静态的 - 但即使编译器知道在哪里找到test().x而没有实际发出的代码来评估test()它仍然会发出函数调用而只是忽略结果,因为替代方案(根本不打电话)可能更令人困惑.
在这个样本中,test().x = 1;相当于(test(), Foo::x = 1);.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |