**(由于不好区分,以后标题以题目号开头,便于查找。)****重点内容**
本题是重载操作符的题目,不复杂,且重载前置的++,--。后置的区别仅仅是形参列表中需要添加int以示区分。
需要知道加号的重载的几种情形。(看书都有)
void operator++() //前置++
{...;}
void operator++(int) //后置++
{...;}
同样三个文件:three_d.h,threed.cpp,main.cpp
three_d.h:定义类Three_D,三维坐标点,有x,y,z三个坐标属性。
#pragma once
#include <iostream>
//重载+,++,--,其中后两者为前置
class Three_D {
public:
Three_D(int i, int j, int k) {//构造函数
x = i, y = j, z = k;
}
Three_D() {//构造原点
x = 0, y = 0, z = 0;
}
void Get(int& i, int& j, int& k) {//获得点对象的三个坐标值
i = x, j = y, k = z;
}
Three_D& operator++() {//重载前置++
++x, ++y, ++z;
return *this;
}
Three_D& operator--() {//重载前置--
--x, --y, --z;
return *this;
}
Three_D& operator+(Three_D& const p1) {
//重载+,由于会涉及连加情况且未保证不会由于加号
//修改到对象原有属性,故新增一个对象来进行操作。
//未选择时机释放d3空间,也就是没有delete。
//在VC中产生的anachronism used错误一般都是由于在栈区的对象用作引用返回。
//当然这里也可以直接返回对象的复制,性能上面谁更好呢?
Three_D *d3 = new Three_D; //这里常见的错误就是直接在栈区申请对象,应该在堆区new才能保证对象返回不受影响,否则退出本函数时对象已被自动释放。
d3->x = x + p1.x; //命名不规范
d3->y = y + p1.y;
d3->z = z + p1.z;
return *d3;
}
void print()const; //直接打印对象三个坐标值
private:
int x, y, z;
};
three_d.cpp:实现文件,只包含一个print的实现
#include "threed.h"
using std::cout;
using std::endl;
void Three_D::print()const {
cout << "(" << x << "," << y << ","
<< z << ")" << endl;
}
main.cpp:简单验证一下程序应有功能
#include "threed.h"
using std::cout;
using std::endl;
//本题是重载++,--,+操作符
int main(void) {
Three_D d1(1, 2, 3);
Three_D d2;
d1.print();
d2.print();
cout << "d1 + d2" << endl;
(d1 + d2).print();
cout << "d1" << endl;
d1.print();
cout << "d2" << endl;
d2.print();
cout << "++d1" << endl;
++d1;
d1.print();
cout << "++d2" << endl;
++d2;
d2.print();
return 0;
}
以下是main函数中代码产生的输出: