我使用的编程语言是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就像学习西班牙语,这样你就可以学习葡萄牙语,而不仅仅是学习葡萄牙语.
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取消引用/访问违规错误.
这就是你需要知道的关于指针的所有内容.现在你只需要使用它们来获得流畅性.
我认为学习C不会有助于你在c ++中的"思考".通常,你只需要习惯某些C++概念及其有用的原因.
关键是智能指针(更常见的是RAII)和模板,这些都是巨大的.
还要记住,c ++是一种多范式语言,而不是严格的OOP.通常,最好的解决方案根本不是面向对象的(STL是模板比基于对象更好的设计的一个很好的例子).
我应该用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).
| 归档时间: |
|
| 查看次数: |
6225 次 |
| 最近记录: |