C++ primer plus 第六版中文版 18.2

## C++ primer plus 第六版中文版 18.2 ##

**仅给有需要的人提供一个思路。如果有更好的解决方案请务必告诉我。**

先是头文件:cpmv.h

#ifndef CPMV_H_
#define CPMV_H_
#include<iostream>
#include<string>

class Cpmv
{
public:
    struct Info
    {
        std::string qcode;
        std::string zcode;
    };
private:
    Info * pi;
public:
    Cpmv();
    Cpmv(std::string q, std::string z);
    Cpmv(const Cpmv & cp);
    Cpmv(Cpmv && mv);
    ~Cpmv();
    Cpmv & operator=(const Cpmv & cp);
    Cpmv & operator=(Cpmv && mv);
    Cpmv operator+(const Cpmv & obj) const;
    void Display() const;
};

#endif

头文件的实现【我个人比较喜欢头文件和实现分开写】:cpmv.cpp
P.s:这个实现按照要求写了不少啰嗦的语句

#include<iostream>
#include<string>
#include"Cpmv.h"
Cpmv::Cpmv()
{
    std::cout << "use Cpmv()\n";
    pi = new Info;
    pi->qcode = "null";
    pi->zcode = "null";
}

Cpmv::Cpmv(std::string q, std::string z)
{
    std::cout << "use Cpmv(string q, string z)\n";
    pi = new Info;
    pi->qcode = q;
    pi->zcode = z;
}

Cpmv::Cpmv(const Cpmv & cp)
{
    std::cout << "use Cpmv(Const Cpmv & cp)\n";
    pi = new Info;
    pi->qcode = cp.pi->qcode;
    pi->zcode = cp.pi->zcode;
}

Cpmv::Cpmv(Cpmv && mv)
{
    std::cout << "use Cpmv(Cpmv && mv)\n";
    pi = mv.pi;
    mv.pi = nullptr;
}

Cpmv::~Cpmv()
{
    delete pi;
}

Cpmv & Cpmv::operator=(const Cpmv & cp)
{
    std::cout << "use operator=()\n";
    if (&cp == this)
        return *this;
    pi->qcode = cp.pi->qcode;
    pi->zcode = cp.pi->zcode;
    return *this;
}

Cpmv & Cpmv::operator=(Cpmv && mv)
{
    std::cout << "use operator=(Cpmv && mv)\n";
    if (&mv == this)
        return *this;
    delete pi;
    pi = mv.pi;
    mv.pi = nullptr;
}

Cpmv Cpmv::operator+(const Cpmv & obj) const
{
    std::cout << "use operator+()\n";
    Cpmv temp;
    temp.pi->qcode = obj.pi->qcode + pi->qcode;
    temp.pi->zcode = obj.pi->zcode + pi->zcode;
    return temp;
}

void Cpmv::Display() const
{
    std::cout << "pi->qcode: " << pi->qcode << std::endl;
    std::cout << "pi->zcode: " << pi->zcode << std::endl;
}

这里是测试程序:main.cpp

#include<iostream>
#include"cpmv.h"
#include<string>

int main()
{
    using namespace std;
    string one;
    string two;
    cout << "Enter the first string: ";
    getline(cin, one);
    cout << "Enter the next string: ";
    getline(cin, two);
    cout << endl;

    cout << "Cpmv(): " << endl;
    Cpmv t1;
    t1.Display();
    cout << endl;

    cout << "Cpmv(string q, string z): " << endl;
    Cpmv t2(one, two);
    t2.Display();
    cout << endl;

    cout << "Cpmv(const Cpmv & cp): " << endl;
    Cpmv t3(t2);
    t3.Display();
    cout << endl;

    cout << "Cpmv(Cpmv && mv): " << endl;
    cout << "#temp: " << endl;
    Cpmv temp("one", "two");
    temp.Display();
    cout << "move: " << endl;
    Cpmv t4(move(temp));
    t4.Display();

    cout << "operator=(const Cpmv & cp): " << endl;

    cout << "t1: " << endl;
    t1.Display();
    cout << endl;
    cout << "t2: " << endl;
    t2.Display();
    cout << endl;

    t1 = t2;

    cout << "t1: " << endl;
    t1.Display();
    cout << endl;

    cout << "operator=(Cpmv && mv): " << endl;
    Cpmv t5;
    t5 = move(t1 + t2);
    t5.Display();

    cout << "operator+(const Cpmv & obj) const: " << endl;
    Cpmv t6;
    t6.Display();
    t1.Display();
    Cpmv t7(t6 + t1);
    t7.Display();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值