1. 程式人生 > >過載陣列下標操作符,使用operator

過載陣列下標操作符,使用operator

原貼:http://blog.csdn.net/keeplooking2510/article/details/8042057

    陣列在類的定義中確定好了長度之後,就會限制所要儲存的元素的個數,假如我們要儲存的元素的個數超過了已確定的陣列的長度,那麼就會導致陣列越界。故最好的辦法就是在建立物件的時候才確定要儲存元素的個數,即陣列的長度,而不是在陣列定義的時候。

    此時,可採用過載陣列下標操作符[]函式來解決,即建立一個char& A::operator[](int i);函式,i為建立物件陣列傳過來的下標值。具體例子如下:

#include <iostream>
using namespace std;
class A
{
private:
 int length;
 char* Size; //定義指向char型別陣列的的空間的指標
public:
 A(int l)
 {
  length=l;
  Size=new char[length];//在堆中開闢新空間,儲存char型別陣列,長度為length(此長度在建立物件時確定),
  //該空間的地址賦給成員指標變數Size
 }
 ~A(){delete [] Size;}
 int GetLength(){return length;}
 char& operator[](int i);//宣告下標操作函式operator[],i為物件陣列傳過來的下標值
 //用 [] 取值,並通過 [] 修改原來的元素,所以要通過引用返回的就是 size[] 本身的一個元素。
};
char& A::operator [](int i)
{
 if(i>=0&&i<=length)
  return Size[i];
 else
 {
  cout<<"\n超出範圍!\n";
  return Size[length-1];
 }

}

#include <iostream>
#include "demoClass_1.h"
using namespace std;
//使用operator[]下標函式的優點:(1)不用將陣列的長度定義為一個常量;(2)可避免陣列越界。
//注意點:(1)由於下標運算子函式的引數是陣列的下標,因此該函式只能帶一個引數,不可帶多個引數;
//(2)由於下標運算子函式只限於本類的物件使用,因此不得將下標運算子函式過載為友元函式,且必須是非static成員函式。
int main()
{
 A a(6);
 char* ch="helloEV";
 for(int i=0;i<8;i++)
 {
  a[i]=ch[i];//每迴圈一次,將ch中的一個字元賦給物件a的char型陣列,
  //賦值符左邊的a[i]==a.operator[](i),即呼叫過載建構函式,i是下標值。
  //如果i不超過堆中建立的char型陣列長度,
  //那麼返回char型陣列的第i個元素;如果超過,則返回該陣列的最後一個元素。

  cout<<"第"<<i+1<<"次迴圈:"<<a[i]<<endl;
 }
 cout<<"\n";
 for(int j=0;j<8;j++)
  cout<<a[j]<<endl;
 cout<<"\n";
 cout<<a.GetLength()<<endl;
}

相關推薦

過載陣列操作符使用operator

原貼:http://blog.csdn.net/keeplooking2510/article/details/8042057     陣列在類的定義中確定好了長度之後,就會限制所要儲存的元素的個數,假如我們要儲存的元素的個數超過了已確定的陣列的長度,那麼就會導致陣列越界。

c++筆記05---雙目運算子單目操作符操作符函式操作符解引用

1.    雙目複合運算子 1     += / -= / *=     左值,左運算元的引用;     左變右不變     (a += b) = c;     這裡 a 得到 c 的值,b 沒起作用;     下面這個例子實現上面這個效果:          Comple

C++之過載陣列[]與圓括號()運算子的方法

#include <iostream> using namespace std; class Matrix { public: Matrix(int, int) ; int& operator()(int, int) ; // 過載圓括號運算子"()" private:

陣列為什麼是從0開始的而不是1?

依稀記得大一開始學習C語言的時候,對於陣列下標從0開始這一點是非常彆扭難以適應的,感覺這就是反人類的設計。直到今天才瞭解這背後為什麼這樣設計的原理。 為了解釋清楚這個原因,我們來認識陣列的相關特性,據此來探索它底層的一些東西。 隨機訪問 為什麼陣列能支援隨機訪問呢,我們先來看看陣列專業定義。陣列( Arr

(pyhon)給定一個整數陣列 nums 和一個目標值 target請你在該陣列中找出和為目標值的那 兩個 整數並返回他們的陣列

方法一:使用最容易理解的遍歷陣列進行查詢 def solution(nums,target): #如果列表長度小於2,則直接結束 if len(nums) < 2: return #兩次迴圈列表,分別對列表中的所有可能的數字進行相加

利用陣列將n以內的數進行排序

巧用陣列下標 陣列的下標是一個隱含的很有用的陣列,特別是在統計一些數字,或者判斷一些整型數是否出現過的時候。例如,給你一串字母,讓你判斷這些字母出現的次數時,我們就可以把這些字母作為下標,在遍歷的時候,如果字母a遍歷到,則arr[a]就可以加1了,即  arr[a]++;

VC結構體實現類似陣列操作符功能

在某些特殊時候,我們會想如果結構體也能向陣列一樣通過下標操作符進行操作的話,程式碼將直接通過迴圈語句就能實現,尤其當我們的資料來源於資料庫獲得的資料集時,這種用法還是比較有意思的。 結構體的下標操作這裡只做技術上研究,實際開發中非常不提倡這麼用。原因是這種結構體當成員很多時

為什麼C陣列從0開始而不是從1開始

  對於學習過程式語言的人來說,相信絕大多數人都會有這樣的疑問:我們平時計數,通常是從一開始計數的,為什麼在程式語言中,陣列的下標是從0開始計算的呢?   這是因為,C語言中,下標的含意是:當前元素到第一個元素的偏移量。第一個元素的下標自然就是0,第二個元素的

【C++】過載二維陣列 [ ][ ]

寫在文章開頭的話 讀完這篇文章後,你將學習到下面的知識: (1)一個多維陣列是如何工作的 (2)如何過載二維陣列下標 1. 分析 過載一維陣列下標很簡單,通過下標傳入的索引值,返回內部陣列中相應的值。那過載二維陣列的下標運算呢? 其實過載二維和一維本質是一樣的,因為 C/

php獲取多維陣列某個特定鍵(陣列)的所有值具體總結其餘的方法

1、專案中經常會用到獲取多維陣列某個特定鍵的所有值,經常的做法是迴圈獲取,今天在網上看到一個不用迴圈獲取的辦法。 /* author: [email protected] description: 根據某一特定鍵(下標)取出一維或多維陣列的所有值;不用迴圈的理由是考慮大陣

array_map 等php回撥函式使用問題(關聯陣列獲取)

前言:我自己用此類回撥函式,來替代 foreach 純粹是用為程式碼的簡潔性,讓程式碼更好看。(我有點程式碼小潔癖~) 1、array_reduce 當迭代處理一個一維索引陣列時,在回撥函式內是無法獲取到當時元素索引的。所以想要獲取時,需得藉助一個外部變數。 目的:把 $arr 遍歷到 <sele

陣列的由來和為什麼陣列從0開始?

本文索引: 1.陣列的由來: a.字面引申: b.通俗解釋: 陣列的特點: 2.陣列下標為什麼從0開始: a.初步理解: b.加深理解: 1.陣列的由來: // 變數

python迴圈陣列

http://outofmemory.cn/code-snippet/3741/accessing-the-index-in-python-for-loops 但是有時候我們會需要在便利陣列的同時訪問下標,這時候可以藉助於enumerate函式來實現,例如: l = [1,2,3]for

(C++)用陣列形式對一維陣列進行排序

用另一個數組下標的形式記錄一個一維陣列中下標所對應的元素出現在個數,並對此一維陣列進行排序。 例如:一個一維陣列中的元素為:a[4] = { 2,3,2,5 };此陣列為一個長度為4的陣列,另一個空陣列x[6]={ 0 };x[0] = 0,因為使用下標的形式記錄a陣列中的元素,此時x[]的

陣列越界的避免方法

為什麼會出現陣列下標越界? C語言不檢查陣列下標的合法性 陣列下標越界的危害 陣列下標越界時,結果隨機。可能導致程式功能不正常,也可能導致程式崩潰。 如何防止陣列下標越界? 1、在使用迴圈遍歷陣列元素時,注意防範off-by-one的錯誤。 2、對於作為函式引數傳入的陣列下標

[work] shell中陣列訪問

shell中陣列的下標預設是從0開始的 1。將字串放在陣列中,獲取其長度 #!/bin/bash str="a b --n d" array=($str) length=${#array[@]} echo $length for ((i=0; i<$length;

用列舉型別作為陣列

  在開發中,經常會用到一些陣列,它裡面存放一定數量(已知,不是太多)的特定元素。在使用數字表示的陣列下標訪問陣列中元素的時候,根本不知道該元素是否是需要的那個元素,而且使程式碼可讀性降低,甚至還會出現下標越界的危險。    比如,現在有如下的繼承體系: class CSh

Java學習筆記33:陣列越界

陣列下標越界 :在引用陣列元素時,使用的下標超過了該陣列下標的應有範圍。 但應注意的是: C/C++不對陣列做邊界檢查。 可以重寫陣列的每一端,並寫入一些其他變數的陣列或者甚至是寫入程式的程式碼。不檢查下標是否越界可以有效提高程式執行的效率,因為如果你檢查,那麼編譯器必須在生成的目的碼中

C專家程式設計 十 規則2: C語言把陣列作為指標的偏移量(二)

        把陣列下標作為指標加偏移量足C語言從BCPL (C語言的祖先)繼承過來的技巧。在人們的常規思維中,在執行時增加對C語言下標的範圍檢查是不切實際的。因為取下標操作只是表示將要訪問該陣列,

JS 用字串做陣列

今天學習中竟然發現JS可以用字串做陣列下標,當時也是把我震驚到了。於是決定好好研究一下。查了半天資料, 找到一個部落格分析的很詳細。轉貼到這裡,方便以後複習學習。 跪謝原博主。  原文http://www.cnblogs.com/ZJAJS/archive/2013/01/