2016-03-25 5 views
0

私は、次のコードを持っている:私は、コードを実行すると、以下の出力を得るCコンストラクタ++でのデータメンバーのアドレス

#include <iostream> 
#include <string> 

class Quote 
{ 
public: 
    Quote() = default; 
    Quote(const std::string &b, double p) : 
    bookNo(b), price(p) {std::cout<<"The address of p is :"<<&p<<'\n';} 
    std::string isbn() const {} 
    virtual double net_price(std::size_t n) const {return n * price;} 
    virtual ~Quote() = default; 

private: 
    std::string bookNo; 
protected: 
    double price = 0.0; 
}; 

class Bulk_quote : public Quote 
{ 
public: 
    Bulk_quote() = default; 
    Bulk_quote(const std::string& b, double p, std::size_t q, double disc) : 
    Quote(b, p), min_qty(q), discount(disc) { std::cout<<"The address of p is: " <<&p<<'\n';} 
    double net_price(std::size_t n) const override; 
private: 
    std::size_t min_qty  = 0; 
    double  discount = 0.0; 
}; 

int main() 
{ 
    Bulk_quote bq("textbook", 11.0, 5, 0.5); 
} 

The address of p is :0x7fff5fbff5e8 
The address of p is: 0x7fff5fbff668 
Program ended with exit code: 0 

私の認識であるという派生クラスの再利用を基本クラスのコンストラクタ2つの "p"は2つのクラスでまったく同じなので、2つの "p"のアドレスは同一でなければなりません。しかし、私の理解では出力が異なります。

「p」のアドレスが異なるのはなぜですか?事前に感謝します

+0

質問には関係のないコードをいくつか省略します。 – William

+1

pはメンバーではなくパラメータです。 – kfsone

+0

あなたは '&price'と書くのですか? –

答えて

2

引数double pを値によって基本クラスのコンストラクタに渡しています。参照渡しすると、pのアドレスは同じになります。さらにpは基本クラスのメンバーではないため、pのアドレスが同じである必要はありません。

Quote::Quote(const std::string &b, double p)に変更することができますので、BulkQuote::Bulk_quote(const std::string& b, double p, std::size_t q, double disc)コンストラクタのpを変更することを心配する必要はありません。

関連する問題