2017-01-22 58 views
-2

如果我有一個std :: vector,我可以訪問一個成員,因爲方括號運算符在vector類中被重載。如果我有一個指向矢量的指針,我可以取消引用指針並使用此運算符。但是用箭頭 - >運算符它不會讓我使用它。例如:解除引用指針時,爲什麼[]括號不起作用?

std::vector<int> myVector;  
std::vector<int>* pToVector; 
myVector[4] = 0;     // Works fine 
(*pToVector)[4] = 0;    // Works fine 
pToVector->[4] = 0;    // Doesn't work 
(pToVector->)[4] = 0;    // Doesn't work 

看來好像 - >箭頭運算符引用指針,是否有理由不期望這會工作?或者這只是關於該語言的其中一件事情?

謝謝。

+1

前2個分配可能似乎正常工作,但您正在訪問UB以外的容器邊界。你需要聲明它爲'std :: vector myVector(5)',它將分配必要的空間來訪問'myVector [4]'後兩個是非法的結構 – doug

+0

這是不正確的語法。箭頭運算符給你*對象。結構如此pToVector - > [4] = 0類似於* pToVector。[4] = 0.這條線(pToVector - >)[4]和這個pToVector - > [4]都不起作用 – arturx64

+0

你爲什麼期望它工作? 'a-> b'表示'(* a).b'。所以,'a - > [b]'可能意味着'(* a)。[]'這是沒有意義的。 – HolyBlackCat

回答

1

第二兩行的正確語法是:

(*pToVector)[4] = 0; 
//dereference the pointer and then call operator[] on the object returned by the dereference 

您可以使用->操作符來訪問這樣的普通成員函數:

pToVector->size(); 

從技術上講,你可以嘗試喲調用operator[]的名稱,但它更詳細。

3
std::vector<int> myVector;  
std::vector<int>* pToVector; 
myVector[4] = 0;     // Works fine. 
(*pToVector)[4] = 0;    // Works fine 
pToVector->[4] = 0;    // Doesn't work 
(pToVector->)[4] = 0;    // Doesn't work 

如果您必須使用指向對象的指針訪問對象類的重載操作符,則必須顯式調用它。

pToVector->operator[](4) 

...順便說一下,訪問索引外myVector.size()是未定義的行爲。這包括代碼中關於// Works fine的註釋註釋。

0

->運算符不只是取消引用,它也訪問一個成員。您正在訪問一個元素*,而不是成員。 ->可能已被定義爲允許,但不是。

*更準確地說,一個向量可以讓你訪問一個對象,就像它是一個數組的元素一樣,但它不會改變語法。

+0

「元素」與「成員」? C++沒有這樣的區別;這些術語可以互換使用。 – MSalters

+0

@MSalters你有沒有C++標準引用類元素或數組成員的例子?我沒有找到他們,但我可能忽略了一些東西。 – hvd

+0

@hvd:我讀了你的語句,因爲'' - >'正在訪問一個元素「而被誤導了,但沒關係。 C++沒有正式定義_element_,標準只在索引中有'element_type',但1.8/2幾乎沒有疑問。也就是說,在這個問題中'']'不訪問一個數組元素,而是指向成員函數'operator []'。相同的標記,不同的含義。 – MSalters

0

->運算符是點運算符的替代品,只是它先取消引用指針。它用於訪問屬性(成員和函數)。對於您的操作,operator[]是屬性。因此,pToVector->operator[](4)適用於(*pToVector)[4] = 0

+0

' - >'不限於數據成員,它也適用於成員函數。顯然'operator []'是一個函數成員,而不是數據。 – MSalters

+0

'屬性'字更合適。但我可能是指成員和方法,同時說數據字段@MSalters – snr

+0

'屬性'不是一個關鍵字,[屬性](http://en.cppreference.com/w/cpp/language/attributes)是完全不同的東西。此外,「成員和方法」毫無意義。方法是成員的一個子集。 (即成員職能)。 – MSalters

0

原因是[]是一個運算符,而短運算符語法不要求或允許成員訪問運算符。這適用於成員訪問運營商.->,這是合理的,因爲後者只是(*a).b的簡寫。

E.g.全部不允許a. & b,a->^b

從技術上講,它也適用於較罕見的.*->*。請注意,後者是而不是->後面是operator*,但指向成員指針取消引用。

相關問題