之间的差异.和::在C++中用于静态成员
Difference between . and :: in C++ for static members?
可能重复:
在C++中,我什么时候使用句点、箭头或双冒号来指代类的成员?
当我尝试使用Class.Variable
访问静态变量时,我会得到Error left of 'Variable' must have class/struct/union
的错误,而当我使用Class::Variable
时,我不会得到错误。尽管在这两种情况下,我都是通过intellisense获得Variable
的。在这种情况下,.
和::
之间到底有什么不同?
类的静态成员可以通过两种方式访问
(a( 使用类的实例-使用.
,例如obj.variable
(b( 没有类的实例-使用::
,例如class::variable
.
用于对象::
用于类名。
struct foo {
int x;
static int y;
};
foo bar;
bar.x = 10; // ok
bar.y = 20; // ok - but bad practice
foo.x = 10; // WRONG foo is class name
foo.y = 20; // WRONG foo is class name
foo::x = 10; // WRONG x requires object
foo::y = 20; // ok
最佳实践:
bar.x = 10;
foo::y = 20;
.
是一个实例引用(例如,在LHS上有一个对象(。::
是一个静态引用。RHS上有一个类型。
Class::StaticProperty
InstanceOfClass.Property
::
用于类/命名空间范围,但在这种情况下,.
的左侧必须是一个变量。请注意,这是可行的,这可能就是为什么Intellisense也适用于您的原因:
Class x;
doSomething( x.Variable );
struct X
{
static int x = 5;
int y = 3;
}
namespace NS
{
int z = 1;
}
void foo()
{
X instance;
instance.x; // OK, class member access operator
X::x; // OK, qualified id-expression
instance.y; // OK
X::y; // Not OK, y is not static, needs an instance.
NS.z; // Not OK: NS is not an object
NS::z; // OK, qualified-id expression for a namespace member.
}
该措辞取自C++0x FDIS。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 在用于格式4的arm模拟器中实现功能时的一个问题