C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考
【項(xiàng)目-數(shù)組類運(yùn)算的實(shí)現(xiàn)】
設(shè)計(jì)數(shù)組類Array,為了實(shí)現(xiàn)測試函數(shù)中要求的功能,請補(bǔ)足相關(guān)的函數(shù)(構(gòu)造、析構(gòu)函數(shù))和運(yùn)算符重載的函數(shù)。
實(shí)現(xiàn)策略提示:可以將測試函數(shù)中的語句加上注釋,取消一句的注釋,增加相應(yīng)的函數(shù),以漸增地實(shí)現(xiàn)所有的功能,避免全盤考慮帶來的困難。
class Array
{
private:
int* list; //用于存放動態(tài)分配的數(shù)組內(nèi)存首地址
int size; //數(shù)組大?。ㄔ貍€數(shù))
public:
//成員函數(shù)聲明
};
//要求測試函數(shù)能夠運(yùn)行出正確、合理的結(jié)果:
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); //構(gòu)造函數(shù)
Array(int a[], int sz); //構(gòu)造函數(shù)
Array(const Array &a); //拷貝構(gòu)造函數(shù)
~Array(); //析構(gòu)函數(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) //構(gòu)造函數(shù)
{
assert(sz >= 0);//sz為數(shù)組大小(元素個數(shù)),應(yīng)當(dāng)非負(fù)
size = sz; // 將元素個數(shù)賦值給變量size
list = new int [size]; //動態(tài)分配size個int類型的元素空間
}
Array::Array(int a[], int sz)
{
assert(sz >= 0);//sz為數(shù)組大小(元素個數(shù)),應(yīng)當(dāng)非負(fù)
size = sz; // 將元素個數(shù)賦值給變量size
list = new int [size]; //動態(tài)分配size個int類型的元素空間
for (int i = 0; i < size; i++) //從對象X復(fù)制數(shù)組元素到本對象
list[i] = a[i];
}
Array::~Array() //析構(gòu)函數(shù)
{
delete [] list;
}
//拷貝構(gòu)造函數(shù)
Array::Array(const Array &a)
{
size = a.size; //從對象x取得數(shù)組大小,并賦值給當(dāng)前對象的成員
//為對象申請內(nèi)存并進(jìn)行出錯檢查
list = new int[size]; // 動態(tài)分配n個int類型的元素空間
for (int i = 0; i < size; i++) //從對象X復(fù)制數(shù)組元素到本對象
list[i] = a.list[i];
}
Array Array::operator + (const Array &a2)
{
assert(size == a2.size); //檢查下標(biāo)是否越界
//如果本對象中數(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;
}
//重載"="運(yùn)算符,將對象a2賦值給本對象。實(shí)現(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è)置本對象的數(shù)組大小
list = new int[size]; //重新分配n個元素的內(nèi)存
}
//從對象X復(fù)制數(shù)組元素到本對象
for (int i = 0; i < size; i++)
list[i] = a2.list[i];
}
return *this; //返回當(dāng)前對象的引用
}
//重載下標(biāo)運(yùn)算符,實(shí)現(xiàn)與普通數(shù)組一樣通過下標(biāo)訪問元素,并且具有越界檢查功能
int &Array::operator[] (int n)
{
assert(n >= 0 && n < size); //檢查下標(biāo)是否越界
return list[n]; //返回下標(biāo)為n的數(shù)組元素
}
//常對象時,會調(diào)用這個函數(shù),運(yùn)算結(jié)果(引用)將不能再被賦值
const int &Array::operator[] (int n) const
{
assert(n >= 0 && n < size); //檢查下標(biāo)是否越界
return list[n]; //返回下標(biāo)為n的數(shù)組元素
}
//取當(dāng)前數(shù)組的大小
int Array::getSize() const
{
return size;
}
//將數(shù)組大小修改為sz
void Array::resize(int sz)
{
assert(sz >= 0); //檢查sz是否非負(fù)
if (sz == size) //如果指定的大小與原有大小一樣,什么也不做
return;
int* newList = new int [sz]; //申請新的數(shù)組內(nèi)存
int n = (sz < size) ? sz : size;//將sz與size中較小的一個賦值給n
//將原有數(shù)組中前n個元素復(fù)制到新數(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;
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- C++/JAVA/C#子類調(diào)用父類函數(shù)情況總結(jié)
- C++面試基礎(chǔ)之static關(guān)鍵字詳解
- C++稀疏矩陣的各種基本運(yùn)算并實(shí)現(xiàn)加法乘法
- Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑
- C++項(xiàng)目求Fibonacci數(shù)列的參考解答
- C++實(shí)踐數(shù)組作數(shù)據(jù)成員的參考
- 一張圖總結(jié)C++中關(guān)于指針的那些事
- C++實(shí)踐分?jǐn)?shù)類中運(yùn)算符重載的方法參考
- C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)
- 遞歸刪除二叉樹中以x為根的子樹
相關(guān)文章
C語言實(shí)現(xiàn)動態(tài)順序表的實(shí)現(xiàn)代碼
這篇文章主要介紹了C語言實(shí)現(xiàn)動態(tài)順序表的實(shí)現(xiàn)代碼的相關(guān)資料,動態(tài)順序表在內(nèi)存中開辟一塊空間,可以隨我們數(shù)據(jù)數(shù)量的增多來擴(kuò)容,需要的朋友可以參考下2017-08-08
??C++11系列學(xué)習(xí)之Lambda表達(dá)式
這篇文章主要介紹了??C++11系列學(xué)習(xí)之Lambda表達(dá)式,C++11終于也引入了lambda表達(dá)式,lambda最早來源于函數(shù)式編程,現(xiàn)代語言慢慢都引入了這個語法,下文關(guān)于??C++11Lambda表達(dá)式相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-04-04
數(shù)據(jù)結(jié)構(gòu)之帶頭結(jié)點(diǎn)的單鏈表
單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。鏈表中的數(shù)據(jù)是以結(jié)點(diǎn)來表示的,每個結(jié)點(diǎn)的構(gòu)成:數(shù)據(jù)域(數(shù)據(jù)元素的映象)?+?指針域(指示后繼元素存儲位置),元素就是存儲數(shù)據(jù)的存儲單元,指針就是連接每個結(jié)點(diǎn)的地址數(shù)據(jù)2023-07-07
重構(gòu)-C++實(shí)現(xiàn)矩陣的簡單實(shí)例
下面小編就為大家?guī)硪黄貥?gòu)-C++實(shí)現(xiàn)矩陣的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
C++編程中的數(shù)據(jù)類型和常量學(xué)習(xí)教程
這篇文章主要介紹了C++編程中的數(shù)據(jù)類型和常量學(xué)習(xí)教程,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09

