【问题标题】:Confusion about references and pointers [duplicate]关于引用和指针的困惑[重复]
【发布时间】:2012-04-11 13:23:31
【问题描述】:

可能重复:
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(); }

【问题讨论】:

标签: c++ pointers reference this


【解决方案1】:

这个:

Buf& operator=( const Buf & );

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

这个: Buf* 运算符=( const Buf * );

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

注意这里:

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

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

Buf c = ...
Buf* pBuf = &c;
上面代码中的

&amp;c是c的地址,可以用来初始化pBuf,它是一个指向Buf的指针。所以* 和&amp; 可以根据上下文有不同的含义。

【讨论】:

    【解决方案2】:

    据我了解,这个函数需要一个对象的地址 类 Buf 的返回值。

    没有。

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

    我建议您在 Google 上搜索 C++ 引用和指针,或者更好的是,您阅读 a good C++ book,它解释了这个概念。

    【讨论】:

    • 谢谢。我用谷歌搜索过,但我同意一本好书确实是我需要的。去图书馆!
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在幕后,引用被称为指向对象的指针。当您返回 *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)++.
      

      p 和r 都指向内存中的同一位置(val 的地址),但唯一的区别是访问 val 值的方式。 (*p 与 r)

      【讨论】:

        【解决方案5】:

        当您熟悉引用概念 (SomeType&amp;) 和地址获取运算符 (&amp;SomeObject) 之间的区别时,您可以查看 C++ FAQ,其中对引用是什么以及如何使用有很好的解释你应该使用它。

        【讨论】:

          猜你喜欢
          • 2012-11-04
          • 2021-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-24
          • 1970-01-01
          • 2016-04-29
          • 1970-01-01
          相关资源
          最近更新 更多