为什么我们可以使用带指针的箭头?

Why can we use arrow with pointer?

我知道箭头运算符 -> 用于取消引用对象,但我对它在 Visual Studio .net 框架的这段代码中的用法感到很困惑:

private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
    if (txtDisplay->Text->Contains("-")){ //this could be phrased like (*txtDisplay).Text, why does the 'Text', a data member could contain a method named 'Contains()', and if 'Text' is not a data member but rather a class object, why can we assign a value into just like the line next after.
        txtDisplay->Text = txtDisplay->Text->Remove(0, 1); //in here we have assign a value of 'Text' and because of that i assumed 'Text' was a data member
    }
    else {
        txtDisplay->Text = "-" + txtDisplay->Text;
    }
}

另一个问题,在堆中分配对象的主要目的是什么,因为我假设对象 txtDisplay 在堆中,因为它是一个指针?

您将 C++ 与 .NET 框架及其 C++ 扩展混淆了。

txtDisplay 对象有一个 Text 属性,这可能是一个 System::String^,这意味着它是一个托管对象。因此,您可以将 'assign' 值赋给托管对象,就像您可以将值赋给任何其他可赋值类型或重载赋值运算符一样。

例如,在 .NET C++ 中,您可以执行如下操作:

System::String^ SomeFunction(int i) {
    return i.ToString();
}

很明显,int类型是没有任何成员方法的基本类型;然而,由于您使用的是 .NET,本质上您使用的是一个伪 C++ 编译器,它实际上将 C++ 代码编译成 .NET,然后通过 .NET 运行时执行,它运行字节码而不是纯汇编(这就是传统的 C++ 被编译为)。

这就是为什么您可以分配给 Text 成员的原因。

关于对象是在堆中还是在堆栈中分配,这实际上取决于 .NET compiler/interpreter,但根据我在文档中阅读的内容,它很有可能在由于其引用计数和垃圾收集,堆而不是堆栈。我应该注意,这纯粹是针对 .NET 框架的, 而不是 关于如果您使用 ISO/ANSI C++ 会发生什么。

最好将 .NET C++ 视为具有类似 C++ 语法的 C#,而不是 ISO C++,因为它们是完全不同的东西;是的,您可以在 .NET C++ 中使用 ISO C++,但是由于 .NET CLR 在特定环境中与 'normal' C++ 应用程序 运行 的工作方式不同,这样做可能会导致奇怪和意外的行为。