c++ / day04

1. 整理思维导图

2. 定义一个Person类,私有成员int age,string &name,定义一个Stu类,包含私有成员double *score,写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数,完成对Person的运算符重载(算术运算符、条件运算符、逻辑运算符、自增自减运算符、插入/提取运算符)

cpp 复制代码
#include <iostream>

using namespace std;

class Person
{
    int *_ptr_age;
    string &_ref_name;
    int happiness;
public:
    //Person constructor,
    Person(int age, string &ref_name):_ptr_age(new int(age)), _ref_name(ref_name)
    {
        cout << "Person constructor with 2 params" << endl;
    }

    //destructor
    ~Person()
    {
       cout << "Person destructor" << endl;
       delete _ptr_age;

    }

    //copy constructor. Note: param need to be initilized for space
    Person(const Person &src):_ptr_age(new int(*(src._ptr_age))), _ref_name(src._ref_name)
    {
        cout << "Person copy constructor" << endl;
    }

    //assign constructor. Note it has been initilized, has space alread, just need copy value
    Person &operator=(const Person &src)
    {
        this->_ptr_age =src._ptr_age;
        this->_ref_name = src._ref_name;
      cout << "Person assign constructor" << endl;
      return *this;
    }

    //arithmetic operator overloading
    Person operator+(Person &other );

    //condition operator overloading
    bool operator>(Person &other);

    //loginal operator overloading
    bool operator&&(Person &other);

    //inc/dec operation overloading;
    Person operator++();

    //cout operation overloading;
    friend ostream &operator<<(ostream &out, Person &person);



    int get_age();
    int get_happiness();
    void set_happiness(int h);
    string get_name();
};

Person Person::operator+(Person &other)
{
    Person person(*this->_ptr_age, this->_ref_name);
    person.happiness = this->happiness + other.happiness;
    return person;
}

bool Person::operator>(Person &other)
{
    if(this->happiness > other.happiness)
    {
        return true;
    }
    else {
        return false;
    }
}

bool Person::operator&&(Person &other)
{
    if(this->happiness && other.happiness)
    {
        return true;
    }else{
        return false;
    }
}

Person Person::operator++()
{
    ++this->happiness;
    return *this;
}

ostream &operator<<(ostream &out, Person &person)
{
    out << "happiness value:" << person.get_happiness() << endl;
    return out;
}

class Stu
{
    double *_ptr_score;
    Person _person;

public:
    //constuctor
    Stu(double score, int age, string name):_ptr_score(new double (score)), _person(age, name)
    {
        cout << "Stu constructor with 2 params" << endl;
    }
    //destructor
    ~Stu()
    {
       cout << "Stu destructor" << endl;
       delete _ptr_score;
    }
    //copy constructor
    Stu(const Stu &src):_ptr_score(new double(*(src._ptr_score))), _person(src._person)
    {
        cout << "Stu copy constructor" << endl;
    }

    //assign constructor
    Stu &operator = (const Stu &src)
    {
        this->_ptr_score = src._ptr_score;
        this->_person = src._person;
        return *this;
    }

    void show();
};

int Person::get_age()
{
    return *_ptr_age;
}

string Person::get_name()
{
    return _ref_name;
}

int Person::get_happiness()
{
    return happiness;
}
void Person::set_happiness(int h)
{
    this->happiness = h;
}

void Stu::show()
{
    cout << "score = "<< *_ptr_score << endl;
    cout << "person age = "<< _person.get_age() << endl;
    cout << "person name = "<< _person.get_name() << endl;

}


int main()
{
    int age_a = 28;
    int age_b = 29;
    string name_z = "zhangsan";
    string name_l ="lisi";

    //double score_a = 99;
    //double score_b =98;

    Person person_zs(age_a, name_z);
    Person person_ls(age_b, name_l);
    person_zs.set_happiness(10);
    person_ls.set_happiness(9);


    ++person_zs ;
    cout << "++person_zs = "<< person_zs.get_happiness() << endl;

    cout << "person_zs + person_ls:"<< (person_zs + person_ls).get_happiness() << endl;

    cout << "person_zs > person_ls:"<< (person_zs > person_ls) << endl;

    person_ls.set_happiness(0);
    cout << "person_zs && person_ls:"<< (person_zs && person_ls) << endl;

    cout << person_zs << "---cout overloadning---"<< endl;


    return 0;
}

运行结果:

相关推荐
DpHard13 分钟前
现代 C++ 中 push 接口为何提供 const T& 与 T&& 两个重载
c++
wheelmouse778839 分钟前
网络排查基础与实战指南:Ping 与 Telnet
开发语言·网络·php
敲代码的嘎仔1 小时前
Java后端开发——真实面试汇总(持续更新)
java·开发语言·程序人生·面试·职场和发展·八股
U-52184F691 小时前
深度解析:从 Qt 的 Q_D 宏说起,C++ 工业级 SDK 是如何保证 ABI 稳定性的
数据库·c++·qt
迈巴赫车主1 小时前
蓝桥杯20560逃离高塔
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
春日见2 小时前
E2E自驾规控30讲:导论
开发语言·驱动开发·git·matlab·计算机外设
wangchunting2 小时前
Jvm-垃圾收集器
java·开发语言·jvm
沐知全栈开发2 小时前
PHP Math: 精通PHP中的数学函数与应用
开发语言
吴声子夜歌2 小时前
JavaScript——call()、apply()和bind()
开发语言·前端·javascript
平凡灵感码头2 小时前
C语言 printf 数据打印格式速查表
c语言·开发语言·算法