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# 中,在对象的构造函数执行之前对象的类型信息就已经初始化好了,所以可以进行正常的虚函数调用。

构造函数失败

什么函数都有可能失败,构造函数也不另外,比如new一个对象或空间不成功。当构造函数失败的时候,其实很多时候我们不想这个对象被继续生成,这个时候就可以在构造函数里面抛出异常。C++规定构造函数抛出异常之...
  • wind19
  • wind19
  • 2012-11-22 17:11:12
  • 4987

一个C++语法问题。

今天编写一个小程序。遇到了一个头一次遇到的问题。源代码大意可以转化如下:int n(10);for  (int i=0;iif  (i == n){   MessageBox("为什么我会被运行?")...
  • rayle
  • rayle
  • 2005-08-05 21:35:00
  • 830

c++构造函数和析构函数的区别?

构造函数: 什么是构造函数?通俗的讲,在类中,函数名和类名相同的函数称为构造函数。它的作用是在建立一个对象时,作某些初始化的工作(例如对数据赋予初值)。C++允许同名函数,也就允许在一个类中有多个构...
  • xinsong520
  • xinsong520
  • 2016-08-25 18:35:39
  • 758

C#构造函数和析构函数

1.构造函数式
  • u011458469
  • u011458469
  • 2014-06-08 21:38:18
  • 1887

C++构造函数失败

什么函数都有可能失败,构造函数也不另外,比如new一个对象或空间不成功。当构造函数失败的时候,其实很多时候我们不想这个对象被继续生成,这个时候就可以在构造函数里面抛出异常。C++规定构造函数抛出异常之...
  • qq_16209077
  • qq_16209077
  • 2016-10-08 19:44:55
  • 14341

关于构造函数的一些文章链接

http://c.chinaitlab.com/special/xxjx/Index.html  c++构造函数与析构函数http://pcedu.pconline.com.cn/empolder/g...
  • gengshenghong
  • gengshenghong
  • 2010-05-17 00:41:00
  • 461

C++中构造函数初始化列表与构造函数体的区别

既然构造函数初始化列表和构造函数体内赋值都可以对成员变量赋值,那么二者有何区别,是不是二者等效呢?  构造函数可以分两个阶段进行:(1)初始化阶段;(2)普通计算阶段。计算阶段也就是由函数体...
  • zuijinhaoma8
  • zuijinhaoma8
  • 2015-05-22 16:50:46
  • 1047

C++ 在初始化列表中初始化和在构造函数内初始化的区别

普通构造函数函数体内初始化:(事实上都是先初始化阶段再计算阶段) #include using namespace std; class A { public: A() // 无参构造函数 ...
  • ForestRound
  • ForestRound
  • 2016-10-03 10:32:09
  • 491

C++的STL库常用API--stack

stack的简介 stack是堆栈容器,是一种“先进后出”的容器。 stack是简单地装饰deque容器而成为另外的一种容器。 stack使用之前的准备#include using n...
  • qq_14998713
  • qq_14998713
  • 2016-08-06 11:04:59
  • 479

c++ 拷贝构造函数 继承

class Base{ public: virtual ~Base(); Base(const char *pStr); Base(const Base &other); ...
  • QQ18334373taikongyi
  • QQ18334373taikongyi
  • 2015-03-19 17:25:18
  • 337
收藏助手
不良信息举报
您举报文章:C++ 和 C# 构造函数的区别
举报原因:
原因补充:

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