当我从C&C#过渡到C++时,我有什么期望会有所不同?

dan*_*ine 4 c c# c++

这是一个简单的问题.

我使用C&C#(2.0)完成了大量工作,但在C++中从未做过任何事情.学习C++时,我可以期待什么不同?我是否应该注意任何重大问题或障碍?有没有人为经验丰富的程序员学习C++的课程书/网站建议?

jal*_*alf 14

我能想到的主要区别是C++远不是C和C#的多范式语言.在C#中,OOP仍然范例.它之前是OOP语言,如果你没有做OOP,C#社区会告诉你你做错了.(尽管C#在过去几年中也为一些函数式编程提供了很好的支持).

在C++中,OOP是支持的,你可以在你喜欢的时候使用它,但所有的大惊小怪都是围绕通用编程.C++模板允许广泛的聪明,可重用和通用库,并实现许多与旧式OOP相同的目标,但没有大的继承层次结构,并且几乎没有类之间的耦合.标准库包含许多此示例

在C++中,很多C构造虽然仍然合法,但基本上都是避开的:

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

当然,这些要点中的每一个都有例外,但作为一般的经验法则,与C代码不同,C++代码几乎可以消除对这些内容的所有使用.

而且在C#中,课程确实是很重要的工作.在C#中,一个类只不过是一个脚手架,一个容器来粘贴你所有的方法.当然,它有一个构造函数,它可以实现Dispose(); 但C++更进一步,你有:

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

析构函数可能 C++中最重要的概念.对RAII来说至关重要,这就是内存或其他资源的管理方式,因为当对象超出范围时会自动调用它.这允许您的类在C或C#中实现许多无法实现的保证.例如,boost :: thread提供了一个范围锁,当它超出范围时,保证释放,无论函数是否正常返回,抛出异常,还是其他任何东西.因此,在使用此库时,用户不必担心释放锁或其他资源.只要你完成它们,它就会自动发生.

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

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


Gan*_*ant 8

以下是我的观点:

  • 指针在C++中扮演着重要角色.在C#中,您只有引用类型.你可能会因指针错误而头疼.
  • 您还必须手动管理内存分配.如果没有正确完成,您的程序可能会遇到内存泄漏.在C#中,每个对象都会自动进行垃圾回收.
  • 类的声明和定义通常在头文件(.h)源文件(.cpp或.cc)中分隔 .这首先会引起一些混乱.
  • 在C++中,您将不会像在C#中那样拥有这么多的基类库支持.例如,您不会 HttpRequest在C++中内置类.
  • 因此,您将不得不使用大量外部库并知道如何处理.dll或.lib.
  • C++ Interface在C#中没有.您将使用抽象类(和多重继承).
  • C++中的字符串是char数组或指向char的指针.
  • 有一些算法和数据结构可用于标准模板库(STL.)但是在开始有效地使用它之前需要花时间学习:)

您还可以学习C++/CLI,将.NET代码和本机C++混合在一起,以实现两全其美.


Sea*_*ean 0

最大的“障碍”可能是您将负责释放您分配的内存