2012-04-11 199 views
4

可能重复:
What are the differences between pointer variable and reference variable in C++?
What are the distinctions between the various symbols (*,&, etc) combined with parameters?混淆引用和指针

我有一点麻烦让我的头周围粘贴下面这个例子的代码。具体来说,功能Buf& operator=(const Buf &);。据我所知,这个函数需要返回类Buf的对象的地址。出现了两个问题:

  1. 是否同样适用于这个声明为Buf* operator=(const Buf*);,因为Buf*Buf类的一个实例的地址?如果不是,为什么不呢?如果是这样,它只是编码模式的首选?哪个更好?

  2. 在相应的函数定义中,返回*this。据我所知,this是一个指针或地址对应的Buf类的对象。因此*this是指针指向的内容,即类Buf的对象。这与返回Buf*有冲突吗?函数应该返回this而不是*this

我想我今天有一天......请有人帮忙!

using namespace std; 

class Buf { public: 
    Buf(char* szBuffer, size_t sizeOfBuffer); 
    Buf& operator=(const Buf &); 
    void Display() { cout << buffer << endl; } 

private: 
    char* buffer; 
    size_t sizeOfBuffer; }; 

Buf::Buf(char* szBuffer, size_t sizeOfBuffer) { 
    sizeOfBuffer++; // account for a NULL terminator 

    buffer = new char[ sizeOfBuffer ]; 
    if (buffer) 
    { 
     strcpy_s(buffer, sizeOfBuffer, szBuffer); 
     sizeOfBuffer = sizeOfBuffer; 
    } } 

Buf& Buf::operator=(const Buf &otherbuf) { 
    if(&otherbuf != this) 
    { 
     if (buffer) 
      delete [] buffer; 

     sizeOfBuffer = strlen(otherbuf.buffer) + 1; 
     buffer = new char[sizeOfBuffer]; 
     strcpy_s(buffer, sizeOfBuffer, otherbuf.buffer); 
    } 
    return *this; } 

int main() { 
    Buf myBuf("my buffer", 10); 
    Buf yourBuf("your buffer", 12); 

    // Display 'my buffer' 
    myBuf.Display(); 

    // assignment opperator 
    myBuf = yourBuf; 

    // Display 'your buffer' 
    myBuf.Display(); } 
+0

这里有您需要的'*''主场迎战&'回答:http://stackoverflow.com/a/9637342/365496 – bames53 2012-04-11 13:27:24

回答

4

此:

Buf& operator=(const Buf &); 

返回引用到Buf对象,而不是Buf对象的地址。所以当方法返回*this时,调用者获取对象的引用。

此: BUF *运算符=(const的BUF *);

返回一个指向Buf的指针,所以相应的函数确实会返回this。这里

注:

Buf& b = <some code returning Buf&>; 

bBuf一个参考,而不是一个地址。在另一方面,

Buf c = ... 
Buf* pBuf = &c; 

在上述代码&cc地址,并且可以被用于初始化pBuf,这是一个指向Buf。所以根据上下文,*&可以有不同的含义。

3

据我了解,这个功能预计要返回的对象类BUF的 的地址。

到BUF对象的引用号被返回,而不是地址。参考不是地址。它是一个别名 - 用来指代那个精确的对象。引用与指针不同。

我建议你谷歌的C++参考和指针,甚至更好,你读a good C++ book这解释了这个概念。

+1

感谢。我没有谷歌它,但我同意,一本好书是真正我需要的。去图书馆! – LPlates 2012-04-11 13:57:44

3

Buf&不是“地址”,它是一个参考。在语法上,您只需返回一个对象,并且调用者可以访问原始对象。在上述情况下,return *this;返回当前对象。

(请注意,它是非法的参考返回自动对象,因为当主叫方试图在稍后访问他们,他们将不再存在。)

1

在幕后,引用被称为指向对象的指针。当您将*this作为参考返回时,实际上将确切的对象(不带任何复制)返回给接收它的参考。引用和指针之间的主要区别在于,您可以操作指针(如更改指向的地址),但引用不能。

例如:

int val = 4; 
int *p = &val; 
int &r = val; 

p++ // Will pointer to the next memory located to val (addr(val) + sizeof(int)) 
(*p)++ // Will NOT increment val anymore as p pointer to another location 
r++ // will increment value of val (you cannot increment the location r is pointing to). This is same as (*p)++. 

两个pr指的是同一个内存位置(中val地址),但唯一的区别是你访问val的价值的方式。 (*p VS r

1

,当你参考概念(SomeType&)和地址回吐操作(&SomeObject)之间的差异acquianted,你可以看看C++ FAQ,那里是一个什么样的参考是怎么一个很好的解释你应该使用它。

+0

谢谢,我会检查出来 – LPlates 2012-04-11 13:58:00