学习C++;谨小慎微 如何学习C++?我听说语言提供了足够的绳子来射我的脑袋,所以我应该把我写的每一条C++线当作潜在的地雷吗?< /P> < P>这不是雷区。p>

学习C++;谨小慎微 如何学习C++?我听说语言提供了足够的绳子来射我的脑袋,所以我应该把我写的每一条C++线当作潜在的地雷吗?< /P> < P>这不是雷区。p>,c++,C++,实际上,大多数问题都与指针相关,因此您必须理解它们(一开始并不容易),并且在使用它们时要小心 我认为这更多的是一个经验的问题,从一开始就把所有的基础都弄清楚,并试图得到一个清晰的设计 我认为这不仅仅是一个雷区,它更像是去了你们镇上最危险的街区。是的,这很危险,但只适用于那些没有这种态度的人-我喜欢你的比喻!Stroustrup实际上说的是: C让你很容易开枪自杀 脚;C++使它变得更难,但是 当你这么做的时候,它会把你的整条腿都炸了 走开 这是许多年前的事了。我开始学习C++在CA 1991,

实际上,大多数问题都与指针相关,因此您必须理解它们(一开始并不容易),并且在使用它们时要小心

我认为这更多的是一个经验的问题,从一开始就把所有的基础都弄清楚,并试图得到一个清晰的设计


我认为这不仅仅是一个雷区,它更像是去了你们镇上最危险的街区。是的,这很危险,但只适用于那些没有这种态度的人-我喜欢你的比喻!Stroustrup实际上说的是:

C让你很容易开枪自杀 脚;C++使它变得更难,但是 当你这么做的时候,它会把你的整条腿都炸了 走开

这是许多年前的事了。我开始学习C++在CA 1991,它真的是雷区。没有公共库,没有调试器,AT&T方法使用C代码生成器。现在有许多支持C++的优秀IDE。 我个人搬到java是因为我觉得它是一种更干净的语言,但是C++是很好的,只要你不想做棘手的事情。避免使用现有类库的原生C构造(Stroustrup最初没有提供String类,因为他认为必须编写一个String类是一个有用的“通过仪式”),现在可以使用一个经过验证的类

我想你在语言方面别无选择。你怎么做取决于你来自哪里。C++不是最容易启动的面向对象语言,Stroustrup的书不一定是最好的入门。

更新OP担心在学习语言时会自暴自弃。一般来说,从一个人以后要做的事情的子集开始是个好主意。我认为OP担心的是:

  • 你必须知道并使用你编程的任何级别的东西(比如析构函数)
  • 给学习过程增加额外复杂性并可以搁置到以后的事情(例如多重继承)
下面是我引爆自己的地方。。。他们不是主观的,他们发生了

有一些在Java或C#中不存在的预先陷阱

  • 析构函数。你必须管理自己的记忆。如果不写析构函数,你的手指和脚趾会被炸掉
  • 平等。您必须编写一个equals方法(在简单的Java中,您可能不需要它)
  • 复制构造函数。同上
    a=b
    将调用此命令。咬你的屁股
我建议避免多重继承,除非你真的需要。那无论如何都要避免

并避免运算符重载。这样写看起来很可爱:

vector1 = vector2 + vector3;
但是


很清楚,只有几个字符,你可以搜索它。

我会说C++是一个挑战性的环境,如果不是雷区。根本问题是,问题症状和问题原因并不总是容易联系起来。正如赫尔本所说,一个主要原因是我们需要处理指针,因此,当指针没有指向我们认为的地方时,我们会造成很大的损害


因此,在处理数组和指针时,您需要特别注意,一个接一个的错误可能会导致内存损坏,然后导致有趣的问题表现。

您可能会发现这篇与Bjarne Stroustrup的恶搞访谈很有启发性:


每一种正式语言都是一个雷区。管理环境中的地雷更少。例如,在C#中,如果您对数组进行过流,则不会导致其他人的远程函数执行奇怪的操作。您不会因为有人忘记在构造函数中初始化变量而让代码在测试和产品中以不同的方式运行

然而,这些都是简单的。你学会了避开它们,然后你就和真正的地雷呆在一起,每种语言都有地雷

更具体地说,这些是迁移到C++时最重要的几点:

  • 始终初始化变量。即使从理论上讲,让程序逻辑依赖于事先在内存中的内容的可能性也是一场噩梦
  • 依赖关系:避免使用没有pimpl习惯用法的其他复合类型(类)的数据成员。这将使您的用户暴露于您使用的类型的内部工作,并显著增加编译时间。依赖是你的敌人
  • 在C++中,可以用大量的方法来优化性能。不要。除非你在一个沉重的数学软件的最里面的循环中,即使那样也不要
  • 避免在windows上使用DLL。它们不能处理单例,这给流行的库带来了问题
  • 尽可能使用boost、共享指针。避免重复使用轮子和常规指针
  • 使用std::string、智能容器而不是数组。这些都是危险的。无论如何,它将比托管容器更快
  • 使用RAII。这是无价的
  • 更喜欢数据成员而不是继承,否则将向类型的用户公开基类型定义
  • 学习避免使用前向声明嵌套包含
如何学习C++?< /P> 参考:

我听说这种语言已经足够了 用绳子把我的头给戳破,所以 我应该处理我写的每一条C++行吗? 作为一个潜在的雷区

C++语句可以做你想做的事情,也可以做其他事情。这取决于你对C++语句所指的含义的理解。但这并不是这种语言所特有的

通过学习该语言,并使用构建正确软件的技术(如面向对象设计,特别是契约式设计,以及测试技术),您将能够保证
vector1 = vector2.plus(vector3);