4

可能重复:
C++ 中的指针变量和引用变量有什么区别?
各种符号(*、&等)结合参数有什么区别?

我很难理解下面粘贴的这个示例代码。具体来说,函数Buf& operator=( const Buf & );。据我了解,此函数需要Buf返回类对象的地址。出现两个问题:

  1. 将 this 声明为 是否同样适用Buf* operator=( const Buf* );,因为Buf*它也是类实例的地址Buf?如果不是,为什么不呢?如果是这样,它只是编码风格的偏好吗?哪个更可取?

  2. 在对应的函数定义中,*this返回。据我了解,this是一个指针,或对应于 class 对象的地址Buf*this指针指向的也是如此,即 class 的对象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(); }
4

5 回答 5

4

这:

Buf& operator=( const Buf & );

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

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

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

注意这里:

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

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

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

&c上面代码中是的地址,c可以用来初始化pBuf,这是一个指向 的指针Buf。所以*and&可以根据上下文有不同的含义。

于 2012-04-11T13:28:57.930 回答
3

据我了解,此函数期望返回类 Buf 对象的地址。

不。

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

我建议你在谷歌上搜索 C++ 引用和指针,或者更好的是,你阅读一本很好的 C++ 书籍来解释这个概念。

于 2012-04-11T13:25:53.013 回答
3

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

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

于 2012-04-11T13:26:04.383 回答
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 值的方式。(*pr

于 2012-04-11T13:36:11.103 回答
1

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

于 2012-04-11T13:44:08.310 回答