首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C++思考?

用C++思考?
EN

Stack Overflow用户
提问于 2010-06-28 04:45:14
回答 11查看 7K关注 0票数 19

我使用的编程语言是Java。我一直在向C++过渡,那里有些不稳定。“岩石-”不是在学习,而是沿着“在C++中思考”的思路。

我见过很多人说你应该先学C(技术上我已经知道了),然后我看到人们说不跳过C,直接去C++。再说一次,这不是一个“学习”问题;它是一个“思考中的”问题;我知道C++的语法,我知道C++中的OOD,等等。

例如,SDL中的这段代码我可以像我知道的那样解释它,但我不能真正地“利用”指针:

代码语言:javascript
复制
SDL_Surface* hello = NULL;

我应该用C语言编程才能“习惯”这一点吗?如果我从未使用过来自Java等语言的指针,那么我应该做些什么来适应它们呢?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-06-28 09:37:29

我应该用C语言编程才能“习惯”这一点吗?

不,你不应该这么做。C曾经是C++的一个很好的介绍,当时C++大多被认为是"C但有类“。C++是从这种思维方式进化而来的,所以用C++编写C代码会导致非常糟糕的C++代码。

如果我从未使用过来自Java等语言的指针,那么我应该做些什么来适应它们呢?

了解如何在C++中使用指针意味着几个关键领域(您可能应该一个接一个地学习它们):

  • 指针算法(加和减指针和整数,使用零指针,指针和数组,操作指针);这是C++与C共享的部分。
  • 指向函数的指针(此部分也与C共享)。
  • 指针转换(static_cast,dynamic_cast,.)这一部分是特定于C++的。您还可以定义自己的强制转换类型,并对其进行一些实验(并以boost::lexical_cast为例)。
  • 指向成员对象和成员函数的指针。
  • 用于指针和各种智能指针实现的RAII :循环链接指针、引用计数指针(boost::shared_ptr)、唯一指针(std::auto_ptr)、范围指针。
  • 包装函式类中的函式指针(请参阅std::tr1::function或boost:: function )。
  • 对象引用,以及它们是如何和不像指针的;在哪里使用引用,在哪里使用指针。
  • 指针和迭代器的相似之处。
  • 使用operator*operator->来模拟对象的类似指针的行为(以及何时不滥用此行为)。
  • 指针和constness /可变性:指针、const指针、指向const值的指针和指向const值的const指针(以及何时使用每个指针)之间的区别是什么,以及使用可变指针的类似情况。

当前C++建议中禁止在代码中使用指针的最佳实践,除非它们是由代码自动管理的(例如,通过RAII )。

票数 8
EN

Stack Overflow用户

发布于 2010-06-28 04:51:35

的确,指针是一件大事,而C和C++也有这个概念。

但是C++不仅仅是具有对象的C。

有两本免费的书,你可以从Bruce的星球PDF下载,叫做C++中的思考 (第一卷和第二卷),这将真正帮助你获得C++的感觉。

很多C++也是工具包,无论是标准库(std)还是MFC,还是反粒几何库中的类等等。这也有区别。

如果你需要C++,那就去找C++。首先学习C就像学习西班牙语,这样你就可以学葡萄牙语,而不是仅仅瞄准葡萄牙语。

票数 13
EN

Stack Overflow用户

发布于 2010-06-28 05:08:36

如果你理解语法,那么要想在一种语言中“流利”,唯一的方法就是使用它。

使用C是保持简单和接近“金属”的好方法,但它与C++不一样,所以如果您希望使用C++,最终我会建议您使用C++。(也就是说,如果你想精通意大利语,就不要学拉丁语,尽管拉丁语会给你很多深刻的见解,但这两种语言是不同的野兽,所涉及的思维过程也相应不同)

一旦你“得到”它们,指针就很容易了。当使用指针时,一个非常好的主意是使用"p“前缀符号。对于每个指针(间接的级别),在变量名的前面添加一个"p“,以提醒您它是一个指针:

代码语言:javascript
复制
Vehicle vehicle     = an actual vehicle
Vehicle *pVehicle   = a pointer to a Vehicle
Vehicle **ppVehicle = a pointer to a pointer to a Vehicle

要访问车辆,必须对每个指针取消一次引用,即:

代码语言:javascript
复制
vehicle.SetName("Ford Focus");       // Directly access an object instance
(*pVechicle).SetName("Ford Focus");  // Dereference once
(**ppVehicle).SetName("Ford Focus")  // Dereference twice

取消引用有三种方法(生成相同代码的不同语法):

代码语言:javascript
复制
(*pVehicle).DoSomething()
pVehicle->DoSomething()
pVehicle[0].DoSomething()

当您对指针使用算术时,它们在车辆单元中操作,而不是以字节为单位操作。

代码语言:javascript
复制
pVehicle++;   // Move to the next vehicle record, not just the next byte

最后,对于每一个

代码语言:javascript
复制
pVehicle = new Vehicle

您需要平衡您的代码和:

代码语言:javascript
复制
delete pVehicle;
pVehicle = NULL;

(编辑)哦,而且几乎忘记了最重要的一个:始终在尝试使用指针之前检查指针是否有效!

代码语言:javascript
复制
if (pVehicle != NULL)
    ...use pVehicle

我发现"p“表示法是无价的,因为您永远不会忘记某物是一个指针,而p的数目告诉您需要多少取消引用。一旦我采用了它,我就停止编写空的取消引用/访问冲突错误。

这就是你需要知道的所有关于指针的知识。现在你只需大量使用它们,就能获得流利的效果。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3130104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档