C++ 開(kāi)發(fā)之實(shí)現(xiàn)操作符重載的實(shí)例
C++操作符重載
實(shí)現(xiàn)效果圖:
實(shí)例代碼:
Matrix.h
#pragma once
#include "vector"
#include "iostream"
#define rep(i,n) for(int i=1;i<=n;i++) //宏定義for循環(huán),精簡(jiǎn)代碼
using namespace std;
class Matrix
{
public:
//基本構(gòu)造函數(shù)
Matrix(int Row=0, int Column=0);
//拷貝構(gòu)造函數(shù)或者復(fù)制構(gòu)造函數(shù)
Matrix(const Matrix& matrix);
//賦值操作符重載,必須為成員函數(shù),不然會(huì)報(bào)錯(cuò)
Matrix& operator=(const Matrix& matrix);
//復(fù)合賦值操作符重載,建議重載為成員函數(shù)
Matrix& operator+=(const Matrix& matrix);
Matrix& operator*=(const Matrix& matrix);
Matrix& operator*=(const float& number);
Matrix& operator*=(const int& number);
Matrix& operator-=(const Matrix& matrix);
Matrix& operator/=(const float& number);
float& operator[](const size_t& index);
Matrix& operator++();//前綴式自增
Matrix& operator--();//前綴式自減
Matrix operator++(int); //后綴式自增
Matrix operator--(int); //后綴式自減
//算術(shù)和關(guān)系操作符一般為非成員函數(shù),聲明為友元
friend Matrix operator+(const Matrix& matrix1, const Matrix& matrix2);
friend Matrix operator-(const Matrix& matrix1, const Matrix& matrix2);
friend Matrix operator*(const Matrix& matrix1, const Matrix& matrix2);
friend Matrix operator*(const Matrix& matrix1, const float& number);
friend Matrix operator*(const Matrix& matrix1, const int& number);
friend bool operator==(const Matrix& matrix1, const Matrix& matrix2);
friend bool operator!=(const Matrix& matrix1, const Matrix& matrix2);
//輸出操作符<<的重載,必須聲明為友元
friend ostream& operator<<(ostream& os, const Matrix&object);
//輸入操作符>>重載,必須聲明為友元
friend istream& operator >>(istream& in,Matrix&object);
void Display();
~Matrix();
public:
int Row;
int Column;
vector<vector<float> > data; //二維vector,用于存放矩陣類(lèi)數(shù)據(jù)
};
Matrix.cpp
#include "stdafx.h"
#include "Matrix.h"
#include "iomanip"
//構(gòu)造函數(shù)
Matrix::Matrix(int Row/* =0 */, int Column/* =0 */){
this->Row = Row;
this->Column = Column;
data.resize(Row + 1); //申請(qǐng)行數(shù)為row+1,0號(hào)位不用
rep(i, Row)
data[i].resize(Column + 1); //申請(qǐng)各行的列數(shù)
rep(i, Row)
rep(j, Column)
data[i][j] = 0; //每個(gè)元素初始化為0,方便后面計(jì)算
}
//打印函數(shù)
void Matrix::Display(){
rep(i, Row)
{
rep(j, Column)
cout << setw(8) << data[i][j] << ' ';
cout <<endl;
}
}
//拷貝構(gòu)造函數(shù)
Matrix::Matrix(const Matrix& matrix){
Row = matrix.Row;
Column = matrix.Column;
data.resize(Row+1); //申請(qǐng)行數(shù)為row,0號(hào)位不用
rep(i, Row)
data[i].resize(Column+1); //申請(qǐng)各行的列數(shù)
rep(i, Row)
rep(j, Column)
data[i][j] = matrix.data[i][j];
}
//賦值操作符重載
Matrix& Matrix::operator=(const Matrix& matrix){
if (this==&matrix)
{
return *this;
}
Row = matrix.Row;
Column = matrix.Column;
//分配資源
data.resize(Row + 1); //申請(qǐng)行數(shù)為row+1,0號(hào)位不用
rep(i, Row)
data[i].resize(Column + 1); //申請(qǐng)各行的列數(shù)
rep(i, Row)
rep(j, Column)
data[i][j] = matrix.data[i][j];
//返回本對(duì)象的引用
return *this;
}
//復(fù)合賦值操作符重載
Matrix& Matrix::operator+=(const Matrix& matrix){
if (Row == matrix.Row&&Column == matrix.Column)
{
rep(i, Row)
{
rep(j,Column)
{
data[i][j] += matrix.data[i][j];
}
}
}
return *this;
}
Matrix& Matrix::operator-=(const Matrix& matrix){
if (Row == matrix.Row&&Column == matrix.Column)
{
rep(i, Row)
{
rep(j, Column)
{
data[i][j] -= matrix.data[i][j];
}
}
}
return *this;
}
Matrix& Matrix::operator*=(const float& number){
rep(i, Row)
{
rep(j, Column)
{
data[i][j] = data[i][j] * number;
}
}
return *this;
}
Matrix& Matrix::operator*=(const int& number){
rep(i, Row)
{
rep(j, Column)
{
data[i][j] = data[i][j] * number;
}
}
return *this;
}
Matrix& Matrix::operator*=(const Matrix& matrix){
//先保存矩陣的值
Matrix temp(Row, Column);
rep(i, temp.Row)
{
rep(j, temp.Column)
{
temp.data[i][j] = data[i][j];
}
}
//改變矩陣的大小和值
Column = matrix.Column;
data.clear(); //清除數(shù)據(jù)
data.resize(Row+1); //申請(qǐng)行數(shù)為row+1,0號(hào)位不用
rep(i, Row)
data[i].resize(Column+1); //申請(qǐng)各行的列數(shù)
//重新給矩陣賦值
rep(i, temp.Row)
{
rep(j, matrix.Column)
{
double sum = 0;
rep(k, temp.Column)
sum += temp.data[i][k] * matrix.data[k][j];
data[i][j] = sum; //改變矩陣的值
}
}
return *this;
}
Matrix& Matrix::operator/=(const float& number){
rep(i, Row)
{
rep(j, Column)
{
data[i][j] = data[i][j] / number;
}
}
return *this;
}
//前綴式自增
Matrix& Matrix::operator++(){
//對(duì)每個(gè)元素都加1
rep(i, Row)
{
rep(j, Column)
{
data[i][j] +=1;
}
}
return *this;
}
//前綴式自減
Matrix& Matrix::operator--(){
//對(duì)每個(gè)元素都減1
rep(i, Row)
{
rep(j, Column)
{
data[i][j] -= 1;
}
}
return *this;
}
//后綴式自增
Matrix Matrix::operator++(int){
//拷貝構(gòu)造函數(shù)
Matrix ret(*this);
//對(duì)每個(gè)元素都加1
rep(i, Row)
{
rep(j, Column)
{
data[i][j] += 1;
}
}
return ret;
}
//后綴式自減
Matrix Matrix::operator--(int){
//拷貝構(gòu)造函數(shù)
Matrix ret(*this);
//對(duì)每個(gè)元素都減1
rep(i, Row)
{
rep(j, Column)
{
data[i][j] -= 1;
}
}
return ret;
}
//析構(gòu)函數(shù)
Matrix::~Matrix()
{
data.clear();
}
//加法操作符重載
Matrix operator+(const Matrix& matrix1, const Matrix& matrix2){
Matrix temp(matrix1.Row, matrix1.Column);
if (matrix1.Row == matrix2.Row&&matrix1.Column == matrix2.Column)
{
rep(i, matrix1.Row)
{
rep(j, matrix2.Column)
{
temp.data[i][j] = matrix1.data[i][j]+matrix2.data[i][j];
}
}
}
return temp;
}
//減法操作符重載
Matrix operator-(const Matrix& matrix1, const Matrix& matrix2){
Matrix temp(matrix1.Row, matrix1.Column);
if (matrix1.Row == matrix2.Row&&matrix1.Column == matrix2.Column)
{
rep(i, matrix1.Row)
{
rep(j, matrix2.Column)
{
temp.data[i][j] = matrix1.data[i][j] - matrix2.data[i][j];
}
}
}
return temp;
}
//乘法操作符重載
Matrix operator*(const Matrix& matrix1, const Matrix& matrix2){
Matrix temp(matrix1.Row, matrix2.Column);
rep(i, temp.Row)
{
rep(j, temp.Column)
{
double sum = 0;
rep(k, matrix1.Column)
sum += matrix1.data[i][k] * matrix2.data[k][j];
temp.data[i][j] = sum;
}
}
return temp;
}
//乘法操作符重載
Matrix operator*(const Matrix& matrix1, const float& number){
Matrix temp(matrix1.Row, matrix1.Column);
rep(i, temp.Row)
{
rep(j, temp.Column)
{
temp.data[i][j] = matrix1.data[i][j]* number;
}
}
return temp;
}
//乘法操作符重載
Matrix operator*(const Matrix& matrix1, const int& number){
Matrix temp(matrix1.Row, matrix1.Column);
rep(i, temp.Row)
{
rep(j, temp.Column)
{
temp.data[i][j] = matrix1.data[i][j] * number;
}
}
return temp;
}
//等于關(guān)系操作符重載
bool operator==(const Matrix& matrix1, const Matrix& matrix2){
//只有維數(shù)相等才有可比性
if (matrix1.Row==matrix2.Row&&matrix1.Column==matrix2.Column)
{
rep(i, matrix1.Row)
{
rep(j, matrix1.Column)
{
if (matrix1.data[i][j]!=matrix2.data[i][j])
{
return false;
}
}
}
return true;
}
else
{
return false;
}
}
//不等于關(guān)系操作符重載
bool operator!=(const Matrix& matrix1, const Matrix& matrix2){
//只有維數(shù)相等才有可比性
if (matrix1.Row == matrix2.Row&&matrix1.Column == matrix2.Column)
{
rep(i, matrix1.Row)
{
rep(j, matrix1.Column)
{
if (matrix1.data[i][j] != matrix2.data[i][j])
{
return true;
}
}
}
return false;
}
else
{
return false;
}
}
//輸出操作符重載
ostream& operator<<(ostream& os, const Matrix&object){
rep(i, object.Row)
{
rep(j, object.Column)
os << setw(8) << object.data[i][j] << ' ';
os <<endl;
}
return os;
}
//輸入操作符重載
istream& operator >>(istream& in, Matrix&object){
rep(i, object.Row)
rep(j, object.Column)
in >> object.data[i][j];
return in;
}
main.c
#include "iostream"
#include "Matrix.h"
using namespace std;
int main(){
int row1, row2, col1, col2;
cout << "請(qǐng)輸入第一個(gè)矩陣的行和列:\n";
cin >> row1 >> col1;
Matrix m1(row1, col1);
cout << "請(qǐng)輸入" << row1 << '*' << col1 << "個(gè)數(shù):\n";
cin >> m1;
cout << "輸出矩陣的值:\n";
cout << m1;
cout << "請(qǐng)輸入第二個(gè)矩陣的行和列:\n";
cin >> row2 >> col2;
Matrix m2(row2, col2);
cout << "請(qǐng)輸入" << row2 << '*' << col2 << "個(gè)數(shù):\n ";
cin >> m2;
cout << "輸出矩陣的值:\n";
cout << m2;
if (col1 != row2)
cout << "這兩個(gè)矩陣無(wú)法相乘\n";
else
{
cout << "判斷矩陣m1與m2是否相等:\n";
if (m1==m2)
{
cout << "m1和m2相等:\n";
}
else
{
cout << "m1和m2不相等:\n";
}
cout << "m1拷貝構(gòu)造m3矩陣結(jié)果輸出:\n";
Matrix m3(m1);
cout << m3;
cout << "m1賦值重載m4矩陣結(jié)果輸出:\n";
Matrix m4(m1.Row,m1.Column);
m4 = m1;
cout << m4;
cout << "m1*m2矩陣相乘輸出m5:\n";
Matrix m5(m1.Row, m2.Column);
m5 = m1*m2;
cout << m5;
cout << "矩陣m1*2輸出m6:\n";
Matrix m6(m1.Row, m1.Column);
m6 = m1*2;
cout << m6;
cout << "矩陣m1*0.5輸出m7:\n";
Matrix m7(m1.Row, m1.Column);
m7 = m1 * 0.5;
cout << m7;
cout << "m1*m2矩陣相乘輸出m1:\n";
m1 *= m2;
cout << m1;
cout << "m1矩陣前自增輸出\n";
cout << ++m1;
cout << "m1矩陣后自增輸出\n";
cout << m1++;
cout << "m1矩陣輸出\n";
cout << m1;
cout << "m1矩陣前自減輸出\n";
cout << --m1;
cout << "m1矩陣后自減輸出\n";
cout << m1--;
cout << "m1矩陣輸出\n";
cout << m1;
}
return 0;
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
上一篇:C語(yǔ)言中調(diào)用Swift函數(shù)實(shí)例詳解
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解
本文標(biāo)題:C++ 開(kāi)發(fā)之實(shí)現(xiàn)操作符重載的實(shí)例
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1327.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10fatal error LNK1104: 無(wú)法打開(kāi)文件“l(fā)ibc.lib”的解決方法
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類(lèi)算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?


