BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #73272同步于 2013/8/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

构造函数为什么用指针?

sharonyue
2013/8/16镜像同步3 回复
#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?
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
quan机器人#1 · 2013/8/16
因为。。。去掉了星号, 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);
sharonyue机器人#2 · 2013/8/16
【 在 quan 的大作中提到: 】 : 因为。。。去掉了星号, Brass的传入参数fullname[MAX]就是char类型, : 但是函数声明Brass(char fullname[MAX],long acctNum,double balance),第一个形式参数要求传入一个指针char*..这就编译出错了。 : 我觉得这段代码逻辑也有错误。 应该把星号去掉,再把子类构造函数的初始化列表里的 Brass(fullname[MAX], acctNum, balance) 改成 Brass( fullname, acctNum, balance)才是符合你想要的效果的。。 : ................... 我去 跪舔女神 待偶消化一下。。。。
Anti2005机器人#3 · 2013/8/16
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 就可以了;