6-20 花鸟虫鱼市场*(PTA)

市场里有鸟和鱼等。在下面的程序里,定义了鸟类 BIRD、鱼类FISH 和市场类 MARKET。请完成这三个类的成员函数的设计。

#include <iostream>
using namespace std;

class BIRD
{
public:
    BIRD(int color);
    ~BIRD();
    void Show() const;
private:
    int color;
};

class FISH
{
public:
    FISH(double weight);
    ~FISH();
    void Show() const;
private:
    double weight;
};

class MARKET
{
public:
    MARKET(int bird, double fish);
    ~MARKET();
    void Show() const;
private:
    BIRD bird;
    FISH fish;
};

/* 你提交的代码将被嵌在这里 */

int main()
{
    int b;
    double f;
    cin >> b >> f;
    MARKET m(b, f);
    m.Show();
    return 0;
}

说明:BIRD 为鸟类,其私有数据成员为鸟的羽毛颜色码。FISH 为鱼类,其私有数据成员为鱼的重量。MARKET 为市场类,其私有数据成员为一只鸟和一条鱼。

输入样例
7 12.5

输出样例
创建鸟(7号色)
创建鱼(12.5克)
创建市场
鸟: 7号色
鱼: 12.5克
销毁市场
销毁鱼(12.5克)
销毁鸟(7号色)

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB




c++中遇到一个考察语法基础的有意思的题目,这里面用到的知识点包括:类外定义属性成员,构造函数和析构函数,this指针的应用,初始化列表的应用,常函数的应用。

类外定义属性成员格式:

返回值类型(ps:如果是构造和析构就没有返回值类型)类名::成员函数名(形参){ }

构造函数的知识点:

构造函数可以分为三种,分别是无参(默认)构造,有参构造,拷贝构造。

具体细分的话是按参数分为:无参和有参(这里的有参就包括上面的有参和拷贝)

按类型分为:普通构造和拷贝构造。

优先级顺序是拷贝 > 有参 > 无参 ,这里所谓的优先级顺序是指,当定义这三种构造函数的任意一种,编译器将不会提供比它优先级还低的构造函数(有一个事实就是,编译器会在类内至少提供默认三种函数,默认构造函数和默认析构函数,这两者的函数体为空,还要默认拷贝构造函数,进行的是浅拷贝)。

举例子来讲就是,我写了拷贝构造函数,那编译器就不会默认提供有参和无参构造函数,如果我提供了有参构造函数,编译器就不会提供无参构造函数。

this指针的应用:

系统的讲,this指针指向 被调用的成员函数 所属的 对象,它隐含在每一个非静态成员函数内(因为静态成员函数是不属于对象的,它存储在代码区),只需要直接使用即可。也就说这个this指针存储的是对象的地址,它的其中一个作用就是解决名称冲突。

初始化列表的应用:

在 C++ 中,​初始化列表(Initialization List)​ 是构造函数中用于直接初始化成员变量的语法。

1.​成员对象没有默认构造函数
如果类的成员变量是另一个类的对象,且该对象的类没有默认构造函数​(即需要参数才能构造),必须通过初始化列表传递参数。

2.​初始化 const 成员或引用成员
const 变量和引用必须在创建时初始化,无法在构造函数体内赋值

3.​性能优化
对于类类型的成员变量,使用初始化列表直接调用其构造函数,避免先调用默认构造函数再赋值的额外开销。

常函数的应用:

常函数无法修改成员属性,当然如果你在声明属性前加关键字mutable可以修改,与之配套的是常对象,常对象只能调用常函数(因为调用其他函数就可以修改成员属性,这不符合常对象的初衷)。

代码

//这是第一个进行的函数
//这一段是整段代码的难点,因为bird和fish只提供了有参构造函数
//所以必须在MARKET的构造函数中使用初始化列表来赋值
//即:如果类的成员变量是另一个类的对象,
//且该对象的类没有默认构造函数​(即需要参数才能构造),
//必须通过初始化列表传递参数
//不可以在MARKET的函数体中初始化,例如下面是一个错误操作
/* //错误写法!
MARKET::MARKET(int bird, double fish) {
    //显示法赋值
    this->bird = BIRD(bird);  // 错误:BIRD 没有默认构造函数
    this->fish = FISH(fish);  // 错误:FISH 没有默认构造函数
}
*/
MARKET::MARKET(int bird, double fish):bird(bird),fish(fish)
{
    cout << "创建市场" << endl;
    
}

void MARKET::Show() const //常函数无法修改属性成员
{
    bird.Show();
    fish.Show();
}



//由于给的是有参构造函数,而MARKET类中的对象成员没有初始化
//这就意味着编译器不会提供无参构造函数,下面是构造函数内容

BIRD::BIRD(int color)
{
    this->color = color;    //this本身指向的是对象,所以this->color
                            //表示这是一个对象的属性成员
    cout << "创建鸟(" << color << "号色)" << endl;
}

FISH::FISH(double weight)
{
    this->weight = weight;
    cout << "创建鱼(" << weight << "克)" << endl;
}


void BIRD::Show() const
{
    cout << "鸟: " << color << "号色" << endl;
}

void FISH::Show() const
{
    cout << "鱼: " << weight << "克" << endl;
}


//析构函数内容
BIRD::~BIRD()
{
    cout << "销毁鸟(" << color << "号色)" << endl;
}

FISH::~FISH()
{
    cout << "销毁鱼(" << weight << "克)" << endl;
}

MARKET::~MARKET()
{
    cout << "销毁市场" << endl;
}

AC如下:

以上内容主要是为了便于自己复习,如有错误,还请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值