复数类(C++练习一)
写一个复数类,实现基本的运算,目的熟悉封装与数据抽象。
- 类的定义
#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++练习一)的更多相关文章
- [GeekBand] C++学习笔记(1)——以复数类为例
本篇笔记以复数类(不含指针的类)为例进行面向对象的学习 ========================================================= 复数类的声明: class ...
- C++习题 复数类--重载运算符2+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意.例如,c1+ ...
- C++习题 复数类--重载运算符+
Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算.将运算符函数重载为非成员.非友元的普通函数.编写程序,求两个复数之和. Input ...
- C#复数类的总结
复数是C#中没有的,不能直接调用的.但是我们可以通过封装,构造自己的复数形式.这里我自己封装了一个Complex类,也不知道写得如何.可能还有一些东西没有考虑. 不过这里包含了复数的基本晕算了了,包括 ...
- 15.C++-操作符重载、并实现复数类
首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...
- C++ 实验 使用重载运算符实现一个复数类
实验目的: 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法 实验要求: 1.定义一个复数类,描述一些必须的成员函数,如:构造函数,析构函数,赋值函数,返回数据成员值的函数等. ...
- 定义一个复数(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 ...
- 侯捷《C++面向对象开发》——动手实现自己的复数类
前言 最近在看侯捷的一套课程<C++面向对象开发>,刚看完第一节introduction之后就被疯狂圈粉.感觉侯捷所提及所重视的部分也正是我一知半解的知识盲区,我之前也写过一些C++面向对 ...
- YTU 2443: C++习题 复数类--重载运算符3+
2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec 内存限制: 128 MB 提交: 1368 解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...
随机推荐
- FCKeditor插件开发实例:uploadify多文件上传插件
FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器.它志于轻量化,不需要太复杂的安装步骤即可使用.它可和PHP.JavaScript.ASP.ASP.NET.ColdFusi ...
- 空值排序(oracle/sqlserver)
oracle认为 null 最大. 升序排列,默认情况下,null值排后面. 降序排序,默认情况下,null值排前面. 改变空值办法: (1)用nvl函数或decode函数将null转换为一特定值 替 ...
- 织梦dedecms自定义字段在首页列表页文章页的调用
1.首页调用. {dede:arclist addfields='字段英文名' channelid='模型ID' row='条数' type='栏目ID'} [field:字段英文名/ ...
- 一则 Mysql 建表语句
DROP TABLE IF EXISTS `nuvue`; CREATE TABLE `nuvue`( `id` ) UNSIGNED NOT NULL AUTO_INCREMENT, `status ...
- Nmap官网中众多文档如何查看
打开Nmap(nmap.org)官网后,会看多个关于文档的链接,熟悉之后会发现有三类,Reference Guide,Books,Docs.通过熟悉知道Doc是文档的入口,且下面是对Doc页面的翻译, ...
- 字符串:格式化 - 零基础入门学习Python015
字符串:格式化 让编程改变世界 Change the world by program 字符串:格式化 上节课我们介绍了Python字符串的N多种奇葩方法的用法,但我们唯独漏了一个format()方法 ...
- js 日常问题记录
1.解决ie6下css背景图不缓存 try{ document.execCommand('BackgroundImageCache',false,true); }catch(e){} 2.为ajax设 ...
- python 文件中的中文编码解决方法
# -*- coding: utf-8 -*- #查看安装的SDK默认的编码字符集在脚本中可以修改你的编码格式, 方法如下:#sys.getdefaultencoding()#reload(sys)# ...
- CSS3 新特性 开放字体格式WOFF
疑问 上面这是虾米玩意? \e806 是在自定义字体表中的字体位置. 好嘛 现在问题来了 WOFF里面是什么东西呢? 怎么才能看到? 用这个:FontCreatorPortable ...
- vi常用命令集锦
转载,原文地址:http://blog.csdn.net/hackbuteer1/article/details/6575232 vi编辑器有3种模式:命令模式.输入模式.末行模式.掌握这三种模式十分 ...