“之间的区别”&引用&引用;::&引用;及-&燃气轮机&引用; 在C++中,这3个代码块之间有什么不同: MyClass->m_Integer // 1 MyClass::m_Integer // 2 MyClass.m_Integer // 3
“之间的区别”&引用&引用;::&引用;及-&燃气轮机&引用; 在C++中,这3个代码块之间有什么不同: MyClass->m_Integer // 1 MyClass::m_Integer // 2 MyClass.m_Integer // 3,c++,C++,->和运算符是访问类实例成员的方法,而:允许您访问类的静态成员 ->和之间的区别在于箭头用于通过指向实例的指针进行访问,而点用于访问值(非指针) 例如,假设您有一个类MyClass,定义为: class MyClass { public: static int someValue(); int someOtherValue(); }; 您将在以下情况下使用这些运算符: MyClass *ptr = new MyClass; MyClass value; int arrowVa
->
和
运算符是访问类实例成员的方法,而:
允许您访问类的静态成员
->
和
之间的区别在于箭头用于通过指向实例的指针进行访问,而点用于访问值(非指针)
例如,假设您有一个类MyClass
,定义为:
class MyClass
{
public:
static int someValue();
int someOtherValue();
};
您将在以下情况下使用这些运算符:
MyClass *ptr = new MyClass;
MyClass value;
int arrowValue = ptr->someOtherValue();
int dotValue = value.someOtherValue();
int doubleColonValue = MyClass::someValue();
在Java中,这看起来像:
MyClass ref = new MyClass;
int dotValue = ref.someOtherValue();
int doubleColonValue = MyClass.someValue();
->意味着MyClass是指向该类的指针,所述指针需要被取消引用以获得成员m_Integer ::是作用域或命名空间运算符。这意味着m_Integer要么是静态的,要么需要您明确标识m_Integer在哪个范围或命名空间中 。表示从MyClass直接(而不是通过指针)访问m_Integer。这与您从Java内部访问memebers的方式差不多,应该是您最熟悉的方式。
--a::b
是一个名称空间或类(不是实例),因此a
需要是一些静态实体b
--a.b
是类的实例,a
是类的成员b
——与a->b
((*a).b
是指向类实例的指针)a
操作符->
可能会过载。对于内置版本的工作原理,您已经得到了一些合理的解释,但是重载的操作符->
有点不寻常,因此也许值得添加一些关于其工作原理的信息
本标准非常简洁地描述了操作员->
的不寻常之处(§13.5.6):
如果存在T::operator->(),并且重载解析机制(13.3)将运算符选择为最佳匹配函数,则表达式x->m对于类型为T的类对象x解释为(x.operator->())->m
这有几个含义:
->
看起来像一个二进制运算符,但从重载的角度来看,它本质上是一个一元运算符——重载将是一个不带参数的成员函数运算符->
,另一种是指向某个对象(类或结构类型)的指针由于可以返回本身重载
运算符->
的对象,因此形式为x->m
的表达式可以隐藏任意数量的复杂性(调用任意数量的函数)。你写的x->m
实际上可以扩展到x->y->z->a->b->…m
确保你有。如果没有一本好书,学习和正确使用这种语言是非常困难的。您还可以使用:
操作符(称为范围解析操作符)来引用命名空间或类的成员。