c – 通过对象实例访问私有静态成员
我正在尝试更多地了解静态成员,并且我一直在尝试使用代码片段来查看哪些有效/合法,哪些无效.
我的理解是静态变量不在类/结构内,而是分开的.换句话说,下面代码中的变量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指针仅用于此上下文中的类型;当发现该成员是静态的时,将不使用该指针.也就是说,编译后的代码根本不会使用指针.
因此,这两者是等效的,尽管编译器可能会发出警告.您应该更喜欢使用类型名称来访问静态成员,因为它更能代表实际发生的情况,因此更清楚. 进一步阅读: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);. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |