1. 程式人生 > >C++實踐參考——陣列類運算的實現

C++實踐參考——陣列類運算的實現

【專案-陣列類運算的實現】
  設計陣列類Array,為了實現測試函式中要求的功能,請補足相關的函式(構造、解構函式)和運算子過載的函式。
  實現策略提示:可以將測試函式中的語句加上註釋,取消一句的註釋,增加相應的函式,以漸增地實現所有的功能,避免全盤考慮帶來的困難。

class Array
{
private:
    int* list;      //用於存放動態分配的陣列記憶體首地址
    int size;       //陣列大小(元素個數)
public:
    //成員函式宣告
};
//要求測試函式能夠執行出正確、合理的結果:
int main()
{
    int a[8
]= {1,2,3,4,5,6,7,8}; int b[8]= {10,20,30,40,50,60,70,80}; Array array1(a,8),array3,array4; const Array array2(b,8); array4=array3=array1+array2; array3.show(); array4.resize(20); array4[8]=99; cout<<array4[8]<<endl; cout<<array2[3]<<endl; return
0; }

[參考解答]

#include <iostream>
#include <iomanip>
#include <cassert>
using namespace std;

class Array
{
private:
    int* list;      //用於存放動態分配的陣列記憶體首地址
    int size;       //陣列大小(元素個數)
public:
    Array(int sz = 50);     //建構函式
    Array(int a[], int sz);     //建構函式
    Array(const Array &a);  //拷貝建構函式
~Array(); //解構函式 Array operator + (const Array &a2); //過載"=" Array &operator = (const Array &a2); //過載"=" int &operator[] (int i); //過載"[]" const int &operator[] (int i) const; int getSize() const; //取陣列的大小 void resize(int sz); //修改陣列的大小 void show() const; }; Array::Array(int sz) //建構函式 { assert(sz >= 0);//sz為陣列大小(元素個數),應當非負 size = sz; // 將元素個數賦值給變數size list = new int [size]; //動態分配size個int型別的元素空間 } Array::Array(int a[], int sz) { assert(sz >= 0);//sz為陣列大小(元素個數),應當非負 size = sz; // 將元素個數賦值給變數size list = new int [size]; //動態分配size個int型別的元素空間 for (int i = 0; i < size; i++) //從物件X複製陣列元素到本物件 list[i] = a[i]; } Array::~Array() //解構函式 { delete [] list; } //拷貝建構函式 Array::Array(const Array &a) { size = a.size; //從物件x取得陣列大小,並賦值給當前物件的成員 //為物件申請記憶體並進行出錯檢查 list = new int[size]; // 動態分配n個int型別的元素空間 for (int i = 0; i < size; i++) //從物件X複製陣列元素到本物件 list[i] = a.list[i]; } Array Array::operator + (const Array &a2) { assert(size == a2.size); //檢查下標是否越界 //如果本物件中陣列大小與a2不同,則刪除陣列原有記憶體,然後重新分配 Array total(size); for (int i = 0; i < size; i++) total.list[i] = list[i]+a2.list[i]; return total; } //過載"="運算子,將物件a2賦值給本物件。實現物件之間的整體賦值 Array &Array::operator = (const Array& a2) { if (&a2 != this) { //如果本物件中陣列大小與a2不同,則刪除陣列原有記憶體,然後重新分配 if (size != a2.size) { delete [] list; //刪除陣列原有記憶體 size = a2.size; //設定本物件的陣列大小 list = new int[size]; //重新分配n個元素的記憶體 } //從物件X複製陣列元素到本物件 for (int i = 0; i < size; i++) list[i] = a2.list[i]; } return *this; //返回當前物件的引用 } //過載下標運算子,實現與普通陣列一樣通過下標訪問元素,並且具有越界檢查功能 int &Array::operator[] (int n) { assert(n >= 0 && n < size); //檢查下標是否越界 return list[n]; //返回下標為n的陣列元素 } //常物件時,會呼叫這個函式,運算結果(引用)將不能再被賦值 const int &Array::operator[] (int n) const { assert(n >= 0 && n < size); //檢查下標是否越界 return list[n]; //返回下標為n的陣列元素 } //取當前陣列的大小 int Array::getSize() const { return size; } //將陣列大小修改為sz void Array::resize(int sz) { assert(sz >= 0); //檢查sz是否非負 if (sz == size) //如果指定的大小與原有大小一樣,什麼也不做 return; int* newList = new int [sz]; //申請新的陣列記憶體 int n = (sz < size) ? sz : size;//將sz與size中較小的一個賦值給n //將原有陣列中前n個元素複製到新陣列中 for (int i = 0; i < n; i++) newList[i] = list[i]; delete[] list; //刪除原陣列 list = newList; // 使list指向新陣列 size = sz; //更新size } void Array::show() const { for (int i = 0; i < size; i++) cout<< list[i]<<" "; cout<<endl; } int main() { int a[8]= {1,2,3,4,5,6,7,8}; int b[8]= {10,20,30,40,50,60,70,80}; Array array1(a,8),array3,array4; const Array array2(b,8); array4=array3=array1+array2; array3.show(); array4.resize(20); array4[8]=99; cout<<array4[8]<<endl; cout<<array2[3]<<endl; return 0; }

相關推薦

C++實踐參考——陣列運算實現

【專案-陣列類運算的實現】   設計陣列類Array,為了實現測試函式中要求的功能,請補足相關的函式(構造、解構函式)和運算子過載的函式。   實現策略提示:可以將測試函式中的語句加上註釋,取消一句的註釋,增加相應的函式,以漸增地實現所有的功能,避免全盤考慮

C++實踐參考——複數中的運算子過載

【專案-實現複數類中的運算子過載】(1)請用類的成員函式,定義複數類過載運算子+、-、*、/,使之能用於複數的加減乘除class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r; im

C++實踐參考——點派生直線

【專案 - 點類派生直線類】定義點類Point,並以點類為基類,派生出直線類Line,從基類中繼承的點的資訊表示直線的中點。請閱讀下面的程式碼,並將缺少的部分寫出來。#include<iostre

C++實踐參考——分數中的運算子過載

【專案1-分數類中的運算子過載】   (1)實現分數類中的運算子過載,在分數類中可以完成分數的加減乘除(運算後再化簡)、比較(6種關係)的運算。 class CFraction { private: int nume; // 分子 in

C++實踐參考——立體族共有的抽象

【專案-立體類族共有的抽象類】    設計一個抽象類CSolid,含有用於求表面積及體積的兩個純虛擬函式。設計派生類CCube、CBall、CCylinder,分別表示正方體、球體及圓柱體。在main()函式中,定義CSolid *p;(p是指向基類的指標,且這個基類是個抽象類)。要求利用這個p指標,能夠求出

C++實踐參考——形狀族的中的純虛擬函式

【專案-形狀類族的中的純虛擬函式】寫一個程式,定義抽象基類Shape,由它派生出3個派生類,Circle(圓形)、Rectangle(矩形)、Triangle(三角形)。用如下的main()函式,求出定

C++實踐參考——Time中的運算子過載

【專案-Time類中的運算子過載】   實現Time類中的運算子過載。 class CTime { private: unsigned short int hour; // 時 unsigned short int minute;

C++實踐參考——長方柱

【專案 - 長方柱類】  編寫基於物件的程式,求3個長方柱(Bulk)的體積。資料成員包括長(length)、寬(width)、高(heigth)、體積,要求設計成員函式實現下面的功能:  (1)由鍵盤

C++實踐參考:兩個成員的模板

【專案-兩個成員的類模板】   設有如下的類宣告: class Test{ public: void SetData1(int val) { data1=val; } void SetData2(double val) {data2=val:

C++實踐參考解答 窮舉法解決組合問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++實踐參考:排序函式模板

【專案-排序函式模板】   已知 void Sort(int a[],int size); void Sort(double a[],int size); 是一個函式模板的兩個例項,其功能是將陣列

資料結構學習之路(一)C語言對陣列的簡單實現

以下的程式只是在觀看郝斌老師講解的(C語言資料結構)之後自己做得簡單練習。# include <stdio.h> # include <stdlib.h> typedef struct MyArray{ int * pBase; //存放陣列第一個

C++實踐參考——處理C++原始碼的程式

【專案 - 處理C++原始碼的程式】  在CodeBlocks等IDE中都提供了程式碼格式整理的功能。完成這種功能的程式,操作的資料是用C++寫的原始碼檔案。C++原始檔是一種文字檔案,可以通過程式進行操作。整合開發環境(IDE)對對程式進行編譯,操作的“資料”是源程式。編譯

C++ 二維陣列練習

#include <iostream> #include <cstring> using namespace std; class Array2 { // 在此處補充你的程式碼 }; int main() { Array2 a(3,4);

C++實踐參考——二進位制檔案瀏覽器

【專案-二進位制檔案瀏覽器】 (1)做一個類似BinaryViewer的檢視二進位制檔案的程式,輸入檔名後,可以以16進位制和ASCII對照的方式列出該檔案的內容,可以參考下圖: 提示:

C++實踐參考——摩托車繼承自行車和機動車

#include <iostream> #include<conio.h> #include <windows.h> using namespace std; enum VehicleStaus {rest, running}; //車輛狀態:泊車、行進 class Ve

C++深度剖析教程39】實現C++陣列模板

上一篇文章在那個學習了多引數類模板與特化的分析:點選連結檢視上一篇文章:類模板深度剖析 本篇文章學習記錄: 數值型模板引數 實現C++陣列類模板 1、模板中的數值型引數 模板引數可以是數值型引數。也就是非型別引數。如下圖所示: 我們可以像上面定義

C語言及程式設計》實踐參考——矩陣運算

【專案2-矩陣運算】  在數學中,一個矩陣由若干行和若干列資料組成,可以直接儲存為一個二維陣列。(1)矩陣相加  兩個矩陣相加,要求其行、列數均相等。運算規則為:一個n行m列的矩陣A加上另一個n行m列的

C++:順序表實現約瑟夫問題_密碼不同

class josephus main clu 定義 void seq esp while //.h #pragma once#include <iostream>using namespace std;#define MAXSIZE 100 template

C++ 用封裝實現隊列

pan pub pre () turn ear als sin push 1 #include<stdlib.h> 2 #include <iostream> 3 using std::cout; 4 using std::end