我们都知道System::String是个引用类, 所以不得不使用跟踪句柄.
举一个简单的例子:
ABC类的定义,
- C/C++ code
public ref class ABC { private: System::String^ str0; private: System::String^ str1; public: ABC() { str0 = "ABCDEFG"; } System::String^ GetStr() { return str1; } };
执行代码,
- C/C++ code
int main() { ABC^ abc = gcnew ABC(); Console::WriteLine(abc->GetStr()); Console::Read(); // 仅为暂停控制台, 以便查看输出结果. return 0; }
.
如上代码可以编译运行, 输出结果只有一个换行符.
以此例为基础我有一个问题:
对于ABC类的成员str1, 它在类内的声明就是个跟踪句柄String^, 虽然ABC的构造函数没有对它进行初始化, 但是由输出情况看, str1是可以被引用的. 这是否意味着, 对象abc被构造时, 在CLR堆上, 其跟踪句柄型成员str1被预留(reserve)了内存空间, 并且这块内存空间还被String的默认构造函数给初始化了? 若不是, 那实际情况是什么?
------解决方案--------------------
CLR上声明对象的时候会分配指针和同步块索引(好像是这个词)
在实例化(new)的时候分配成员的内存,并调用构造函数对其初始化;
如果类没有构造函数,会生成一个默认的构造函数。
------解决方案--------------------
不是
Class A {}
A a; 声明
a = new A();实例化
------解决方案--------------------