C ++中构造函数中的数据成员地址

时间:2016-03-25 23:30:00

标签: 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

我的看法是派生类重用了基类中的构造函数。两个&#34; p&#34;在两个类中完全相同,因此,两个&#34; p&#34; s的地址应该相同。但是,我的理解输出不同。

我的问题是为什么地址为&#34; p&#34;不同?提前致谢

1 个答案:

答案 0 :(得分:2)

您正在按值将参数double p传递给基类构造函数。如果您通过引用传递它,p的地址将是相同的。另外,p不是基类的成员,因此p没有理由拥有相同的地址。

地址不同,因此您可以在p内修改Quote::Quote(const std::string &b, double p),而无需担心在构造函数p中更改BulkQuote::Bulk_quote(const std::string& b, double p, std::size_t q, double disc)