昨天我的老师告诉我不要使用指针,除非我想编写一些非常低级的东西。他说垃圾收集器会为我做所有事情,所以指针基本上是低效且危险的。我很生气,因为我以前听到过不同之处。
那么什么是对的,什么是错的呢?我应该使用指针吗?如果没有,如果没有人使用它们,为什么还要实施?
将垃圾收集器与 C++ 一起使用需要严格的纪律和非常称职的程序员,即使在 C++11 中增加了对垃圾收集的支持。
所以可能你的老师有别的意思。
就像,他/她可能意味着您应该优先使用标准库容器(例如vector
和string
)和智能指针来处理必须处理指针的所有权。这是个好建议。
您的老师所说的属于“几乎正确”的类别。这可能意味着两件事之一:
我强烈倾向于选项(2)(尽管无知的老师并非闻所未闻):
正如其他人所说,C++ 通常不附带 GC,虽然在 C++ 中完全可以使用 GC,但使用 GC 进行教学更加不传统。
另一方面,你的老师关于避免指针是正确的。C++ 标准化委员会的成员、本网站的用户以及 Internet 上的其他专家一致认为,现代 C++ 在很大程度上没有必要使用原始指针(尤其是手动内存管理)。
传统上,大多数 C++ 项目都充满了指针。但是原始指针和手动内存管理容易出错,可能效率低下(由于引入了间接和缓存未命中),最重要的是,它们在现代 C++ 中是不必要的。
如果你真的想成为一名优秀的 C 或 C++ 程序员,你需要学习和使用指针。事实上,这是一个非常强大的功能,可能有风险,是的,但它们对于完成某种任务是绝对必要的。
如果您是初学者,您的老师是对的,但如果您变得更高级,您总有一天会使用指针,因为它使您的程序非常快。
关键是您可以很容易地使用具有不良后果的指针(例如使您的程序崩溃)犯错。
指针还有其他优点,例如,如果您将原始对象存储在 Vector 中并编辑该向量,则每次都需要遍历该向量以找到要搜索的元素(慢),或者将指向对象的指针存储在该向量并使用指向该对象本身的指针(快速)。
还有不计其数的其他例子,其中指针规则。
为什么要使用托管 C++?这似乎适得其反,至少在我看来。如果我要为 gc 支付开销,我将只使用 C#。
关于指针,它们很棒,永远不应被忽视。但是,引用同样有用,您不必进行空检查。
根据您的编译器查看 std::shared_ptr / std::weak_ptr / std::unique_ptr。
他们介绍了可以在大多数书籍/语言中找到的基本保留计数
您可以在不使用指针的情况下用 C++ 编写程序。通过引用传递对象要安全得多。
许多容器将需要复制对象,因为您不允许将指针放入容器中。当使用大型数据项或项的许多索引时,这可能是一个问题。