适用于C#开发人员的C ++


24

我非常了解C#(自学成才,可悲),并且需要为Windows应用程序进行一些C ++编程。对于能够学习C#的C ++开发人员,我已经找到了很多信息,但是当您已经了解C#时,就没有太多关于学习C ++的信息。有没有人遇到过一个很好的基础知识?

MSDN可以进行比较,但是比较不深入。

我可以整理几个来源,但发现其中有些东西-我只是找不到。谢谢你的帮助。


27
为什么“可悲”?不要那样放下自己。我不知道C#开发人员是不是无师自通。其中许多是了不起的开发人员。
史蒂文·埃弗斯

6
@SnOrfus-主要是因为学术界出于非理性的伪政治原因而避开它。
宫阪丽

5
我的第一个建议是不要尝试在C#上下文中学习C ++。因为C#不是C ++,而C ++不是C#。这可能是一个愚蠢的声明,但是C#很难使指针出错,并且即使使用使之非常容易使用的工具,也很容易在C ++中使指针出错。我还要补充说,这两种语言有很多共同点。基本上就像是说苹果和橙子都长在树上并有种子,因此它们是水果。
Ramhound 2012年

2
@ReiMiyasaka,与C#开发人员如何看待VB .NET相似。
Kyralessa

1
@Kyralessa这也是一种不幸。我认为这与其说是政治上的问题,不如说是对VB.NET受众的尊严,因为大多数C#的早期采用者都有C / C ++背景。我的学校虽然将VB.NET用于入门课程。他们似乎认为VB.NET是一种玩具,因此不应像C#那样对学生的思想造成破坏。
宫阪丽

Answers:


10

Java开发人员在C ++上使用的该线程非常相似,应该很有用,尤其是Mark Byer的帖子:

阅读这些书:

要记住的最重要的事情可能是了解C#/ Java和C ++在内存管理技术上的区别

我的一位教授来自Java背景,并教授了介绍性的C ++课程,认为那将是蛋糕。他的解释对任何人都没有任何意义。他到处都有内存泄漏。他的指针算法很糟糕。他从来没有参加过教学大纲的OOP部分(感谢上帝)。他展示的东西几乎没有汇编。他不明白那char[]需要哨兵\0。不要像他那样结局。


4
那么C ++char[]没有人使用的可惜,不是吗?
DeadMG 2012年

5
@DeadMG我不太明白你的意思。仅仅因为char[]很少在C ++中使用它并不意味着它没有被教或不应该被教。char[]请务必注意,因为C ++是C的超集,并且必须要完全理解它,如果要学习它,则势在必行
宫阪丽

7
是的- 他们掌握了语言的其他各个方面之后,非常非常非常长的时间。我宁愿教新学生部分模板专业知识和SFINAE。在C ++中,您可以使用std::string,并且如果您必须与C API互操作,那就c_str()可以了。程序员char[]在任何情况下都无需处理或终止为NULL。对于C语言风格的字符串处理,除了与旧的C代码互操作(完全由)很好地处理之外,它在所有可能的用途上都完全彻底弃用了c_str()
DeadMG 2012年

4
没有教义之类的东西char[],因为所有的使用char[]都是错误的。你的教授可能早就精绝如果他坚持C ++而不是C.
DeadMG

4
无论您是否自己编写C语言,您都会看到C ++中使用的C代码,因此,如果您正在学习C ++,则需要学习C语言。正如我说过的,我宽容,但是事实是问题是学校通常先教C语言,然后再讲授C ++,因为需要向学生讲授OS设计之类的知识-除了BeOS和某些研究OS之外,它绝对需要C。为此,您确实需要了解C字符串。再说一次,如果我有办法的话,我将第三次向一年级学生讲授C ++,最后一次,这完全不是重点。
宫坂丽(Rei Miyasaka)2012年

14

不幸的是,关于C ++的基本知识并不多,所以我对您的希望不高。此外,您对C#甚至可以远程移植到C ++的了解很少,因此我不希望存在涵盖该角度的任何特定材料。您需要从头开始学习。


3
那可以解释为什么那里没有太多东西。在阅读了C ++之后,似乎您是对的-这是一个完全不同的世界。谢谢你的帮助。
Mark Williams

1
+1,您几乎不了解C#甚至可以远程转移到C ++。我已经很难学到了。
ApprenticeHacker 2012年

快速地说,我会说有很多基本的C ++。区分指针/引用和C ++模板可以使您乍一想,但是当涉及到它时,仍然会有类cout和实现简单目标的简单方法
Kieren Johnstone

1
@KierenJohnstone:您的意思可能是“缓慢而异常且不安全的处理方式”,例如“数组到指针的衰减”等。
DeadMG 2012年

12
尼斯完全无益的答案。
dbracey 2012年

9

对此没有简单的解决方法,C ++并不是特别困难,但对于初学者来说并不容易。

我建议您阅读C编程的基础知识(以了解您会发现的低级内容),然后学习STL,然后再阅读Scott Meyers之类的文章。这是一个入门,它显示了与C-with-classs相比,您应该如何编写现代C ++。


2
+1:我要补充一下Meyer的书(有效的C ++ / STL系列)。我都拥有了,它们很棒。
史蒂文·埃弗斯

12
-1表示reading up on C programming。我认为这样做弊大于利,并传达出这样的观念,即C和C ++是需要一起研究的语言。
sebastiangeiger 2012年

2
@sebastiangeiger:您错过了要点,当您必须使用现有的现实世界C ++应用程序时,您通常将不得不处理类似C的结构。因此+1,至少可以消除您的不满情绪。
Doc Brown

5
@DocBrown也许可以,但是我现在正在那些C ++遗留项目中,我可以说我的前任基本上只是将其源文件另存为* .cpp的C程序员。我发现我使用的deleteC数组以及其他在C ++中不鼓励使用的东西要比使用它们少得多,这归因于我没有明确研究C。C相对简单,您可以很快弄清楚代码的作用。
sebastiangeiger 2012年

3
@gbjaanb:没有什么是,在所有的,大约需要知道STL mallocfree。一个优秀的C ++开发人员最终将想要了解它们。从他们开始完全是另一回事。
DeadMG 2012年

7

我不确定您是否还在寻找材料,几个月前我发现了这篇文章。这不是一本书(只有53页)。简介说明了一切:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

还有一个更新帖子:

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

快乐学习:)


但是,在使用本文档时要非常小心,它以Microsoft为中心的方式显示C ++(它也是如此)。它不能区分C ++ 03和C ++ 11功能,有时甚至将非标准扩展显示为首选解决方案。如果遵循该指南,最终将获得高度不可移植的代码。
法比奥·弗拉卡西

4
  • 注意内存管理。与C#相比,您可以清楚地了解指针和引用在C ++中的工作方式。此外,还提供了RAII,手动内存管理和智能指针。
  • 模板和泛型看起来很相似,但是是不同的野兽。了解模板工作原理的内部知识。
  • 有一些微小但醒目的语法差异。学习他们。
  • 您已经习惯了STL而不是.net BCL。如果您有LINQ瘾,您可能会错过一些好地方。
  • C ++和C#之间存在一些基本的设计差异。因此,您不能只是移植一个想法。使用C ++构建的任何东西都必须从头开始设计。
  • 祝好运

1

我认为最好不要在C ++到C ++教程中找到太多。它们可能使您的大脑困惑。这很像尝试先学习骑摩托车然后换自行车的学习方法(这不是完全恰当的方法,但您会想到的)。最好学习一本有关C ++的新书。由于您已经熟悉了OOP概念,因此可以跳过冗长的OOP概念介绍(它们适用于从C迁移到C ++的人们)。或直接阅读适合初学者或中级水平的参考书。


1

我建议去Rosetta Code并比较两者。当您在那里时,请随时获取C ++习惯用法的链接,并尝试发现它们。然后花一些时间在指针/引用/内存/析构函数领域。在了解了预处理器之后,当涉及到隐藏丑陋的东西时,它真的可以成为您的朋友,我有点想念它。最后是STL。


1

因此,大约一年前,我与您同在:自学成才的C#开发人员,他觉得有必要学习C ++。当然,我停下来多次。在第三次尝试时,我终于坚持了下来。

必须了解的是,就C ++和C#方法论而言,您可能会花费大量时间来了解实际上通过指针和引用进行的数据处理方法含义,以及在特定情况下何时以及如何使用它们。

关于C ++的好处是,对象堆栈的分配在大多数情况下都非常简单,如果程序满足此方法指定的要求,则应以这种方式分配对象。否则,您将依靠指针来提高速度,效率和快速清理速度。我建议阅读以下内容:http : //www.parashift.com/c++-faq-lite/,因为它可以使您对C ++的工作原理有很多技术了解。

让我给你举个例子:

在C ++中,存在此构造器实现,称为“初始化列表”,与在构造器主体中初始化类成员不同。为什么?因为除非初始化的类型是原始类型,否则编译器实际上将创建多个且不必要的在分配给ctor的主体中时创建所创建对象的副本。这可能会降低性能,具体取决于编译器以及应用程序的扩展需求。

知道代表是什么吗?好吧,在C ++中,它被称为函数指针。这种语言一开始很难掌握,但是如果您想变得很棒……那绝对是必需的。

C#很容易...非常容易。


C#委托和c函数指针完全不同。在C ++中,委托离函数更近,而不是函数指针。
CodesInChaos

-2

相信我,选择一本有关C ++的好书(还有更多内容,只需搜索即可)并开始学习...


1
顺便说一句,在学习一些C(指针,数组,结构)之前会很好
Muhammad Hewedy 2012年

7
在C ++之前学习C会让您回到石头时代。如今,我们很少在C ++中使用数组和指针。语言早在很久以前就从他们那里演​​化而来。
fredoverflow 2012年

7
@穆罕默德:其他所有人都喜欢速度,安全性,易于维护。
DeadMG 2012年

3
@DPD:嗯,包括Bjarne Stroustrup(语言的发明者)在内的许多专业C ++程序员都不同意您的看法。他的最新著作从一开始就讲授使用对象和模板,而在第17章(第500页之类的东西)之前根本没有讨论数组和指针。
fredoverflow 2012年

2
@DeadMG。也许可以,但是您不能还原C-> C ++的演变。如果您讨厌C ++的C部分,请使用Java或C#。就个人而言,我发现在使用C ++之前专注于C中的指针和数组对我的职业生涯有很大帮助。当然,您可以在没有它们的情况下编写整个应用程序,但是如果您想获得多态性的好处,则需要了解指针。没有指针可以实现多少个重要的GoF模式?对于我的朋友来说,在学习C语言时避免了“困难的”部分并不一样。大多数人发现很难理解多态性。
DPD 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.