关于默认形参的问题

-bootblack- 2016-03-09 12:03:31
class Brass
{
private:
std::string fullName;
long acctNum;
double balance;
public:
Brass(const std::string & s = "Nullbody", long an = -1, double bal = 0.0);
virtual void ViewAcct() const;
virtual ~Brass() {}
};

class BrassPlus : public Brass
{
private:
double maxLoan;
double rate;
double ownsBank;
public:
BrassPlus(const std::string & s = "Nullbody", long an = -1, double bal = 0.0, double ml = 500, double r = 0.11125);
BrassPlus(const Brass & ba, double ml = 500, double r = 0.11125);
virtual void ViewAcct() const;
};

Brass::Brass(const string & s, long an, double bal)
{
fullName = s;
acctNum = an;
balance = bal;
}

void Brass::ViewAcct() const /*关键字virtual只用于类声明的方法原型当中,而在类方法定义中不可使用*/
{
cout << fullName << " " << acctNum << " " << balance << endl;
}

BrassPlus::BrassPlus(const string & s, long an, double bal, double ml, double r) /*方式1*/
{
Brass::Brass(s, an , bal);
maxLoan = ml;
rate = r;
}

//BrassPlus::BrassPlus(const string & s, long an, double bal, double ml, double r) : Brass(s, an , bal) /*方式2*/
//{
// maxLoan = ml;
// rate = r;
//}

Brass是基类,BrassPlus是公有继承类
请问大神:我使用方式1,实参的值根本就没有传递给类成员数据,而使用方式2结果是正确的.
小弟想请问大神:如上的两种方式有区别吗?为什么?
...全文
151 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
D41D8CD98F 2016-03-10
  • 打赏
  • 举报
回复
default argument 是默认实参不是默认形参
iyomumx 2016-03-09
  • 打赏
  • 举报
回复
构造BrassPlus的时候,必然要构造Brass。那么Brass的构造函数如何调用呢?你没有告诉编译器,于是编译器就会寻找默认构造函数Brass(),碰巧Brass可以无参构造,于是编译器选择使用Brass里定义的默认值来调用构造函数。 简单来说,BrassPlus的构造函数参数是不会自动传递给Brass的,需要你自己写明调用方法。
-bootblack- 2016-03-09
  • 打赏
  • 举报
回复
int main()
{
	Brass liu1("liu1", 111111, 1000);
	liu1.ViewAcct();
	BrassPlus liu2("liu2", 222222, 2000);
	liu2.ViewAcct();

	return 0;
}
-bootblack- 2016-03-09
  • 打赏
  • 举报
回复
引用 4 楼 sdghchj 的回复:
构造函数初始列表才是用来初始化的,而构造函数体内是在初始化后再进行处理的。 Brass::Brass(s, an , bal);在函数体内仅仅是调用基类构造函数构造了一个临时匿名对象而已。
大神最后一句真是醍醐灌顶,小弟受教了~~~
sdghchj 2016-03-09
  • 打赏
  • 举报
回复
构造函数初始列表才是用来初始化的,而构造函数体内是在初始化后再进行处理的。 Brass::Brass(s, an , bal);在函数体内仅仅是调用基类构造函数构造了一个临时匿名对象而已。
-bootblack- 2016-03-09
  • 打赏
  • 举报
回复
引用 2 楼 iyomumx 的回复:
构造BrassPlus的时候,必然要构造Brass。那么Brass的构造函数如何调用呢?你没有告诉编译器,于是编译器就会寻找默认构造函数Brass(),碰巧Brass可以无参构造,于是编译器选择使用Brass里定义的默认值来调用构造函数。 简单来说,BrassPlus的构造函数参数是不会自动传递给Brass的,需要你自己写明调用方法。
大神:小弟还是有点不明白 描述: 编译器自动寻找默认基类构造函数是在初始化过程中进行的吗(也就是没有进入继承类构造函数体内)? 那如果这时候已经找到默认基类构造函数,就会创建继承类的基类部分吗(忽略掉继承类构造函数的形参?)? 那我在继承类构造体内重新使用这个默认基类构造函数,它是会覆盖前面的默认构造函数吗?
Brass::Brass(s, an , bal);/*这句话在这里会覆盖前面的默认构造函数吗?还是说有其它作用?*/

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧