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;
}

运行结果:

相关推荐
序属秋秋秋1 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
quant_19863 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言
百锦再7 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
风吹落叶花飘荡7 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript
失败又激情的man8 小时前
python之requests库解析
开发语言·爬虫·python
专注VB编程开发20年8 小时前
常见 HTTP 方法的成功状态码200,204,202,201
开发语言·网络协议·tcp/ip·http
有没有没有重复的名字8 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
十秒耿直拆包选手8 小时前
Qt:主窗体(QMainwindow)初始化注意事项
c++·qt
开开心心_Every9 小时前
便捷的电脑自动关机辅助工具
开发语言·人工智能·pdf·c#·电脑·音视频·sublime text