市场里有鸟和鱼等。在下面的程序里,定义了鸟类 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如下:
以上内容主要是为了便于自己复习,如有错误,还请指出。