2

我知道在 C++ 中,您使用->or::代替.C# 等语言来访问对象的值,例如button->Textor System::String^,但我不知道什么时候应该使用->or ::,这非常令人沮丧,因为它会导致我出现许多编译器错误。如果您能提供帮助,我将不胜感激。谢谢 :)

4

5 回答 5

10

->是当您访问指针变量的成员时。EG:myclass *m = new myclass(); m->myfunc();调用myfunc() 指向 的指针myclass::是作用域运算符。这是为了显示某些东西在什么范围内。所以如果myclass在命名空间中,foo那么你会写foo::myclass mc;

于 2013-10-30T16:00:52.060 回答
4
  • ->如果您有指向某个对象的指针,这只是取消引用该指针并访问其属性的快捷方式。

    pointerToObject->member是相同的(*pointerToObject).member

  • ::用于从某个范围访问内容 - 它仅适用于命名空间和类/结构范围。

    namespace MyNamespace {
      typedef int MyInt;
    }
    MyNamespace::MyInt variable;
    
于 2013-10-30T16:05:35.233 回答
4

与您的问题所述相反,您确实.在 C++ 中使用。相当多。

.(与访问成员和方法的非指针一起使用)

std::string hello = "Hello";
if (hello.length() > 3) { ... }

->(与访问成员和方法的指针一起使用)

MyClass *myObject = new MyClass;
if (myObject->property)
    myObject->method();

::(范围分辨率)

void MyClass::method() { ... } //Define method outside of class body

MyClass::static_property; //access static properties / methods

::也用于命名空间解析(参见第一个示例,std::string,其中string是在命名空间中std)。

于 2013-10-30T16:10:11.223 回答
3

我尝试展示::,.和的一些用法示例->。我希望它有帮助:

int g;

namespace test
{

  struct Test
  {
     int x;
     static void func();
  };

  void Test:: func() {
     int g = ::g;
  }

}

int main() {

  test::Test v;
  test::Test *p = &v;

  v.x = 1;
  v.func();
  p->x = 2;
  p->func();

  test::Test::func();

}
于 2013-10-30T16:07:47.107 回答
2

当左操作数是指针时应用运算符 ->。考虑例如

struct A
{
   int a, b;
   A( int a, int b ) : a( a ), b( this->a * b ) {}
};

运算符 :: 引用右操作数所属的类或名称空间。例如

int a;

strunt A
{
   int a;
   A( int a ) { A::a = a + ::a; }
};

使用句点,然后左操作数是对象的左值。例如

struct A
{
   int x;
   int y;
};

A *a = new A;

a->x = 10;
( *a ).y = 20;
于 2013-10-30T16:12:36.887 回答