到目前为止,据我所知,在定义指针变量时,我们在RAM中为该变量分配空间。
int *p;
将在RAM中定义一个空格。然后我们使用`& variable'为该指针分配一个内存地址。
我正在查看一个示例:*this vs this in C++ 代码是:
#include <iostream>
class Foo
{
public:
Foo()
{
this->value = 0;
}
Foo get_copy()
{
return *this;
}
Foo& get_copy_as_reference()
{
return *this;
}
Foo* get_pointer()
{
return this;
}
void increment()
{
this->value++;
}
void print_value()
{
std::cout << this->value << std::endl;
}
private:
int value;
};
int main()
{
Foo foo;
foo.increment();
foo.print_value();
foo.get_copy().increment();
foo.print_value();
foo.get_copy_as_reference().increment();
foo.print_value();
foo.get_pointer()->increment();
foo.print_value();
return 0;
}
我不明白将*
操作符放在前面Foo* get_copy()
和Foo* get_pointer()
的目的是什么。如果我在退回*
而不是Foo*
时从this
函数中删除了*this
,为什么会出现错误?
编辑:
另外,原因是:
foo.get_copy().increment();
foo.print_value();
产生1而不是2?
答案 0 :(得分:2)
我不明白将
*
操作符放在前面Foo* get_copy()
和Foo* get_pointer()
的目的是什么
Foo* get_pointer()
Foo*
是指向Foo
对象的指针。
this
也是一个隐式绑定到成员函数的调用对象的指针。这就是为什么这些函数的返回类型是Foo*
而不是Foo
。
答案 1 :(得分:1)
this
,总是C ++中的指针,尽管你没有在任何地方明确提到它。因此,在返回this指针时,应使用Foo*
this
实际上是在函数调用期间传递的隐式对象,它是指向调用函数的对象的指针
答案 2 :(得分:1)
*
是该类型的一部分。因此,int
表示类型int
,和
int*
类型指向int
的指针。如果函数返回指针
对于int,它是int* foo()
,如果它返回一个指针
Foo
,Foo* Foo::get_pointer()
。
该定义为已定义的对象保留空间。一个 声明不保留任何空间和事物的定义 不是对象(例如引用或函数)不保留 任何空间,至少不是你能看到的。 (显然,一个 函数确实存在于内存的某个地方,并且在很多情况下,存在 编译器也需要空间来实现a 参考。但它们在C ++范围内是不可见的。)
答案 3 :(得分:0)
您似乎已更改了所引用示例中的代码,以便get_copy()
不再返回副本。
在代码示例中有两种使用*
的方法。一个是类型声明,另一个是解除引用操作符。
首先是类型声明:
int *p
表示将p
声明为“指向int的指针”类型的变量。
Foo *get_pointer()
表示函数get_pointer
将返回类型为“指向Foo对象的指针”的值。
现在解除引用:
*p
表示“p指向的值”。
int a = 42;
int *p; // p is of type "pointer to an int"
p = &a; // set p to the address of a (p now "points to" a)
a = 117; // change the value of a
int x = *p; // set x to the value that p points to (which is a) - x will be 117
this
只是指向对象的指针。 *this
表示“指向的对象”。在您的示例中,this
的类型为Foo*
(指向Foo对象的指针),而*this
的类型为Foo
(Foo对象)。
答案 4 :(得分:-1)
"this" is a pointer
。
您想要返回指向实例的指针(特定的已分配对象)。
Foo* get_pointer(){
return this;
}
或者你想返回一个指向副本的指针,分配一个新对象。
//need to implement the copy here
Foo* get_copy(){
return this;
}
而不是引用(实例的地址)。这就是你需要返回指针的原因。