写一个复数类,实现基本的运算,目的熟悉封装与数据抽象。

  • 类的定义
#include <iostream>
#include <vector>
using namespace std;
class Complex{
friend ostream & operator << (ostream & os, const Complex &); //重载输出标识符
friend Complex operator + (const Complex&, const Complex &);
friend Complex operator - (const Complex&, const Complex &);
friend Complex operator * (const Complex&, const Complex &);
friend Complex operator % (const Complex&, const Complex &);
public:
Complex() = default;
Complex(int a, int b) : first(a), second(b) {}; //构造函数
Complex(const Complex&); //拷贝构造函数;参数必须是const型的
Complex & operator = (const Complex &); //拷贝赋值运算符 Complex & operator += (const Complex &);
Complex & operator -= (const Complex &);
Complex & operator *= (const Complex &);
Complex & operator %= (const Complex &);
~Complex(){}; //析构函数
private:
int first = ;
int second = ;
};
  • 类函数的实现
#include "complex.h"
using namespace std;
ostream & operator << (ostream &os, const Complex &item)
{
if (item.second > )
os << item.first << " + " << item.second << "i";
else if (item.second < )
os << item.first << " - " << -item.second << "i";
else
os << item.first;
return os;
} Complex::Complex(const Complex& rhs)
{
this->first = rhs.first;
this->second = rhs.second;
} Complex &Complex::operator= (const Complex &rhs)
{
this->first = rhs.first;
this->second = rhs.second;
return *this;
}
// 重载运算符 += 和 + :各自实现
Complex & Complex::operator += (const Complex & rhs) //类内的重载运算符,参数只能有一个
{
this->first += rhs.first;
this->second += rhs.second;
return *this;
} Complex operator + (const Complex &lhs, const Complex &rhs)
{
Complex tmp;
tmp.first = lhs.first + rhs.first;
tmp.second = lhs.second + rhs.second;
return tmp;
}
// 重载运算符- 和-= : -= 用 - 来实现
Complex operator - (const Complex &lhs, const Complex &rhs)
{
Complex tmp;
tmp.first = lhs.first - rhs.first;
tmp.second = lhs.second - rhs.second;
return tmp;
} Complex & Complex::operator-= (const Complex &rhs)
{
*this = *this - rhs;
return *this;
}
// 重载运算符 *= 和 * :* 用 *= 来实现
Complex & Complex::operator *= (const Complex &rhs)
{
int tmpFirst = first * rhs.first;
if (second * rhs.second > )
tmpFirst -= second * rhs.second;
else
tmpFirst += second * rhs.second;
second = first * rhs.second + second * rhs.first;
first = tmpFirst;
return *this;
} Complex operator * (const Complex &lhs, const Complex &rhs)
{
Complex tmp = lhs;
tmp *= rhs;
return tmp;
}
  • %和%=没有实现,和前面的应该都一样
  • 在同时定义了算术运算符和相关的复合赋值运算符时,通常情况下用复合赋值来实现算术运算符
  • 对于类外的重载运算符,返回的不是引用,在函数内定义的临时变量在离开时不会被系统收回,如果返回引用则会指向未开辟的区域
  • 对于类内的重载运算符,会默认把第一个参数绑定到this上,所以形参永远少一个,所以对于二目的运算符,只能有一个参数
  • friend只是告诉类友元,并没有声明;最好在头文件中再次单独声明一次来满足可移植性
    • 在visul stdio中可以直接在其他文件中定义,自动会找到
    • 如果在clang编译器中需要在头文件中声明一次,包含进去
    • 注意在友元函数声明时,如果要写在类前面,必须保证类已经声明过

复数类(C++练习一)的更多相关文章

  1. [GeekBand] C++学习笔记(1)——以复数类为例

    本篇笔记以复数类(不含指针的类)为例进行面向对象的学习 ========================================================= 复数类的声明: class ...

  2. C++习题 复数类--重载运算符2+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...

  3. C++习题 复数类--重载运算符+

    Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...

  4. C#复数类的总结

    复数是C#中没有的,不能直接调用的.但是我们可以通过封装,构造自己的复数形式.这里我自己封装了一个Complex类,也不知道写得如何.可能还有一些东西没有考虑. 不过这里包含了复数的基本晕算了了,包括 ...

  5. 15.C++-操作符重载、并实现复数类

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

  6. C++ 实验 使用重载运算符实现一个复数类

    实验目的: 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法 实验要求: 1.定义一个复数类,描述一些必须的成员函数,如:构造函数,析构函数,赋值函数,返回数据成员值的函数等. ...

  7. 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

    因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...

  8. 侯捷《C++面向对象开发》——动手实现自己的复数类

    前言 最近在看侯捷的一套课程<C++面向对象开发>,刚看完第一节introduction之后就被疯狂圈粉.感觉侯捷所提及所重视的部分也正是我一知半解的知识盲区,我之前也写过一些C++面向对 ...

  9. YTU 2443: C++习题 复数类--重载运算符3+

    2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec  内存限制: 128 MB 提交: 1368  解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...

随机推荐

  1. 关于HTML的使用。

    一丶标签问题 对于初学者来说,无疑用得最多的标签就是div和span了,当然就算只用这2个标签也能写出一个好看的页面,但是W3C为什么会给我们这么多标签来选择呢? 从浏览器的渲染来讲,标签的语义话,更 ...

  2. a标签加绝对定位在图片上面,a的链接和块状属性block失效,而且是所有IE版本都失效的

    谷歌和火狐浏览器下测试是正常的,IE下鼠标移过logo是没有超链接的提示的 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...

  3. C语言学习中容易模糊的一些概念

    1.什么叫分配内存 操作系统把某一块内存空间的使用权利分配给该程序 2.释放内存 操作系统把分配给该程序的内存空间的使用权利收回,该程序就不能再使用这块内存空间 注:释放内存空间并不是把这块内存的数据 ...

  4. Java笔记--Java的List、Iterator用法

    1. List的使用 准备知识: List继承自Collection接口.List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行取得/删除/插入操作. 跟Set ...

  5. memcached在Windows下的安装

    memcached简介详情请谷歌.这里介绍如何在windows下安装. 1.下载     下载地址:http://download.csdn.net/detail/u010562988/9456109 ...

  6. BZOJ 1017 魔兽地图DotR(树形DP)

    题意:有两类装备,高级装备A和基础装备B.现在有m的钱.每种B有一个单价和可以购买的数量上限.每个Ai可以由Ci种其他物品合成,给出Ci种其他物品每种需要的数量.每个装备有一个贡献值.求最大的贡献值. ...

  7. java设计模式--结构型模式--代理模式

    代理模式 概述 为其他对象提供一种代理以控制对这个对象的访问. 适用性 1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表. 2.虚代理(VirtualProxy)根据需要创 ...

  8. GBT28181中的RTP

    国标中说h264数据按照RFC3984打包,但是国标的测试工具——SPVMN,却不支持RFC3984的打包方式.无奈之下直接用RFC3550的方式打包,其实就是分包,然后加上RTP头,对于一帧的结束, ...

  9. Dungeon Game 解答

    Question The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a ...

  10. HTTP缓存 1.0 vs 1.1

    在“使用ETag跟踪用户”中有一点被忽略了,因为要用这张小图统计统计uv, 所以要求浏览器必须每次都要发送这个图片的请求.这需要服务器对图片的缓存策略做设置. http/1.0 和 http/1.1 ...