C++?指針和對象成員訪問的區(qū)別:`.`?與?`->`?的使用小結(jié)
在學(xué)習(xí) C++ 時(shí),常常會遇到訪問對象成員的兩種符號:.
和 ->
。這兩個(gè)符號看似簡單,但它們的正確使用卻需要理解指針和對象的本質(zhì)差異。對于 C/C++ 小白來說,這篇文章將詳細(xì)解釋它們的區(qū)別,幫助你在編程時(shí)少踩坑。
一、.
與 ->
的基本概念
在 C++ 中,.
和 ->
是用來訪問類(或結(jié)構(gòu)體)成員的操作符。它們的使用場景有所不同:
.
(點(diǎn)號操作符):用于訪問非指針對象的成員。->
(箭頭操作符):用于訪問指針對象所指向的成員。
這兩個(gè)操作符的作用是類似的,但它們適用的對象類型不同。
二、.
的用法
點(diǎn)號操作符 .
是最簡單的成員訪問操作符,適用于普通對象。通過對象名和點(diǎn)號,我們可以直接訪問該對象的成員函數(shù)或成員變量。
示例代碼
#include <iostream> using namespace std; class Stack { public: void enstack(int value) { cout << "Value enstacked: " << value << endl; } }; int main() { Stack s; // 創(chuàng)建一個(gè)普通對象 s.enstack(1); // 通過 . 訪問成員函數(shù) return 0; }
輸出結(jié)果
Value enstacked: 1
在這里,s
是一個(gè)普通對象,s.enstack(1)
通過點(diǎn)號直接調(diào)用對象 s
的 enstack
函數(shù)。
總結(jié) 如果你創(chuàng)建的變量是一個(gè)普通對象(棧分配或靜態(tài)分配),就用 .
訪問其成員。點(diǎn)號操作符只能用于非指針對象。
三、->
的用法
箭頭操作符 ->
用于指針對象。它的作用是隱式解引用指針,訪問指針?biāo)笇ο蟮某蓡T。
示例代碼
#include <iostream> using namespace std; class Stack { public: void enstack(int value) { cout << "Value enstacked: " << value << endl; } }; int main() { Stack *s = new Stack(); // 創(chuàng)建一個(gè)指針對象 s->enstack(1); // 通過 -> 訪問成員函數(shù) delete s; // 釋放動態(tài)分配的內(nèi)存 return 0; }
輸出結(jié)果
Value enstacked: 1
在這里,s
是一個(gè)指向 Stack
對象的指針,s->enstack(1)
隱式解引用該指針并訪問其成員函數(shù) enstack
。
總結(jié)
- 如果你使用的是指針對象,用
->
訪問其成員。 - 箭頭操作符相當(dāng)于
(*pointer).member
的簡寫。
四、.
和 ->
的等價(jià)關(guān)系
->
實(shí)際上是 (*pointer).member
的簡寫。這一點(diǎn)可以通過以下代碼理解:
示例代碼
#include <iostream> using namespace std; class Stack { public: void enstack(int value) { cout << "Value enstacked: " << value << endl; } }; int main() { Stack *s = new Stack(); // 使用 -> 操作符 s->enstack(1); // 等價(jià)于使用解引用和點(diǎn)號 (*s).enstack(1); delete s; // 釋放內(nèi)存 return 0; }
輸出結(jié)果
Value enstacked: 1
Value enstacked: 1
通過這段代碼可以看出,s->enstack(1)
和 (*s).enstack(1)
是完全等價(jià)的。
為什么有 ->
?
如果沒有 ->
,我們每次都需要先解引用指針再用點(diǎn)號訪問成員,寫起來會顯得冗長。例如:
(*pointer).memberFunction();
而 ->
直接簡化了這一過程,代碼更簡潔:
pointer->memberFunction();
五、如何判斷用哪個(gè)操作符?
檢查變量類型:
- 如果是普通對象,使用
.
。 - 如果是指針對象,使用
->
。
錯誤提示:
如果你試圖對指針對象使用 .
,或者對普通對象使用 ->
,編譯器會報(bào)錯:
- “
type
does not have member…”(類型錯誤)。 - 或者“invalid use of member…” 示例代碼
以下是常見錯誤示例:
Stack *s = new Stack(); // 錯誤:指針不能直接用點(diǎn)號訪問 s.enstack(1); // 正確:使用箭頭操作符 s->enstack(1);
六、實(shí)戰(zhàn)對比示例
以下是一個(gè)綜合示例,展示如何在不同情況下使用 .
和 ->
:
示例代碼
#include <iostream> using namespace std; class Stack { public: void enstack(int value) { cout << "Value enstacked: " << value << endl; } }; int main() { // 普通對象 Stack obj; obj.enstack(10); // 指針對象 Stack *ptr = new Stack(); ptr->enstack(20); delete ptr; // 釋放內(nèi)存 return 0; }
輸出結(jié)果
Value enstacked: 10
Value enstacked: 20
七、注意事項(xiàng)
指針初始化:
- 使用
->
前,確保指針已初始化,并指向有效對象,否則會導(dǎo)致未定義行為。
內(nèi)存管理:
- 對于動態(tài)分配的對象,記得使用
delete
釋放內(nèi)存,否則會造成內(nèi)存泄漏。
智能指針:
- 在現(xiàn)代 C++ 中,推薦使用智能指針(如
std::shared_ptr
或std::unique_ptr
)來管理指針,減少手動管理內(nèi)存的風(fēng)險(xiǎn)。
八、總結(jié)
- 點(diǎn)號操作符
.
用于普通對象。 - 箭頭操作符
->
用于指針對象,并隱式完成了解引用操作。 - 它們之間有明確的使用場景,并可以通過解引用實(shí)現(xiàn)等價(jià)轉(zhuǎn)換。
了解這些基本概念后,可以避免在訪問對象成員時(shí)犯錯。
到此這篇關(guān)于C++ 指針和對象成員訪問的區(qū)別:`.` 與 `->` 的使用小結(jié)的文章就介紹到這了,更多相關(guān)C++ 指針和對象成員訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT中窗口關(guān)閉自動銷毀的實(shí)現(xiàn)示例
這篇文章主要介紹了QT中窗口關(guān)閉自動銷毀,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式代碼示例
數(shù)組元素和數(shù)組名都可以作為函數(shù)的參數(shù)以實(shí)現(xiàn)函數(shù)間數(shù)據(jù)的傳遞和共享,下面這篇文章主要給大家介紹了關(guān)于C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06C語言實(shí)現(xiàn)文件內(nèi)容按行隨機(jī)排列的算法示例
這篇文章主要介紹了C語言實(shí)現(xiàn)文件內(nèi)容按行隨機(jī)排列的算法,涉及C語言字符串、數(shù)組遍歷與隨機(jī)數(shù)相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09C++ 將字符串值賦給CHAR數(shù)組的實(shí)現(xiàn)
這篇文章主要介紹了C++ 將字符串值賦給CHAR數(shù)組的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01C語言結(jié)構(gòu)體(struct)常見使用方法(細(xì)節(jié)問題)
這篇文章主要介紹了C語言結(jié)構(gòu)體(struct)常見使用方法(細(xì)節(jié)問題),需要的朋友可以參考下2017-03-03