C++ 思考C+的好方法是什么+;推荐人?
我主要在嵌入式环境中编写C语言已经多年了,我有一个非常好的指针心智模型——我不必明确地考虑如何使用它们,我对指针算法、指针数组、指针指向指针等都非常熟悉 我写的很少C++,而且真的没有一种好的方法来思考参考文献。过去有人建议我“将它们视为不能为空的指针”,但这表明这远远不是全部情况C++ 思考C+的好方法是什么+;推荐人?,c++,reference,C++,Reference,我主要在嵌入式环境中编写C语言已经多年了,我有一个非常好的指针心智模型——我不必明确地考虑如何使用它们,我对指针算法、指针数组、指针指向指针等都非常熟悉 我写的很少C++,而且真的没有一种好的方法来思考参考文献。过去有人建议我“将它们视为不能为空的指针”,但这表明这远远不是全部情况 所以对于经验丰富的C++程序员来说,你认为参考文献是什么?你认为它们是一种特殊的指针,还是完全属于它们自己?对于C程序员来说,什么是了解这个概念的好方法?我认为它是一个指针容器。关于“初始化后不能为NULL且不能更改
所以对于经验丰富的C++程序员来说,你认为参考文献是什么?你认为它们是一种特殊的指针,还是完全属于它们自己?对于C程序员来说,什么是了解这个概念的好方法?我认为它是一个指针容器。关于“初始化后不能为NULL且不能更改的指针”如何。而且,它们本身没有大小(因为它们没有自己的身份)。我习惯于将引用视为主对象的别名 编辑(由于评论中的请求):
我过去认为引用是一种别名,因为它的行为方式与原始变量完全相同,不需要为了影响引用的变量而进行额外的操作。我认为引用就是它引用的对象。您可以使用访问对象。赛门铁克(与->相反)为我强化了这个想法。我认为你的指针心智模型,然后列出你遇到的所有边缘案例,是最好的方法 那些得不到指示的人的境况会更糟 顺便说一句,它们可以是NULL或任何其他不可访问的内存位置(只需付出努力):
我不太喜欢“永远有效”的观点,因为引用可能会变得无效,例如
int* p = new int(100);
int& ref = *p;
delete p; // oops - ref now references garbage
因此,我认为引用是不可重新绑定的(也就是说,一旦它被初始化,就不能更改引用的目标)带有语法糖的指针,以帮助我摆脱“->”指针语法。一般来说,你不需要考虑引用。在每个函数中都使用引用,除非您特别需要通过值或指针进行调用
引用本质上是始终指向同一事物的指针。引用不需要取消引用,而是可以作为普通变量访问。这差不多就是全部了。当您需要执行指针算术或更改指针指向的内容时,您可以使用指针,以及其他所有内容的引用。一种考虑它们的方法是从可能不同的范围为对象导入另一个名称 例如:
Obj o;Obj&r=o代码>
o和r的语义几乎没有区别
主要的一点似乎是编译器观察o的作用域以调用析构函数。对于我来说,当我在代码中看到指针(作为函数中的局部变量或类中的成员)时,我必须考虑
指针是空的还是有效的
它指向的对象是谁创建的(是我吗?我完成了吗?)
谁负责删除
反对
它总是指向同一个方向吗
反对
我不必考虑这些东西,如果它是一个引用,那是其他人的问题(即,将引用视为指针的引用)
是的,这可能仍然是我的问题,只是现在不行从语法角度来看,引用是现有对象的别名。从语义角度来看,引用的行为类似于一个指针,删除了一些问题(无效、所有权等),并添加了类似对象的语法。从实际角度来看,除非你需要说“无对象”,否则你更喜欢引用。(资源所有权不是首选指针的理由,因为这应该使用智能指针来实现。)
更新:我忘记了引用和指针之间的另一个区别:绑定到常量引用的临时对象(右值)的生存期将延长到引用的生存期:
const std::string& result = function_returning_a_string();
这里,函数返回的临时值绑定到result
,并且不会在表达式末尾停止存在,而是会一直存在,直到result
消失。这很好,因为在没有右值引用和基于它们的重载的情况下(如在C++11中),这允许您在上面的示例中删除一个不必要的副本
这是一条专门为常量引用引入的规则,而使用指针无法实现这一点 引用是具有不同语法的指针常量。即参考文献
T&
差不多
常数
与中一样,指针不能更改。两者的内容是相同的-一个T的内存地址-并且两者都不能更改
除此之外,唯一的区别是语法:。对于引用->和*对于指针
确实如此-引用是指针,只是语法不同(它们是常量)。如果使用linux,可以将引用视为硬链接,将指针视为符号链接(符号链接)。
硬链接只是文件的另一个名称。删除指向此文件的所有硬链接后,该文件将被“删除”
参考资料也一样。只需将“硬链接”替换为“引用”,将“文件”替换为“值”(或者可能是“内存位置”)
当所有引用都超出范围时,变量将被销毁
无法创建指向不存在文件的硬链接。类似地,不可能创建对空的引用
但是,您可以创建指向不存在文件的符号链接。很像一个未初始化的指针。实际上,未初始化的指针确实指向一些随机位置(如果我错了,请纠正我)。但我的意思是,你不应该使用它们:)比这更简单:char&bad=*(char*)NULL代码>仍然是
const std::string& result = function_returning_a_string();