c++中返回此指针的函数
function returning this pointer in c++
第一个代码:
#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的复制构造函数(在你的情况下,它是编译器生成的),并返回该副本调用者
两个代码都有效。
- 第一个代码
fun()
返回当前对象的引用 - 第二个代码
fun()
返回对象 的副本(按值) - 对于第一种情况,如果您决定按值返回然后选择返回const参考;例如
const demo& fun();
之后如果需要的话,你可以复制它。简单地返回引用使对象可修改,它可以不小心编辑的内容没有意图 - 对于第二种情况,不按值返回对象,因为它可以创造不必要的东西将生效的临时副本代码的内存/性能
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针