C++實踐數(shù)組類運算的實現(xiàn)參考
【項目-數(shù)組類運算的實現(xiàn)】
設計數(shù)組類Array,為了實現(xiàn)測試函數(shù)中要求的功能,請補足相關的函數(shù)(構造、析構函數(shù))和運算符重載的函數(shù)。
實現(xiàn)策略提示:可以將測試函數(shù)中的語句加上注釋,取消一句的注釋,增加相應的函數(shù),以漸增地實現(xiàn)所有的功能,避免全盤考慮帶來的困難。
class Array
{
private:
int* list; //用于存放動態(tài)分配的數(shù)組內(nèi)存首地址
int size; //數(shù)組大小(元素個數(shù))
public:
//成員函數(shù)聲明
};
//要求測試函數(shù)能夠運行出正確、合理的結果:
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; //用于存放動態(tài)分配的數(shù)組內(nèi)存首地址
int size; //數(shù)組大?。ㄔ貍€數(shù))
public:
Array(int sz = 50); //構造函數(shù)
Array(int a[], int sz); //構造函數(shù)
Array(const Array &a); //拷貝構造函數(shù)
~Array(); //析構函數(shù)
Array operator + (const Array &a2); //重載"="
Array &operator = (const Array &a2); //重載"="
int &operator[] (int i); //重載"[]"
const int &operator[] (int i) const;
int getSize() const; //取數(shù)組的大小
void resize(int sz); //修改數(shù)組的大小
void show() const;
};
Array::Array(int sz) //構造函數(shù)
{
assert(sz >= 0);//sz為數(shù)組大?。ㄔ貍€數(shù)),應當非負
size = sz; // 將元素個數(shù)賦值給變量size
list = new int [size]; //動態(tài)分配size個int類型的元素空間
}
Array::Array(int a[], int sz)
{
assert(sz >= 0);//sz為數(shù)組大?。ㄔ貍€數(shù)),應當非負
size = sz; // 將元素個數(shù)賦值給變量size
list = new int [size]; //動態(tài)分配size個int類型的元素空間
for (int i = 0; i < size; i++) //從對象X復制數(shù)組元素到本對象
list[i] = a[i];
}
Array::~Array() //析構函數(shù)
{
delete [] list;
}
//拷貝構造函數(shù)
Array::Array(const Array &a)
{
size = a.size; //從對象x取得數(shù)組大小,并賦值給當前對象的成員
//為對象申請內(nèi)存并進行出錯檢查
list = new int[size]; // 動態(tài)分配n個int類型的元素空間
for (int i = 0; i < size; i++) //從對象X復制數(shù)組元素到本對象
list[i] = a.list[i];
}
Array Array::operator + (const Array &a2)
{
assert(size == a2.size); //檢查下標是否越界
//如果本對象中數(shù)組大小與a2不同,則刪除數(shù)組原有內(nèi)存,然后重新分配
Array total(size);
for (int i = 0; i < size; i++)
total.list[i] = list[i]+a2.list[i];
return total;
}
//重載"="運算符,將對象a2賦值給本對象。實現(xiàn)對象之間的整體賦值
Array &Array::operator = (const Array& a2)
{
if (&a2 != this)
{
//如果本對象中數(shù)組大小與a2不同,則刪除數(shù)組原有內(nèi)存,然后重新分配
if (size != a2.size)
{
delete [] list; //刪除數(shù)組原有內(nèi)存
size = a2.size; //設置本對象的數(shù)組大小
list = new int[size]; //重新分配n個元素的內(nèi)存
}
//從對象X復制數(shù)組元素到本對象
for (int i = 0; i < size; i++)
list[i] = a2.list[i];
}
return *this; //返回當前對象的引用
}
//重載下標運算符,實現(xiàn)與普通數(shù)組一樣通過下標訪問元素,并且具有越界檢查功能
int &Array::operator[] (int n)
{
assert(n >= 0 && n < size); //檢查下標是否越界
return list[n]; //返回下標為n的數(shù)組元素
}
//常對象時,會調(diào)用這個函數(shù),運算結果(引用)將不能再被賦值
const int &Array::operator[] (int n) const
{
assert(n >= 0 && n < size); //檢查下標是否越界
return list[n]; //返回下標為n的數(shù)組元素
}
//取當前數(shù)組的大小
int Array::getSize() const
{
return size;
}
//將數(shù)組大小修改為sz
void Array::resize(int sz)
{
assert(sz >= 0); //檢查sz是否非負
if (sz == size) //如果指定的大小與原有大小一樣,什么也不做
return;
int* newList = new int [sz]; //申請新的數(shù)組內(nèi)存
int n = (sz < size) ? sz : size;//將sz與size中較小的一個賦值給n
//將原有數(shù)組中前n個元素復制到新數(shù)組中
for (int i = 0; i < n; i++)
newList[i] = list[i];
delete[] list; //刪除原數(shù)組
list = newList; // 使list指向新數(shù)組
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;
}
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解C++中常見的關鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關鍵字的使用詳解


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10C#中split用法實例總結
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法


