2013-04-16 115 views
1

到目前为止,据我了解,当定义一个指针变量时,我们正在RAM中为该变量分配空间。关于当前对象的C++指针和地址说明

int *p; 

会在RAM中定义一个空间。然后我们使用'&变量'为该指针分配一个内存地址。

我找了一个例子上:*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?

+1

'get_copy'的返回类型是错误的。它应该按值返回,而不是指针 - 'Foo get_copy()' –

+0

Foo get_copy会产生一个错误,除非'this'更改为'* this'。 – eveo

+0

'* this'正是它应该是。看看原始来源。你错了。 –

回答

2

我不明白是什么把*运营商面前Foo* get_copy()的目的和Foo* get_pointer()确实

Foo* get_pointer() 

Foo*指针指向Foo对象。

this也是一个隐式绑定到成员函数调用对象的指针。这就是为什么这些函数的返回类型是Foo*而不是Foo

1

this,始终是C++中的一个指针,尽管你没有明确指出它在任何地方。因此,在返回this指针,应使用Foo*

this实际上是函数调用时传递了一个隐含的对象,这是一个指针,该调用函数

+0

我以为只有变量带*之前它是一个指针? – eveo

+0

@eveo'this'不是一个变量。它是一个表达式,并且是一个右值,所以它没有地址(并且不能被修改)。表达式this的_type_是一个指针类型。 –

0

"this" is a pointer的对象。
你想返回一个指向实例的指针(一个特定的分配对象)。

Foo* get_pointer(){ 
      return this; 
     } 

或者你想返回一个指向副本的指针,分配一个新的对象。

//need to implement the copy here 
     Foo* get_copy(){ 
      return this; 
     } 

而不是引用(实例的地址)。这就是为什么你需要返回指针。

+0

您没有返回指向正在返回指向当前对象的指针的副本的指针。没有复制。它应该是'Foo get_copy(){return * this; }'如果你想在动态存储中返回一个副本或者实例化一个副本并返回一个指向它的指针。 –

+0

@CaptainObvious你是对的,我的意思是说你需要实现这个副本。 – Gilad

1

*是该类型的一部分。所以int意味着类型指针intint*类型指针指向int。如果函数返回指针 int,则它是int* foo(),并且如果它返回指向 Foo的指针,则它是Foo* Foo::get_pointer()

该定义为定义的对象保留空间。 A 声明不保留任何空间,并且不是对象(例如,引用或函数)的事物 的定义也不保留任何空间,至少不是您可以看到的。 (显然, 功能不某处存在于内存中,并且在许多情况下, 编译器将需要空间,以及其实施的 参考,但他们是C的范围内看不见++)

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对象)。