-3

私は B クラスを持っていて、クラス C のメンバーがいます。B オブジェクトはベクトルに格納されます。完全なコードと出力は次のとおりです。

#ifndef B_H
#define B_H

#include "C.h"

class B
{
public:
    B( int = 0 );           // constructor
    B( const B& );  // copy constructor
    ~B();           // destructor
    const B &operator=( const B & );    // assignment operator
    C c();          // return C object
    void val( int );// set val
    int val() const;// return val
private:
    C _c;           // C object
    int _val;       // a value
};

#include "B.h"
#include <iostream>

using namespace std;

B::B( int val )
{
    _val = val;

    cout << "B constructor called" << endl;
}

B::B( const B &other )
{
    _c = other._c;

    cout << "B copy constructor called" << endl;
}

B::~B()
{
    cout << "B destructor called" << endl;
}

const B &B::operator=( const B &other )
{
    if ( &other != this ) {     // avoid self-assignment

        _c = other._c;
    }

    return *this;
}

C B::c()
{
    return _c;
}

void B::val( int val )
{
    _val = val;
}

int B::val() const
{
    return _val;
}

#ifndef C_H
#define C_H

class C
{
public:
    C();            // constructor
    ~C();           // destructor
    void val( int );// set val
    int val() const;// return val
private:
    int _val;       // a value
};

#endif

#include "C.h"
#include <iostream>

using namespace std;

C::C()
{
    _val = 0;

    cout << "C constructor called" << endl;
}

C::~C()
{
    cout << "C destructor called" << endl;
}

void C::val( int val )
{
    _val = val;
}

int C::val() const
{
    return _val;
}

#include <vector>
#include <iostream>
#include "B.h"

using namespace std;

const int n = 5;

vector<B> v( n );

int main()
{
    for ( int i = 0; i < n; i++ )
        v[i] = B( i );

    for ( int i = 0; i < n; i++ )
        B &b = v[i];


    for ( int i = 0; i < n; i++ ) {

        B &b = v[i];

        b.c().val( 5 );
    }

    for ( int i = 0; i < n; i++ ) {

        B &b = v[i];

        cout << b.c().val() << endl;
    }

    cin.ignore( 1 );

    return 0;
}

output:

C destructor called
C destructor called
C destructor called
C destructor called
C destructor called
0
C destructor called
0
C destructor called
0
C destructor called
0
C destructor called
0
C destructor called

問題: 各サイクルで C オブジェクトが破棄され、bc().val() がデフォルト (ゼロ) 値で返されます。

質問: なぜ?

出力は最後の 2 つに属します。

4

2 に答える 2

2

メンバー関数はby 値をB::c返します。Cつまり、_cオブジェクトによって保持されているBオブジェクトを関数からコピーします。あなたはそのコピーを呼び出しvalており、メンバーには影響しません_c

次の行を検討してください。

b.c().val( 5 );

b.c()b_cオブジェクトの一時コピーを返します。val次に、その一時を呼び出します。次に、文の最後でテンポラリが破棄されます。各反復で破棄されるのは、この一時的なものです。その一時的な出力はC destructor called.

member に影響を与えたい場合は_c、参照によって返す必要があります。

C& B::c()
{
    return _c;
}
于 2013-02-06T14:52:57.927 に答える
0

あなたの問題はここにあります:

C c();          // return C object

Bオブジェクトで。これが何をしているのかを理解するようにしてください。

于 2013-02-06T14:52:31.487 に答える