为什么我需要在C#中实例化一个对象,而不是在C++中为了访问一个类的函数?

Leo*_*son -2 c# c++ memory memory-management

我最近开始用C#编写Unity(游戏引擎)开发.我注意到与C++不同; C#要求我在使用其成员函数或变量之前在堆上实例化一个对象.与C++一样,我可以声明一个对象并从声明名称中调用任何函数.

C++示例:

#include <iostream>
using namespace std;
class SampleClass 

{
   void PrintFunc()
   {
      cout<<"Hello World"<<endl;
   }
 }

int main()
{

   SampleClass objectC; //Object declaration
   objectC.PrintFunc(); //Use of function without instantiation

   //The above code will print'Hello World'
}
Run Code Online (Sandbox Code Playgroud)

C#示例:

 using System

 namespace ConsoleProject2
{
    class MainClass
   {

   class SampleClass
   {
        Void PrintFunc()
        {
          Console.WriteLine("Hello World");
        }
    }

    public static void Main (string[] args)
    {

        SampleClass objectC = new SampleClass();
        //Must instantiate before accessing member functions 
        objectC.PrintFunc(); //Prints out 'Hello World'

    }
}
Run Code Online (Sandbox Code Playgroud)

}

在Unity的自动内存管理网站上阅读我只能得出结论,由于它是自动垃圾收集,它可能需要你在堆上放置新对象,因为它为你解除分配.(可能是错误的假设,请纠正我)

为什么这两种语言在访问对象属性时有所不同?由于没有实例化,C++中的对象是否被放置在堆栈中; 如果是这样,为什么不将所有对象放在堆栈上?

谢谢.

Eri*_*ert 6

关于这个主题在互联网上出现的问题存在很多错误信息,因此请仔细阅读.

我注意到,与C++不同,C#要求我在使用其成员函数或变量之前在堆上实例化对象.

这是在C#中考虑它的错误方法.不要将"新"视为"使堆存储的东西".将"new"想象为"调用初始化对象的构造函数".是否通过复制它(值类型)来传递该对象,或者通过自动取消引用它(引用类型)来访问该对象并不会改变每个对象需要以确保它正确的方式构造的事实.无论是长期存储还是短期存储,都会进行初始化.

由于没有实例化,C++中的对象是否被放置在堆栈中

有一个实例,你只是没有看到它,因为它没有在代码中显示.为您调用默认构造函数.

如果是这样,为什么不将所有对象放在堆栈上?

不要再想"堆栈"和"堆",而是开始考虑"短寿命变量"和"长寿命变量".为什么我们不将所有对象放在短期变量池上? 因为有些物体寿命很长,所以这就是原因.

放松,让垃圾收集器完成它的工作.它做得很好!