返回信息流#include<iostream>
using namespace std;
class Brass
{
protected:
enum {MAX = 35};
private:
char fullname_[MAX];
long acctNum_;
double balance_;
public:
//Brass();//
Brass(char fullname[MAX],long acctNum,double balance);
//~Brass();//无动态内存管理使用默认析构函数
void Deposit(double number);
void Withdraw(double number);
void Show();
};
Brass::Brass(char fullname[MAX],long acctNum,double balance)
{
strcpy(fullname_,fullname);
acctNum_ = acctNum;
balance_ = balance;
}
void Brass::Deposit(double number)
{
balance_ += number;
}
void Brass::Withdraw(double number)
{
balance_ -= number;
}
void Brass::Show()
{
cout << "Your balance is" << balance_;
}
class BrassPlus: public Brass
{
private:
double maxLoan_;
double rate_;
double ownsBank_;
public:
BrassPlus
(
double maxLoan,
double rate,
double ownsBank,
char* fullname[MAX],
long acctNum,
double balance
);
BrassPlus
(
double maxLoan,
double rate,
double ownsBank,
const Brass& b
);
void Reset();
};
BrassPlus::BrassPlus
(
double maxLoan,
double rate,
double ownsBank,
char* fullname[MAX],//指针?为什么要用指针呢
long acctNum,
double balance
):
Brass(fullname[MAX], acctNum, balance)
{
maxLoan_ = maxLoan;
rate_ = rate;
ownsBank_ = ownsBank;
}
BrassPlus::BrassPlus
(
double maxLoan,
double rate,
double ownsBank,
const Brass& b
):
Brass(b)
{
maxLoan_ = maxLoan;
rate_ = rate;
ownsBank_ = ownsBank;
}
int main()
{
return 0;
}
编译成功,未完成的代码,我有个困惑就是红色的部分,把星号去掉就不行了,why?
这是一条镜像帖。来源:北邮人论坛 / cpp / #73272同步于 2013/8/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
构造函数为什么用指针?
sharonyue
2013/8/16镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
因为。。。去掉了星号, Brass的传入参数fullname[MAX]就是char类型,
但是函数声明Brass(char fullname[MAX],long acctNum,double balance),第一个形式参数要求传入一个指针char*..这就编译出错了。
我觉得这段代码逻辑也有错误。 应该把星号去掉,再把子类构造函数的初始化列表里的 Brass(fullname[MAX], acctNum, balance) 改成 Brass( fullname, acctNum, balance)才是符合你想要的效果的。。
fullname[MAX]作为实际参数,会出问题的,因为按照你的意思,fullname的最后一个元素是fullname[MAX-1]..
BrassPlus::BrassPlus
(
double maxLoan,
double rate,
double ownsBank,
char* fullname[MAX],//指针?为什么要用指针呢
long acctNum,
double balance
):
Brass(fullname[MAX]/*这里传入的是个fullname数组的一个元素,元素类型是char* */, acctNum, balance)
{
maxLoan_ = maxLoan;
rate_ = rate;
ownsBank_ = ownsBank;
}
Brass(char fullname[MAX],long acctNum,double balance);
【 在 quan 的大作中提到: 】
: 因为。。。去掉了星号, Brass的传入参数fullname[MAX]就是char类型,
: 但是函数声明Brass(char fullname[MAX],long acctNum,double balance),第一个形式参数要求传入一个指针char*..这就编译出错了。
: 我觉得这段代码逻辑也有错误。 应该把星号去掉,再把子类构造函数的初始化列表里的 Brass(fullname[MAX], acctNum, balance) 改成 Brass( fullname, acctNum, balance)才是符合你想要的效果的。。
: ...................
我去 跪舔女神 待偶消化一下。。。。
BrassPlus::BrassPlus
(
double maxLoan,
double rate,
double ownsBank,
char* fullname[MAX],//指针?为什么要用指针呢
long acctNum,
double balance
):
Brass(fullname[MAX], acctNum, balance)
{
maxLoan_ = maxLoan;
rate_ = rate;
ownsBank_ = ownsBank;
}
在上面的参数中, char* fullname[MAX] 代表的是一个指针数组,里面的元素是 char*类型,然后下面的fullname[MAX]表示取 fullname数组中的的第MAX个元素,其类型的就是char*,这个和基类定义的fullname[MAX]可以对于,所以编译是没有问题的。但实际上,代码已经出现了严重的错误,因为此时,数组已经越界。char* fullname[MAX]的最大下标是MAX-1,而fullname[MAX]是MAX,超出下标的界限,可能会得到一个结果,但不是期望的那个结果,不知道你明白了没有。2楼的解释也很明了了。你可以把 char* fullname[MAX] 改为char fullname[MAX],然后下边的fullname[MAX] 改为 fullname 就可以了;