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