C++和C#构造函数的区别
来源:互联网 发布:淘宝兑换虾米会员 编辑:程序博客网 时间:2024/05/01 02:15
(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# 构造函数的区别
- C++和C#构造函数的区别
- C++, C#引用的区别和C#的类为什么没有拷贝构造函数
- C++, C#引用的区别和C#的类为什么没有拷贝构造函数
- C++, C#引用的区别和C#的类为什么没有拷贝构造函数
- C#构造函数里的base和this的区别
- C#构造函数里的base和this的区别
- C#构造函数里的base和this的区别
- C#构造函数里的base和this的区别
- C#构造函数里的base和this的区别
- 【C++】复制构造函数(拷贝构造函数)和=运算符重载使用的区别
- C++/C#的区别之在构造函数中调用虚函数
- 构造函数和一般函数的区别
- 构造函数和一般函数的区别
- C/C++ Notes: #define和#typedef的区别以及构造函数和析构函数
- 拷贝构造函数和赋值构造函数的区别
- 拷贝构造函数和赋值构造函数的区别
- 赋值构造函数和拷贝构造函数的区别
- 在C#的构造函数中,如何显式的先调用父类或者是自己的构造函数?
- StreamReader和中文XP的不匹配,及其乱码的解决
- C# Concepts: Value vs Reference Types
- 在VMware 下运行Mac OS 10.5.5 (Leopard)
- 央视曝光百度竞价排名黑幕
- C++和C#构造函数的区别
- General Introduction of Web Service Security
- (一) WPF中TextBox控件与TextBlock控件值的绑定
- 就这样开始吧!!
- woauolt.exe,System.exe,Update.dll,MPKrnl.dll,360mon.dll,upnpsrv.dll等2
- Linux服务器常出现错误及代表含义
- 新一代的专业测试人员
- default”标签跳过...错误
- 欠账一篇