C++ 和 C# 构造函数的区别

原创 2004年08月04日 21:28:00

(1)C++ 不允许在一个构造函数中调用另外一个构造函数(称为委派构造函数调用),而 C# 则允许。例如:

C++:

struct Point {
public:
    int X, Y;
    Point(int x, int y);
    Point(Point pt) : Point(pt.X, pt.Y) { } // 错误,C++ 不允许
};

C#:

struct Point {
    public int X, Y;
    public Point(int x, int y);
    public Point(Point pt) : Point(pt.X, pt.Y) { } // 可以,C# 允许
};

委派构造函数调用语法上非常自然和易懂,因此你也许会质疑 C++ 不提供它是不是故意给程序员添麻烦。事实上,C++ 不提供这一特性并不是出于语法上的考虑,而是出于资源管理的考虑(噢,这样的事情对 C++ 来说还有很多很多)。我们知道,C++ 的构造函数用于分配资源,而析构函数用于释放资源,构造函数和析构函数调用必须匹配,否则就打破了 C++ 的基本规则。如果允许委派构造函数调用,则显然会打破这一规则——构造函数被执行两次,而析构函数只执行一次。当然,对一些类,例如前面的那个 Point 来说这不是个问题,但是从语言机制的角度讲这个特性可能属于“危险”的特性。注:在最新的 C++ 标准提议草案中,Herb 等人有一个关于允许委派构造函数调用的提案,当然这很大程度上是为了方便 C++/CLI 绑定。

(2)在 C++ 构造函数中,虚函数调用会被编译器自动转为普通函数调用,而在 C# 构造函数中允许进行虚函数调用。C++ 这样处理自然有它的原因——在 C++ 中,构造函数执行完成后对象才初始化好,对于多态对象来说,也就意味着构造函数在背后执行了很重要的一件事情——初始化对象的虚函数表。如果我们在基类的构造函数中调用了虚函数,则因为此时对象的虚函数表仍旧是基类的虚函数表,所以无法进行正确的虚函数调用。也就是这个原因,通常我们应该避免在构造函数中调用虚函数,因为它违背了虚函数的语义。而在 C# 中,在对象的构造函数执行之前对象的类型信息就已经初始化好了,所以可以进行正常的虚函数调用。

C# 与C++的区别小结

1、C#不支持多重继承。 使用多重继承可以使派生出来的类具有多重特性,使用紧凑的代码完成十分复杂的功能,但这样不可避免的是代码的调试和阅读变得困难和烦杂,...
  • u011974126
  • u011974126
  • 2015年09月04日 10:41
  • 2763

比较C#与C++、Java的异同

最近正在看C#视频,但是感觉效率很低,还是停下脚步总结一下、思考一下吧!         开始接触C#,我们都会有一个疑问:C#和C++有什么区别呢?学过Java的同学会想C#和Java有什么区别呢...
  • u013034286
  • u013034286
  • 2014年12月21日 10:30
  • 2677

C#与C/C++部分基础语法差异

博主最近在学习C#,以前摸过C和C++在学习C#基础语法时可以快速的略过,但是C#的基础语法和C和C++还是有差异,有的甚至是完全不同的,我在这里写出来打算加强自己的记忆与理解,同时希望能对其他准备开...
  • Hermit_Inwind
  • Hermit_Inwind
  • 2016年01月24日 23:10
  • 1288

C++与C#在变量定义上的区别

C++和C#在变量(对象、指针在内存的角度上都是变量:都是内存块;)的定义的概念上不可能有什么区别:编译器为变量开辟空间。但在形式上很不一样。C++中:A a;//定义a这个变量:告诉编译器这里有个A...
  • guigenyi
  • guigenyi
  • 2015年11月22日 19:41
  • 1180

C++,C#,VC,VC.net,java以及VC++有什么区别和联系?

C++ C# VC VC.net以及VC++有什么区别和联系?(2007-04-25 09:27:56)转载   C/C++是编程语言,C是C++的爸爸,也就是说C++从C发展而来,而C++完全兼容...
  • sac761
  • sac761
  • 2016年09月27日 11:22
  • 2042

C#和C++的速度大比拼

C#目前是微软.NET平台首推的应用程序开发语言。C#编写的应用程序必须运行在一个特殊的环境中,即受控环境(managed)。与以往非受控(unmanaged)的C++相比,C#应用程序的性能到底如何...
  • lhfslhfs
  • lhfslhfs
  • 2013年03月04日 16:00
  • 3584

C#类与C++类之比较

 摘  要:C#是微软公司伴随其. NET战略推出的一种全新语言,是一种先进的,面向对象的开发语言,能够方便快捷地建立基于微软网络平台的各种应用和在网络间互相调用的WEB服务。C#可以更好地帮助...
  • laoda1128
  • laoda1128
  • 2014年10月14日 14:19
  • 662

C++与C#中值类型与引用类型的区别

这些天学习C#,看到里面的值类型与引用类型,例如结构是值类型,类是引用类型,然后立马想到了C++中的类,那么C++中的类是什么类型呢,哈哈,忽然间有点迷惑,上网搜了搜还真有很多小伙伴们已经晕进去了,今...
  • linukey
  • linukey
  • 2014年12月04日 09:25
  • 575

C、C++、C#、Java、php、python语言的内在特性及区别

C、C++、C#、Java、php、python语言的内在特性及区别:       C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言。C语言应用指针:可以直接进行靠近硬件的操作,但是...
  • zllzb2011
  • zllzb2011
  • 2015年07月31日 14:17
  • 4676

C++ 和C# 继承机制的差异之浅见

C++继承方式总共分为以下几种: public、private、protected三种(它们直接影响到派生类的成员、及其对象对基类成员访问的规则)。 (1)public(公有继承):继承时...
  • wangzhen199009
  • wangzhen199009
  • 2013年01月03日 13:18
  • 2520
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 和 C# 构造函数的区别
举报原因:
原因补充:

(最多只允许输入30个字)