4

重複の可能性:
C++ のポインター変数と参照変数の違いは何ですか?
パラメータと組み合わせたさまざまな記号 (*、& など) の違いは何ですか?

以下に貼り付けたこのサンプル コードを理解するのに少し苦労しています。具体的には、関数Buf& operator=( const Buf & );. 私が理解していることから、この関数はクラスのオブジェクトのアドレスBufが返されることを期待しています。2 つの疑問が生じます。

  1. はclass のインスタンスのアドレスでもあるためBuf* operator=( const Buf* );、これを として宣言することも同様に適用できますか? そうでない場合、なぜですか?もしそうなら、それはコーディングスタイルの好みですか?どちらが好ましいですか?Buf*Buf

  2. 対応する関数定義では、*thisが返されます。私が理解していることからthis、クラスのオブジェクトに対応するポインターまたはアドレス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 *);

へのポインタを返すBufので、対応する関数は実際にを返しthisます。

ここに注意してください:

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

bはへの参照Bufであり、アドレスではありません。一方で、

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

&c上記のコードで、のアドレスでcあり、を初期化するために使用できます。pBufこれは、へのポインタBufです。したがって、*&はコンテキストに応じて異なる意味を持つことができます。

于 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)++.

pとの両方rがメモリ内の同じ場所 ( のアドレスval) を参照していますが、唯一の違いは val の値にアクセスする方法です。(*pr)

于 2012-04-11T13:36:11.103 に答える
1

SomeType&参照概念 ( ) とアドレス取得演算子 ( )の違いに慣れたら、C++ FAQ&SomeObjectを調べることができます。参照とは何か、どのように使用する必要があるかについての適切な説明があります。

于 2012-04-11T13:44:08.310 に答える