我有以下代码:
#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;不同?提前致谢
答案 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)
。