用C++思考?

19 c c++

我使用的编程语言是Java.我一直在转向C++,这在某种程度上很不稳定."rock-ness" 不是在学习中,而是在"Thinking in C++"中更多.

我见过很多人说你应该首先学习C(我在技术上已经知道了),然后我看到人们说没有跳过C并直接进入C++.这又不是一个"学习"问题; 这是一个"思考"问题; 我知道C++的语法,我知道C++中的OOD等.

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

SDL_Surface* hello = NULL;
Run Code Online (Sandbox Code Playgroud)

我应该用C语言编程来"使用"吗?如果我从来没有使用像Java这样的语言,我该怎么做才能习惯指针?

lav*_*nio 13

确实,指针是一个大问题,C和C++分享这个概念.

但是C++不仅仅是带有对象的C语言.

您可以从Bruce Eckel的Planet PDF下载两本免费书籍,名为Thinking in C++(第一卷和第二卷),它将真正帮助您理解C++.

很多C++也是工具包,无论是标准库(std)还是MFC,还是来自反粒几何库的类或其他类.这也有所作为.

如果您需要C++,请转到C++.首先学习C就像学习西班牙语,这样你就可以学习葡萄牙语,而不仅仅是学习葡萄牙语.

  • 查看[C++ Book List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list).特别是初学者的书籍,"Accelerated C++"和"Programming:Principal&Practice using C++",因为他们教你现代C++.用C++思考仍然很好,但有点过时了. (2认同)

Jas*_*ams 13

如果您理解语法,那么在语言中成为"流利"的唯一方法就是使用它.

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

一旦你"得到"它们,指针就很容易了.使用指针时的一个好主意是使用"p"前缀表示法.对于每个指针(间接级别),在变量名称的前面添加一个"p",以提醒您它是一个指针:

Vehicle vehicle     = an actual vehicle
Vehicle *pVehicle   = a pointer to a Vehicle
Vehicle **ppVehicle = a pointer to a pointer to a Vehicle
Run Code Online (Sandbox Code Playgroud)

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

vehicle.SetName("Ford Focus");       // Directly access an object instance
(*pVechicle).SetName("Ford Focus");  // Dereference once
(**ppVehicle).SetName("Ford Focus")  // Dereference twice
Run Code Online (Sandbox Code Playgroud)

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

(*pVehicle).DoSomething()
pVehicle->DoSomething()
pVehicle[0].DoSomething()
Run Code Online (Sandbox Code Playgroud)

当你对指针使用算术时,它们以车辆单位运行,而不是以字节为单位,即

pVehicle++;   // Move to the next vehicle record, not just the next byte
Run Code Online (Sandbox Code Playgroud)

最后,每个人

pVehicle = new Vehicle
Run Code Online (Sandbox Code Playgroud)

你需要平衡你的代码:

delete pVehicle;
pVehicle = NULL;
Run Code Online (Sandbox Code Playgroud)

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

if (pVehicle != NULL)
    ...use pVehicle
Run Code Online (Sandbox Code Playgroud)

我发现"p"符号非常有价值,因为你永远不会忘记某些东西是指针,p的数量告诉你需要多少个解引用.一旦我采用它,我就停止编写NULL取消引用/访问违规错误.

这就是你需要知道的关于指针的所有内容.现在你只需要使用它们来获得流畅性.

  • 我没有看到任何表达已经由类型系统处理的语义的命名约定.但如果它对你有帮助,那就把自己搞得一团糟 (5认同)
  • 不要总是检查空指针,只检查库边界或在特定情况下空指针是有效概念的位置(例如,指向可能是匿名的用户的指针= null).指针不会在你的函数中神奇地失去它的值. (2认同)
  • PS 5)当你有(m)余烬和(e)通风口和(i)ndexes和(v)olatiles和(c)以标准字符为前缀的新生时,它们都聚集在intellisense列表中的小组中,所以自动完成代码更快更容易. (2认同)

Eva*_*ran 6

我认为学习C不会有助于你在c ++中的"思考".通常,你只需要习惯某些C++概念及其有用的原因.

关键是智能指针(更常见的是RAII)和模板,这些都是巨大的.

还要记住,c ++是一种多范式语言,而不是严格的OOP.通常,最好的解决方案根本不是面向对象的(STL是模板比基于对象更好的设计的一个很好的例子).

  • RAII代表"资源分配是初始化".一般来说,这是使用构造函数来分配资源的概念,更重要的是使用析构函数来释放资源.智能指针是这个成语的具体实现.它可以以多种方式应用于编写异常安全且通常更简单的代码. (6认同)
  • 对于具有Java背景的人来说,指针和间接应该只是自然概念.Java引用**是**C++指针 - 没有算术.既然你不使用算术和智能指针,也不必管理内存,那么`shared_ptr`就像它接近Java引用一样 - 除了性能之外,除了确定性之外,还需要取消引用. (4认同)
  • 我认为在理解智能指针之前,应该彻底理解指针,间接和内存管理*. (2认同)

utn*_*tim 6

我应该用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/mutability:指针,const指针,指向const值的指针和指向const值的const指针(以及何时使用每个指针)之间的区别是什么,以及类似的使用可变指针.

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