标题:这个题目是不是有问题?
只看楼主
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
结帖率:90.38%
已结贴  问题点数:9 回复次数:4 
这个题目是不是有问题?
题目如下:

下面是一个非常简单的类定义:
程序代码:
class Person{
private:
    static const LIMIT=25;
    string lname;
    char fname[LIMIT];
public:
    Person(){
        lname="";
        fname[0]='\0';
    }
    Person(const string &ln,const char *fn="Heyyou");
    void show()const;
    void FormalShow()const;
};

它使用了一个string对象和一个字符数组,让您能够比较它们的用法,请提供未定义的方法的代码,以完成这个类的实现,再编写一个使用这个类的程序,它使用了三钟可能的构造函数的调用(没有参数,一个参数和两个参数)以及两种显示方法。下面是一个使用这些构造函数和方法的例子:
程序代码:
    Person one;
    person two("iryth");
    Person three("iryth","asd");
    one.show();
    cout<<endl;
    one.FormalShow();







以上就是题目的描述,但我有以下几个问题:
问题1:这行语句是不是少了个int
static const LIMIT=25;

应修改为这样:
static const int LIMIT=25;


问题2:这行默认构造函数的声明中是不是应该删除函数体?
    Person(){
        lname="";
        fname[0]='\0';
    }

改为这样声明:
    Person();

然后在默认构造函数的实现中再来添加该函数体。

问题3:下面这行语句,
Person(const string &ln,const char *fn="Heyyou");

在默认构造函数的声明中,可以直接对参数进行初始化吗?
是不是应该修改为下面这样?
Person(const string &ln,const char *fn);


问题4:题目要求提供三种可能的构造函数调用,是不是要分别添加三个方法的实现?即:
分别为默认构造函数的实现,带一个参数的构造函数的实现,带二个参数的构造函数的实现。
但是一个Person类中可以同时包含两个构造函数的实现吗?

请就以上4个问题分别解答。





代码如下,错误一大堆:
程序代码:
#include<iostream>
#include<string>
using namespace std;
class Person{
private:
    static const int LIMIT=25;
    string lname;
    const char fname[LIMIT];
public:
    Person();
    Person(const string &ln,const char *fn);
    void show()const;
    void FormalShow()const;
};

Person::Person(){
        lname="";
        fname[0]='\0';
    }
Person::Person(const string &ln,const char *fn){
    lname=ln;
    fname=fn;
}
Person::Person(const string &ln){
    lname=ln;
}
Person::show()const{
    cout<<"包含2个参数:"<<endl<<lname<<endl<<fname<<endl;
}
Person::FormalShow() const{
    cout<<"包含1个参数:"<<endl<<lname<<endl;
}

int main(){
    Person one;
    person two("iryth");
    Person three("iryth","asd");
    one.show();
    one.FormalShow();
    return 0;
}





[此贴子已经被作者于2021-1-18 18:36编辑过]

搜索更多相关主题的帖子: 参数 Person 构造函数 const string 
2021-01-18 18:35
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:9 
估计是这个意思
程序代码:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

class Person{
private:
    static const size_t LIMIT=25;
    string lname;
    char fname[LIMIT];
public:
    Person(){
        lname="";
        fname[0]='\0';
    }
    Person(const string &ln,const char *fn="Heyyou");
    void show()const;
    void FormalShow()const;
};

Person::Person(const string &ln,const char *fn)
{
    lname=ln;
    strncpy(fname,fn,LIMIT-1);
    fname[LIMIT-1]='\0';
}

void Person::show() const
{
    std::cout << "题目没交代Show要干什么: " << lname << ", " << fname;
}

void Person::FormalShow() const
{
    std::cout << "题目没交代FormalShow要干什么: " << lname << ", " << fname;
}

int main( void )
{
    Person one;
    Person two("iryth");
    Person three("iryth","asd");

    one.show();
    cout<<endl;
    one.FormalShow();
    cout<<endl;

    two.show();
    cout<<endl;
    two.FormalShow();
    cout<<endl;

    three.show();
    cout<<endl;
    three.FormalShow();
    cout<<endl;
}


但这代码是挺恶心的,工作中应该按标准写,即
#include <iostream>
#include <string>
#include <cstring>

class Person
{
public:
    Person() : lname_(), fname_("")
    {
    }
    explicit Person( const std::string& lname, const char* fname="Heyyou" ) : lname_(lname)
    {
        strncpy( fname_,fname, std::size(fname_)-1 );
        fname_[std::size(fname_)-1] = '\0';
    }
private:
    std::string lname_;
    char fname_[25];
   
    friend std::ostream& operator<<( std::ostream& os, const Person& ps )
    {
        return os << ps.lname_ << ", " << ps.fname_;
    }
};

using namespace std;

int main( void )
{
    Person one;
    cout << one << endl;

    Person two("iryth");
    cout << two << endl;

    Person three("iryth", "asd");
    cout << three << endl;
}
2021-01-18 22:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
再看看别人的原题,交代得比较清楚
下面是一个非常简单的类定义
class Person
{
private:
    static const int LIMIT = 25;
    string lname;                     // Person’s last name
    char fname[LIMIT];            // Person’s first name
public:
    Person() {lname = ""; fname[0] = '\0';}                    // #1
    Person(const string & ln, const char * fn = "Heyyou");      // #2
    // the following methods display lname and fname
    void Show() const;        // firstname lastname format
    void FormalShow() const;  // lastname, firstname format
};
它使用了一个string对象和一个字符数组,让您能够比较它们的用法。请提供未定义的方法的代码,以完成这个类的实现。
再编写一个使用这个类的程序,它使用了三种可能的构造函数的调用(没有参数、一个参数和两个参数)以及两种显示方法。
下面是一个使用这些构造函数和方法的例子:
    Person one;                        // use default constructor
    Person two("Smythecraft");         // use #2 with one default argument
    Person three("Dimwiddy", "Sam");   // use #2, no defaults one.Show();
    cout << endl;
    one.FormalShow();
    // etc. for two and three
2021-01-18 22:52
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
得分:0 
[quote]以下是引用rjsp在2021-1-18 22:49:28的发言:

估计是这个意思
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

class Person{
private:
    static const size_t LIMIT=25;
    string lname;
    char fname[LIMIT];
public:
    Person(){
        lname="";
        fname[0]='\0';
    }
    Person(const string &ln,const char *fn="Heyyou");
    void show()const;
    void FormalShow()const;
};

Person::Person(const string &ln,const char *fn)
{
    lname=ln;
    strncpy(fname,fn,LIMIT-1);
    fname[LIMIT-1]='\0';
}

void Person::show() const
{
    std::cout << "题目没交代Show要干什么: " << lname << ", " << fname;
}

void Person::FormalShow() const
{
    std::cout << "题目没交代FormalShow要干什么: " << lname << ", " << fname;
}

int main( void )
{
    Person one;
    Person two("iryth");
    Person three("iryth","asd");

    one.show();
    cout<<endl;
    one.FormalShow();
    cout<<endl;

    two.show();
    cout<<endl;
    two.FormalShow();
    cout<<endl;

    three.show();
    cout<<endl;
    three.FormalShow();
    cout<<endl;
}
[quote]
如果将这行:
Person(const string &ln,const char *fn="Heyyou");

改为如下:
Person(const string &ln,const char *fn);

为什么出现这个错误?
[Error] no matching function for call to 'Person::Person(const char [6])'



另外如果将这行
char fname[LIMIT];

改为如下:
const char fname[LIMIT];

为什么出现这个错误?
[Error] uninitialized const member in 'const char [25]' [-fpermissive]

[此贴子已经被作者于2021-1-20 00:11编辑过]

2021-01-20 00:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
如果将这行:
Person(const string &ln,const char *fn="Heyyou");
改为如下:
Person(const string &ln,const char *fn);
为什么出现这个错误?
[Error] no matching function for call to 'Person::Person(const char [6])'
因为 Person two("iryth") 只提供了一个参数,而 Person(const string &ln,const char *fn) 明显需要两个参数。
但如果是 Person(const string &ln,const char *fn="Heyyou"); 则在不给第二个参数时,第二个参数缺省为 "Heyyou"。


如果将这行
char fname[LIMIT];
改为如下:
const char fname[LIMIT];
为什么出现这个错误?
[Error] uninitialized const member in 'const char [25]' [-fpermissive]
既然fname变成了常量,那它就必须被初始化,比如
Person() : fname("abc")
{
}
同时,那它不允许被赋值,比如 fname[0]='\0' 就是不合法的。
2021-01-21 08:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-504659-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019192 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved