【问题标题】:'this' in C++ is a pointer to a reference?C ++中的'this'是指向引用的指针?
【发布时间】:2020-04-04 02:46:37
【问题描述】:

我知道这很愚蠢,而且标题可能不是答案.. 我一直认为this 是指向当前对象的指针,它在来自对象的每个方法调用中提供(这不是静态方法)

但看看我的代码实际返回的内容,例如:

Test& Test::func () 
{ 
   // Some processing 
   return *this; 
} 

this 的取消引用被返回...并且返回类型是对对象的引用...。那么this 是什么?是不是有一些我不太理解的东西?

【问题讨论】:

  • this 在 C++ 中是指向对象实例本身的指针。取消引用它会产生对象。通过引用返回对象形成对对象的引用(别名),这就是返回的内容。
  • 旁注:你不能做一个指向引用的指针。引用只是现有对象的另一个名称,因此没有什么可指出的。取一个引用的地址,你就得到了被引用对象的地址。
  • 后来在 C++ 中添加了引用。否则我们可能会有self 引用,即Test&。但到添加参考资料时,已发货,this 已被数十甚至数百名用户牢牢占据和依赖。

标签: c++ this-pointer


【解决方案1】:

请记住,引用只是对象的不同名称

这意味着返回一个引用与返回一个抽象类型级别的对象是一回事;结果中是一样的:返回一个引用意味着调用者得到一个对当前对象的引用,而返回一个对象给他(一个引用)一个当前对象的副本 - 包括所有后果,例如调用复制构造函数、进行深度复制决策等。

【讨论】:

    【解决方案2】:

    来自cppreference

    关键字this是prvalue表达式,其值为对象的地址,在该对象上调用成员函数。

    然后(也许更容易掌握):

    类 X 的成员函数中 this 的类型是 X*(指向 X 的指针)。如果成员函数是 cv 限定的,则 this 的类型是 cv X*(指向相同 cv 限定的 X 的指针)。由于构造函数和析构函数不能是 cv 限定的,因此它们中的 this 的类型始终为 X*,即使在构造或销毁 const 对象时也是如此。

    所以,this 不是指向引用的指针,而只是一个指针。

    实际上你不能有一个指向引用的指针,因为获取引用的地址会给你被引用对象的地址。

    此外,C++ 中没有特殊的语法来形成引用。相反,必须在初始化时绑定引用,例如:

    int x = 3;
    int& y = x;   // x is int, but y is int&
    assert( &y == &x); // address of y is the address of x
    

    从函数返回引用时类似:

    int& get_x() {
        static int x = 3;
        return x;
    }
    

    【讨论】:

      【解决方案3】:

      简单地说:

      test t1;  //  t1 is a test object.
      
      test& t2 = t1; //  t2 is another name for t1.
      
      test* t3; //  t3 holds an address of a test object.
      
      *t3; //  derefernce t. which gives you, the test object that t3 points to.
      

      this 是指向当前测试对象的指针。
      因此*this是当前的测试对象,并且因为返回值类型是test&,所以当你调用函数时,你会得到你调用函数的同一个对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-13
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多