2015级C++第5周项目 类和对象

简介: 【项目1 - 三角形类雏形】[参考解答] (1)下面设计一个三角形类,请给出各成员函数的定义 class Triangle{public: void setABC(double x, double y, double z);//置三边的值,注意要能成三角形 double perimeter();//计算三角形的周长 double area

【项目1 - 三角形类雏形】

[参考解答]
(1)下面设计一个三角形类,请给出各成员函数的定义

class Triangle
{
public:
    void setABC(double x, double y, double z);//置三边的值,注意要能成三角形
    double perimeter();//计算三角形的周长
    double area();//计算并返回三角形的面积
private:
    double a,b,c; //三边为私有成员数据
};
int main()
{
    Triangle tri1;  //定义三角形类的一个实例(对象)
    tri1.setABC(4,5,6); //为三边置初值
    cout<<"三角形的周长为:"<< tri1.perimeter()<<'\t'<<"面积为:"<< tri1.area()<<endl;
    return 0;
}
//请在下面定义Triangle类中的各个成员函数

(2)在上面程序的基础上,重新定义Triangle类,其中逻辑特别简单的set和get成员函数,要处理为内联成员函数,直接在类内定义。

int main()  
{  
    Triangle tri1;  //定义三角形类的一个实例(对象)  
    double x,y,z;  
    cout<<"请输入三角形的三边:";  
    cin>>x>>y>>z;  
    tri1.setA(x);  
    tri1.setB(y);  
    tri1.setC(z);   //为三边置初值  
    if(tri1.isTriangle())  //isTriangle()返回值为布尔型,用于判断给出的三边是否能构成一个三角形
    {  
        cout<<"三条边为:"<<tri1.getA()<<','<<tri1.getB()<<','<<tri1.getC()<<endl;  
        cout<<"三角形的周长为:"<< tri1.perimeter()<<'\t'<<"面积为:"<< tri1.area()<<endl;  
    }  
    else  
        cout<<"不能构成三角形"<<endl;  
    return 0;  
}  

(3)设计三角形类带参数的构造函数,即Triangle(double x, double y, double z),三边长在调用时由实参直接给出,使对象在定义时能够进行初始化。需要的测试函数是:

int main()
{
    Triangle Tri(7,8,9);    //定义三角形类的一个实例(对象)
    Tri.showMessage(); //定义一个能显示三角形信息的成员函数
    return 0;
}

(4)使用有默认参数的构造函数,不给定实参时,默认边长为1;注意——只需要一个构造函数即可。需要的测试函数是:

int main()
{
    Triangle Tri1;   //定义边长为1 1 1的三角形类实例
    Tri1.showMessage();
    Triangle Tri2(1.5);//定义边长为1.5 1 1的三角形类实例
    Tri2.showMessage();
    Triangle Tri3(1.5,1.5);//定义边长为1.5 1.5 1的三角形类实例
    Tri3.showMessage();
    Triangle Tri4(7,8,9); //定义边长为7 8 9的三角形类实例
    Tri4.showMessage();
    return 0;
}

(5)使用复制构造函数,能用一个已有的三角形对象,复制出新的三角形对象:

int main()
{
    Triangle Tri1(3,4,5);   //定义边长为1 1 1的三角形类实例
    Tri1.showMessage();
    Triangle Tri2(Tri1); //调用复制构造函数
    Tri2.showMessage();
    return 0;
}

【项目2-游戏中的角色类】

[参考解答]
(1)基于下面设计的游戏中角色类,补充完整需要的成员函数,使角色能一定的规则行动或改变状态。下面代码中包含的是最基本的要求,可以根据你的设计进行扩充。

class Role
{
public:
    ……
private:
    string name;
    int blood;
    bool life;
};
int main( )
{
    Role mary;
    mary.setRole("Mary", 4);
    mary.show();
    mary.attack();
    mary.eat(2);
    mary.beAttack();
    mary.beAttack();
    mary.show();
    return 0;
}

(2)设计构造函数,使角色对象在创建时被初始化;设计析构函数,当角色对象被撤消时,提示一句“XXX(名称)退出江湖…”。可以用下面的代码进行测试,运行结果参考右图:

int main( )
{
    Role mary("Mary", 4);
    Role jack("Jack", 0);
    mary.show();
    jack.show();
    return 0;
}

【项目3 - 时间类】

[参考解答]
阅读、运行程序后,按要求扩充类的功能

class Time
{
public:
    void set_time( );   
    void show_time( );  
private: 
    bool is_time(int, int, int);   
    int hour;
    int minute;
    int sec;
};
void Time::set_time( ) 
{
    char c1,c2;
    cout<<"请输入时间(格式hh:mm:ss)";
    while(1)
    {    cin>>hour>>c1>>minute>>c2>>sec;
        if(c1!=':'||c2!=':')
            cout<<"格式不正确重输"<<endl;
        else if (!is_time(hour,minute,sec))
            cout<<"时间非法,请重新输入"<<endl;
        else 
            break;
    }
}
void Time::show_time( )      
{
    cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
bool Time::is_time(int h,int m, int s)
{
    if (h<0 ||h>24 || m<0 ||m>60 || s<0 ||s>60)
        return false;
    return true;
}
int main( )
{
    Time t1;  
    t1.set_time( );   
    T1.show_time( );
    return 0;
}

要求:
(1)请在原类基础上,在类内增加下列成员函数(将是内联成员函数)

  • add_a_sec() //增加1秒钟
  • add_a_minute() //增加1分钟
  • add_an_hour() //增加1小时

在main()数中,调用新增加的成员函数,以测试扩充后的功能。
(2)再增加三个成员函数,要求在类内声明,类外定义。

  • add_seconds(int) //增加n秒钟
  • add_minutes(int) //增加n分钟
  • add_hours(int) //增加n小时

提示:

  • 要考虑增加后超出取值范围的情形;
  • 增加n秒后,秒数可能会超过60,调整秒数,并可以调用增加分钟数的成员函数,使时间合法;同理,增加分钟数也有类似问题。

【项目4 - 长方柱类】

[参考解答]
  编写基于对象的程序,求3个长方柱(Bulk)的体积。数据成员包括长(length)、宽(width)、高(heigth)、体积,要求设计成员函数实现下面的功能:
(1)由键盘输入3个长方柱的长、宽、高;
(2)计算长方柱的体积(volume)和表面积(areas);
(3)输出这3个长方柱的体积和表面积。

目录
相关文章
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
95 0
|
4月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
173 0
|
6月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
186 12
|
7月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
7月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
7月前
|
编译器 C++
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
7月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
132 16
|
8月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
7月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
362 6