C++ 思考C+的好方法是什么+;推荐人?

C++ 思考C+的好方法是什么+;推荐人?,c++,reference,C++,Reference,我主要在嵌入式环境中编写C语言已经多年了,我有一个非常好的指针心智模型——我不必明确地考虑如何使用它们,我对指针算法、指针数组、指针指向指针等都非常熟悉 我写的很少C++,而且真的没有一种好的方法来思考参考文献。过去有人建议我“将它们视为不能为空的指针”,但这表明这远远不是全部情况 所以对于经验丰富的C++程序员来说,你认为参考文献是什么?你认为它们是一种特殊的指针,还是完全属于它们自己?对于C程序员来说,什么是了解这个概念的好方法?我认为它是一个指针容器。关于“初始化后不能为NULL且不能更改

我主要在嵌入式环境中编写C语言已经多年了,我有一个非常好的指针心智模型——我不必明确地考虑如何使用它们,我对指针算法、指针数组、指针指向指针等都非常熟悉

我写的很少C++,而且真的没有一种好的方法来思考参考文献。过去有人建议我“将它们视为不能为空的指针”,但这表明这远远不是全部情况


所以对于经验丰富的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();