为什么我们可以使用带指针的箭头?
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++ 应用程序 运行 的工作方式不同,这样做可能会导致奇怪和意外的行为。
我知道箭头运算符 ->
用于取消引用对象,但我对它在 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++ 应用程序 运行 的工作方式不同,这样做可能会导致奇怪和意外的行为。