c++的构造函数和C#中的有什么不同
4个回答
展开全部
(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++:
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# 中,在对象的构造函数执行之前对象的类型信息就已经初始化好了,所以可以进行正常的虚函数调用。
参考资料: http://webservices.ctocio.com.cn/net/479/9493979.shtml
展开全部
一样的,C#本身就是在C++基础上发展的。主要是隐藏了内存管理的细节。
C#基本没有指针的概念。
C#基本没有指针的概念。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-07-05
展开全部
1.没有返回值
2.不可被外部主动调用
3.可以默认实现
4.可以使用下面写法:
a(int c,int d)
:c(c),d(d)
{
}
5.函数名需要和类名相同
如果是3个的话,哈哈,建议你选125
另外,团IDC网上有许多产品团购,便宜有口碑
2.不可被外部主动调用
3.可以默认实现
4.可以使用下面写法:
a(int c,int d)
:c(c),d(d)
{
}
5.函数名需要和类名相同
如果是3个的话,哈哈,建议你选125
另外,团IDC网上有许多产品团购,便宜有口碑
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-07-05
展开全部
从语法上来说,两者没有什么不同的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询