C#对象和C++;对象,区别

C#对象和C++;对象,区别,c#,c++,pointers,C#,C++,Pointers,在C#中创建对象实例时 这个mc现在是对在内存中创建的Myclass对象的引用。它就像指向那个记忆的“指针” 这与在(托管或非托管)C++中执行此操作相同或类似: 因为这实际上创建了一个指向类的对象实例的指针 我只是想找出这些差异到底是什么? C++中你负责删除那个内存,而在C语言中你没有。这可能是你想要记住的最大区别 就相似性而言,它们都是堆分配的对象 是一篇关于C#中的堆与堆栈的好文章,您可能会发现这篇文章很有用。它们在new为成员变量分配内存的意义上是相等的。它们不同,C++(在你的例子

在C#中创建对象实例时

这个
mc
现在是对在内存中创建的
Myclass
对象的引用。它就像指向那个记忆的“指针”

这与在(托管或非托管)C++中执行此操作相同或类似:

因为这实际上创建了一个指向类的对象实例的指针


<>我只是想找出这些差异到底是什么?

C++中你负责删除那个内存,而在C语言中你没有。这可能是你想要记住的最大区别

就相似性而言,它们都是堆分配的对象


是一篇关于C#中的堆与堆栈的好文章,您可能会发现这篇文章很有用。

它们在
new
为成员变量分配内存的意义上是相等的。它们不同,C++(在你的例子中)是指向内存中对象的指针,C语言有一个引用(它不是指针,也不是C++引用,也就是说,它可以是空的)。 这两种语言都保证
new
的结果为非空,或抛出错误(即C#中的
OutOfMemoryException

当然,C++、C语言中的对象、类等的整体行为有很大的不同(垃圾回收、自动装箱行为、静态构造函数等)。

编辑:在另一个问题中没有提到的一件事:C++中的任何<代码>新< /COD>将调用完整的类层次结构的构造函数。C#仅为单继承,只调用层次结构中的第一个构造函数或对象构造函数。在C#中,如果没有定义构造函数,

new X()
等于
new object()

,它们是相似的,但是C#版本有一些重要的注意事项:

  • 您可以使用new Blah()创建值对象和引用对象。值对象的行为与引用对象不同:指定它们将复制数据,而不是引用

  • C#引用对象被垃圾收集

我认为C版本对本例中的
参考
更具分析性:

MyCppClass *mcCppClass = new McCppClass();
MyCppClass &reference = *mcCppClass;
<>在C++中,你不必担心代码>引用< /COD>指向空。它就在那里,所以你用它。但是,在C#中,对象引用可以为null

也如Kyle Walsh指出的,C++负责删除与<代码> MCPCPGROODS指针相关的内存。在C#中,对象将被自动垃圾收集


需要注意的一点是,C#区分了类和结构。类是引用类型,而结构是值类型。在C++中,类和结构在默认成员可见性级别上只有不同(默认情况下,类具有私有成员可见性,而结构默认情况下具有公共成员可见性)。这是从C++到C语言的一个重要区别。有关更多详细信息,请参阅。

它可能被称为引用,但它作为指针处理(可以为NULL)。在C++中,引用不能为null,它总是引用<强>相同的<强>实例。< /P> 在C++中,引用和指针之间存在着很大的差异。而C++(或java)的“引用”比C++引用更接近C++指针。
int a = 3;
int b = 2;
int & c = b; // c and b will alway refer to the same thing.
c = a;    
std::cout << b << std::endl; // shows 3

int * pa = new int(3);
int * pb = new int(2);
int * pc = pb;
pc = pb; // pc and pb are now refering to different things

std::cout << *pb << std::endl;// shows 2
inta=3;
int b=2;
int&c=b;//c和b总是指同一件事。
c=a;

std::cout一个重要的区别,似乎还没有人提到,是:

Myclass mc = new Myclass();
在C#中,这是创建新对象的唯一正确方法。当您需要一个对象时,这就是您创建它的方式

MyCppClass *mcCppClass = new MyCppClass();
在C++中,这是如何创建对象,以及如何偶尔创建对象。在C++中使用这种方法的问题是:

  • 与托管语言相比,
    new
    在C/C++中速度非常慢。如果你用它来分配你需要的每一个对象,它会伤害你
  • 对象没有固定的生存期。它是在堆上分配的,在您对其调用
    delete
    之前,它不会被销毁。如果你忘记这样做,它永远不会被摧毁。如果调用
    delete
    两次,程序就会崩溃
在C++中,有两种方法来创建对象: 您在上面使用的:

// 1
MyCppClass *myobject = new MyCppClass();
delete myobject;
但是修改后也包含了
delete
调用,因为如果没有它,内存就会泄漏。无论何时使用
new
,您早晚都必须调用
delete
。一般来说,一个没有另一个是错误的

第二种更常见的方法是:

// 2
MyCppClass myobject;
第二个在某些方面与你的C#示例更相似。它的生命周期由系统自动管理(尽管它被管理的方式是不同的。在C++中,它持续到范围之外,在C中它一直持续到没有人引用它,并且它被垃圾收集了——但是在这两种情况下,你不必做任何事情来确保它被破坏)。出于同样的原因,通常这也是创建对象实例的正确方法


新C++程序员最常见的错误之一是使用<代码>新< /Cord>分配每个对象,并存储指针,然后尝试删除它们。一个更简单、更健壮、更有效的解决方案是尽量避免
new
,并避免使用指针。有时,您需要一个对象,其生存期不限于声明范围(并且在该范围外复制对象不是使用它的选项)。然后使用<代码>新< /Cord>,最有可能的是,将生成的指针包在某种类型的智能指针中。

我同意引用的相似性,正如您所说的,引用在C++中不能为空。但是,它们在C#-)中可以为null允许C++引用为<代码> null >代码>,而C++引用则不为。C引用也确保了它们的目标至少有一个生命周期,只要引用它,而C++引用则没有。事实上,他们的收入很少
// 1
MyCppClass *myobject = new MyCppClass();
delete myobject;
// 2
MyCppClass myobject;