第一个代码:
#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中工作?我是新来的,所以如果我的提问方式错误,请原谅我。
答案 0 :(得分:8)
demo & fun()
返回对当前对象的引用。 demo fun()
返回新对象,由复制当前对象。
答案 1 :(得分:5)
除了@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
答案 2 :(得分:4)
两者都有效但不同。在第一种情况下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
}
答案 3 :(得分:1)
在代码1 demo obj
中创建一个新的演示副本。 obj
使用demo的默认构造函数'demo()初始化:a(9){}'。 obj.fun()
会返回对(已存在的)obj
的引用。
在代码2中obj.fun()
使用demo的复制构造函数创建一个新的demo
类型对象(在您的情况下,它是编译器生成的)并将该副本返回给调用者。
答案 4 :(得分:1)
答案 5 :(得分:0)
两个代码都有效。
fun()
正在返回对当前对象的引用fun()
正在返回对象const demo& fun();
以后你可以根据需要复制它。
简单地返回参考使得
对象可修改,可能
无意中编辑内容
意图