c++中返回此指针的函数

function returning this pointer in c++

本文关键字:函数 指针 返回 c++      更新时间:2023-10-16

第一个代码:

#include <iostream>
using namespace std;
class demo
{
  int a;
public:
  demo():a(9){}
  demo& fun()//return type isdemo&
  {
    return *this;
  }
};
int main()
{
  demo obj;
  obj.fun();
  return 0;
}
二代码:

#include <iostream>
using namespace std;
class demo
{
  int a;
public:
  demo():a(9){}
  demo fun()//return type is demo
  {
    return *this;
  }
};
int main()
{
  demo obj;
  obj.fun();
  return 0;
}

这两个代码之间的区别是什么,因为它们都在gcc中工作?我是新来的,如果我问的方式不对,请原谅我。

demo & fun()返回对当前对象的引用。demo fun()返回一个对象,通过复制当前对象生成

两者都有效,但有所不同。在第一种情况下,demo& fun()返回对同一对象的引用,在第二种情况下,创建一个新对象。虽然两者是相同的,但语义不同,运行以下示例:

#include <iostream>
struct test {
  int x;
  test() : x() {}
  test& foo() { return *this; }
  test bar() { return *this; }
  void set( int value ) { x = value; }
};
int main() {
  test t;
  t.foo().set( 10 );             // modifies t
  t.bar().set( 5 );              // modifies a copy of t
  std::cout << t.x << std::endl; // prints 10
}

除了@Erik所说的返回类型之外,关于this -指针的一点短途讨论:
以下是等价的:

struct my_struct{
  my_struct* get_this() const { return this; }
};
my_struct obj;
my_struct* obj_this = ob.get_this();
std::cout << std::boolalpha; // to display true/false instead of 1/0
std::cout << "&obj == obj_this = " << &obj == obj_this << "n";

this指针只是指向该对象的指针,您可以将其视为隐藏参数。用C语言更容易理解:

typedef struct my_struct{
  int data;
  // little fidgeting to simulate member functions in c
  typedef void (*my_struct_funcptr)(struct my_struct*,int);
  my_struct_funcptr func;
}my_struct;
// C++ does something similar to pass the this-pointer of the object
void my_struct_func(my_struct* this, int n){
  this->data += n;
}
my_struct obj;
obj.data = 55;
// see comment in struct
obj.func = &my_struct_func;
obj.func(&obj, 15);
//       ^^^^ - the compiler automatically does this for you in C++
std::cout << obj.data; // displays 70

考虑你的函数。

demo fun(){return *this;}

这里你是按值返回的,所以一个临时对象将被创建,一旦你将fun的返回值赋给其他对象,它将被销毁。

而在情况下,当你传递引用,没有对象将被创建新的,但它会传递实际的对象,甚至在赋值函数返回值后,对象将不会销毁,直到主对象(在fun中使用,在你的情况下是调用函数的对象)不会超出作用域。

你试图理解的概念可以用其他例子更详细地解释。考虑一个以对象作为参数并返回对象作为参数的函数。(也考虑我们有一个包含指针的对象,我们将通过首先为指针分配内存和析构函数来为指针赋值,析构函数将释放对象指针所占用的内存)。现在,当你通过值返回对象时,临时对象将被创建,它将具有主对象的精确副本(并且临时对象的指针也将指向相同的地址,或者你可以说保存相同的地址)。现在在main()中,你用函数的返回值(object)赋值/初始化任何对象。但是当你的临时对象在赋值后被销毁时,它也会因为析构函数而释放内存,当你试图通过赋值对象(在main()中)获取相同的地址值时,你会得到错误,因为内存已经被释放了。

但是如果你要使用引用返回值,object返回的对象不会被破坏,因为main对象(在函数内部或通过它调用函数)在作用域中,你的指针不会丢失内存。使被赋值对象可以通过其指针获取地址值,避免出现不希望的结果。

在代码1中,demo obj创建了一个demo的新副本。obj使用demo的默认构造函数'demo():a(9){}'初始化。obj.fun()返回对(已经存在的)obj的引用。

在代码2 obj.fun()创建一个新的demo类型的对象使用demo的复制构造函数(在你的情况下,它是编译器生成的),并返回该副本调用者

两个代码都有效。

  1. 第一个代码fun()返回当前对象的引用
  2. 第二个代码fun()返回对象
  3. 的副本(按值)
  4. 对于第一种情况,如果您决定按值返回然后选择返回const参考;例如const demo& fun();之后如果需要的话,你可以复制它。简单地返回引用使对象可修改,它可以不小心编辑的内容没有意图
  5. 对于第二种情况,不按值返回对象,因为它可以创造不必要的东西将生效的临时副本代码的内存/性能