gpt4 book ai didi

c# - 当我从 C 和 C# 过渡到 C++ 时,会有什么不同?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:09 26 4
gpt4 key购买 nike

这是一个简单的问题。

我使用 C 和 C# (2.0) 完成了大量工作,但从未使用 C++。学习 C++ 时我能期待什么不同?我是否也应该注意任何大问题或障碍?有没有人为有经验的程序员学习 C++ 提供好的速成类(class)书籍/网站推荐?

最佳答案

我能想到的主要区别是 C++ 比 C 和 C# 更像是一种多范式语言。在 C# 中,OOP 仍然是 范例。它首先是一种 OOP 语言,如果您不执行 OOP,C# 社区会告诉您您做错了。(尽管在过去几年中,C# 也为一些函数式编程添加了很好的支持)。

在 C++ 中,OOP 是受支持的,您可以在需要时使用它,但所有的麻烦都围绕着泛型编程。 C++ 模板允许广泛的智能、可重用和通用库,并实现许多与老式 OOP 相同的目标,但没有大的继承层次结构,类之间几乎没有耦合。标准库包含很多这样的例子

在 C++ 中,许多 C 构造虽然仍然合法,但基本上被回避了:

  • 原始指针(通常替换为智能指针,例如 boost::shared_ptrstd::auto_ptr,或替换为引用
  • 用户代码中的内存分配(通常应该包裹在智能指针或定制的 RAII 对象中)
  • 函数指针(通常用仿函数代替,以获得更好的类型安全性和性能)
  • goto(在 C 中经常用于跳转到清理代码。同样,RAII 不再需要)
  • 预处理器(几乎从来不需要。更喜欢模板)

当然,上述每一点都有异常(exception),但作为一般经验法则,与 C 代码不同,C++ 代码几乎不会使用这些。

与 C# 相比,类确实是承担大量繁重工作的主力军。在 C# 中,一个类只不过是一个脚手架,一个用于粘贴所有方法的容器。当然,它有一个构造函数,并且它可以实现 Dispose();但是 C++ 更进一步,你有:

  • 构造函数(就像在 C# 中一样,从头开始初始化类)
  • 复制构造函数(将一个类初始化为另一个对象的拷贝)
  • 赋值运算符(因为类是 C# 认为的值类型。因此赋值不仅仅是更改引用,而是以用户定义的方式复制对象的所有内容)
  • 析构函数

析构函数可能是 C++ 中最重要的概念。它对 RAII 至关重要,它是内存或其他资源的管理方式,因为当对象超出范围时会自动调用它。这允许您的类做出大量在 C 或 C# 中无法实现的保证。例如,boost::thread 提供了作用域锁,保证在超出作用域时释放,无论函数正常返回、抛出异常还是其他任何情况。所以在使用这个库的时候,用户不用担心释放锁或者其他资源。一旦您处理完它们,它就会自动发生。

从某种意义上说,这为您提供了更多的钩子(Hook)来自定义类的行为。与 C# 不同,您可以准确控制执行简单赋值时发生的情况。当类超出范围、从头开始初始化或作为另一个对象的拷贝时,您可以控制发生的情况。这使得编写良好的类几乎不可能被错误使用。 (差不多)

除此之外,模板和模板元编程是您可能会遇到的概念。它们是非常强大的工具,因此请确保您与它们保持友好关系。 :)

关于c# - 当我从 C 和 C# 过渡到 C++ 时,会有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/391346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com