C++ 为什么我们可以使用带指针的箭头?
我知道箭头操作符C++ 为什么我们可以使用带指针的箭头?,c++,.net,c++-cli,C++,.net,C++ Cli,我知道箭头操作符->用于取消引用对象,但我对它在Visual Studio.net framework的这段代码中的用法感到非常困惑: private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { if (txtDisplay->Text->Contains("-")){ //this could be phrased like (*txtDispla
->
用于取消引用对象,但我对它在Visual Studio.net framework的这段代码中的用法感到非常困惑:
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;
}
}
另一个问题,堆中分配对象的主要目的是什么,因为我假设对象“代码> TxtStuts/Cuth>是堆中的,因为它是指针?< /p> ,您把C++与.NETFramework及其C++扩展混淆了。
txtDisplay
对象有一个Text
属性,该属性可能是System::String^
,这意味着它是一个托管对象。因此,您可以将值“分配”给托管对象,就像您可以将值分配给任何其他可分配类型或具有重载赋值运算符的类型一样
例如,在.NETC++中,你可以做如下的事情:
System::String^ SomeFunction(int i) {
return i.ToString();
}
显然,int
类型是没有任何成员方法的基本类型;但是,既然你使用.NET,你就在使用一个伪C++编译器,它实际上将C++代码编译成.NET,然后通过.NET运行时执行,运行字节码而不是纯汇编(传统C++编译为)。
这就是为什么您可以分配给Text
成员的原因
关于对象是在堆中分配还是在堆栈中分配,这实际上取决于.NET编译器/解释器,但根据我在文档中阅读的内容,由于引用计数和垃圾收集,它很有可能在堆中而不是在堆栈中。我应该注意到,这纯粹是.NET框架,而不是关于使用ISO/ANSI C++的情况。
最好用.C++语言来思考.C++,类似C++的语法,而不像ISO C++,因为它们是不同的东西;是的,你可以在.NET C++中使用ISO C++,但是这样做会导致奇怪的和意外的行为,因为.NET CLR与在特定环境中运行的“正常”C++应用程序是如何工作的。指针只是间接寻址的一种形式——但它可以位于任何位置(堆、堆栈、静态内存、共享内存等)。也就是说,这不是真的C++。
T^
语法是Microsoft对AFAIK托管指针的扩展,这意味着Object^
和EventArgs^
将是托管对象。我不知道他们使用这个扩展的实际位置,但我假设它在堆上。@Human Compiler txtdisplay是一个对象,对吗?文本也是对象还是数据成员?@RenzCarillo。。我已经在汇编级上剖析了.NET框架,用了C和C++ 20年以上;它随领土而来;)