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

The Data Member Address in the Constructor in C++

本文关键字:地址 数据成员 构造函数 C++      更新时间:2023-10-16

我有以下代码:

#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

我的看法是派生类重用基类中的构造函数。两个"p"在两个类中完全相同,因此,两个"p"的地址应该相同。然而,我对输出的理解有所不同。

我的问题是为什么"p"的地址不同?提前感谢

您正在按值将参数double 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)中更改p