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