关于引用和指针的困惑

时间:2012-04-11 13:23:31

标签: c++ pointers reference this

  

可能重复:
  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吗?

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

    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(); }
    

5 个答案:

答案 0 :(得分:4)

此:

Buf& operator=( const Buf & );

返回对Buf对象的引用,而不是Buf对象的地址。因此,当方法返回*this时,调用者将获得对该对象的引用。

此:     Buf * operator =(const Buf *);

返回指向Buf的指针,因此相应的函数确实会返回this

请注意:

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

b是对Buf的引用,而不是地址。另一方面,

Buf c = ...
Buf* pBuf = &c;
上面代码中的 &c c的地址,可用于初始化pBuf,这是Buf的指针。因此,*&可能具有不同的含义,具体取决于上下文。

答案 1 :(得分:3)

  

据我所知,这个函数需要一个对象的地址   将返回Buf类。

没有

返回对Buf对象的引用,而不是地址。引用不是地址。它是一个别名 - 用来指代那个精确对象的东西。引用与指针不同。

我建议你谷歌搜索C ++引用和指针,或者甚至更好,你阅读a good C++ book来解释这个概念。

答案 2 :(得分:3)

Buf&不是“地址”,而是一个参考。从语法上讲,您只需返回一个对象,调用者就可以访问原始对象。在上面的例子中,return *this;返回当前对象。

(请注意,通过引用返回自动对象是违法的,因为当调用者稍后尝试访问它们时它们将不再存在。)

答案 3 :(得分: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

答案 4 :(得分:1)

如果您对参考概念(SomeType&)和地址获取运算符(&SomeObject)之间的差异有所了解,您可以查看C++ FAQ,其中有一个很好的解释什么是参考,你应该如何使用它。