C++?指針和對(duì)象成員訪問的區(qū)別:`.`?與?`->`?的使用小結(jié)
在學(xué)習(xí) C++ 時(shí),常常會(huì)遇到訪問對(duì)象成員的兩種符號(hào):. 和 ->。這兩個(gè)符號(hào)看似簡單,但它們的正確使用卻需要理解指針和對(duì)象的本質(zhì)差異。對(duì)于 C/C++ 小白來說,這篇文章將詳細(xì)解釋它們的區(qū)別,幫助你在編程時(shí)少踩坑。
一、. 與 -> 的基本概念
在 C++ 中,. 和 -> 是用來訪問類(或結(jié)構(gòu)體)成員的操作符。它們的使用場(chǎng)景有所不同:
.(點(diǎn)號(hào)操作符):用于訪問非指針對(duì)象的成員。->(箭頭操作符):用于訪問指針對(duì)象所指向的成員。
這兩個(gè)操作符的作用是類似的,但它們適用的對(duì)象類型不同。
二、. 的用法
點(diǎn)號(hào)操作符 . 是最簡單的成員訪問操作符,適用于普通對(duì)象。通過對(duì)象名和點(diǎn)號(hào),我們可以直接訪問該對(duì)象的成員函數(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è)普通對(duì)象
s.enstack(1); // 通過 . 訪問成員函數(shù)
return 0;
}輸出結(jié)果
Value enstacked: 1
在這里,s 是一個(gè)普通對(duì)象,s.enstack(1) 通過點(diǎn)號(hào)直接調(diào)用對(duì)象 s 的 enstack 函數(shù)。
總結(jié) 如果你創(chuàng)建的變量是一個(gè)普通對(duì)象(棧分配或靜態(tài)分配),就用 . 訪問其成員。點(diǎn)號(hào)操作符只能用于非指針對(duì)象。
三、-> 的用法
箭頭操作符 -> 用于指針對(duì)象。它的作用是隱式解引用指針,訪問指針?biāo)笇?duì)象的成員。
示例代碼
#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è)指針對(duì)象
s->enstack(1); // 通過 -> 訪問成員函數(shù)
delete s; // 釋放動(dòng)態(tài)分配的內(nèi)存
return 0;
}輸出結(jié)果
Value enstacked: 1
在這里,s 是一個(gè)指向 Stack 對(duì)象的指針,s->enstack(1) 隱式解引用該指針并訪問其成員函數(shù) enstack。
總結(jié)
- 如果你使用的是指針對(duì)象,用
->訪問其成員。 - 箭頭操作符相當(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)號(hào)
(*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)號(hào)訪問成員,寫起來會(huì)顯得冗長。例如:
(*pointer).memberFunction();
而 -> 直接簡化了這一過程,代碼更簡潔:
pointer->memberFunction();
五、如何判斷用哪個(gè)操作符?
檢查變量類型:
- 如果是普通對(duì)象,使用
.。 - 如果是指針對(duì)象,使用
->。
錯(cuò)誤提示:
如果你試圖對(duì)指針對(duì)象使用 .,或者對(duì)普通對(duì)象使用 ->,編譯器會(huì)報(bào)錯(cuò):
- “
typedoes not have member…”(類型錯(cuò)誤)。 - 或者“invalid use of member…” 示例代碼
以下是常見錯(cuò)誤示例:
Stack *s = new Stack(); // 錯(cuò)誤:指針不能直接用點(diǎn)號(hào)訪問 s.enstack(1); // 正確:使用箭頭操作符 s->enstack(1);
六、實(shí)戰(zhàn)對(duì)比示例
以下是一個(gè)綜合示例,展示如何在不同情況下使用 . 和 ->:
示例代碼
#include <iostream>
using namespace std;
class Stack {
public:
void enstack(int value) {
cout << "Value enstacked: " << value << endl;
}
};
int main() {
// 普通對(duì)象
Stack obj;
obj.enstack(10);
// 指針對(duì)象
Stack *ptr = new Stack();
ptr->enstack(20);
delete ptr; // 釋放內(nèi)存
return 0;
}輸出結(jié)果
Value enstacked: 10
Value enstacked: 20
七、注意事項(xiàng)
指針初始化:
- 使用
->前,確保指針已初始化,并指向有效對(duì)象,否則會(huì)導(dǎo)致未定義行為。
內(nèi)存管理:
- 對(duì)于動(dòng)態(tài)分配的對(duì)象,記得使用
delete釋放內(nèi)存,否則會(huì)造成內(nèi)存泄漏。
智能指針:
- 在現(xiàn)代 C++ 中,推薦使用智能指針(如
std::shared_ptr或std::unique_ptr)來管理指針,減少手動(dòng)管理內(nèi)存的風(fēng)險(xiǎn)。
八、總結(jié)
- 點(diǎn)號(hào)操作符
.用于普通對(duì)象。 - 箭頭操作符
->用于指針對(duì)象,并隱式完成了解引用操作。 - 它們之間有明確的使用場(chǎng)景,并可以通過解引用實(shí)現(xiàn)等價(jià)轉(zhuǎn)換。
了解這些基本概念后,可以避免在訪問對(duì)象成員時(shí)犯錯(cuò)。
到此這篇關(guān)于C++ 指針和對(duì)象成員訪問的區(qū)別:`.` 與 `->` 的使用小結(jié)的文章就介紹到這了,更多相關(guān)C++ 指針和對(duì)象成員訪問內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中五種類型轉(zhuǎn)換的深度對(duì)比與實(shí)踐指南
本文檔旨在系統(tǒng)梳理C++中的5種類型轉(zhuǎn)換(C風(fēng)格轉(zhuǎn)換、static_cast、dynamic_cast、const_cast、reinterpret_cast),從語法、用途、安全性、適用場(chǎng)景等維度進(jìn)行全面對(duì)比,幫助開發(fā)者理解各類轉(zhuǎn)換的核心差異,規(guī)避使用風(fēng)險(xiǎn),選擇最優(yōu)轉(zhuǎn)換方案,需要的朋友可以參考下2025-11-11
二分法求多項(xiàng)式在-10 10間值的實(shí)現(xiàn)代碼
以下實(shí)例是介紹了二分法求多項(xiàng)式在-10 10間值的實(shí)現(xiàn)代碼。需要的朋友參考下2013-05-05
C語言編寫Linux守護(hù)進(jìn)程實(shí)例
這篇文章主要介紹了C語言編寫Linux守護(hù)進(jìn)程實(shí)例,本文講解了守護(hù)進(jìn)程及其特性、守護(hù)進(jìn)程的編程要點(diǎn)、守護(hù)進(jìn)程代碼實(shí)例等內(nèi)容,需要的朋友可以參考下2015-02-02
詳解C++的String類的字符串分割實(shí)現(xiàn)
這篇文章主要介紹了詳解C++的String類的字符串分割實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07
C語言實(shí)現(xiàn)獲取內(nèi)存信息并輸出的實(shí)例
這篇文章主要介紹了C語言實(shí)現(xiàn)獲取內(nèi)存信息并輸出的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
C++時(shí)區(qū)操作全版本指南(含C++03/C++11-17/C++20)
本文介紹了C++各版本對(duì)時(shí)區(qū)操作的支持,包括C++03/C++11-17/C++20,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-01-01
C++封裝遠(yuǎn)程注入類CreateRemoteThreadEx實(shí)例
這篇文章主要介紹了C++封裝遠(yuǎn)程注入類CreateRemoteThreadEx實(shí)例,詳細(xì)講述了注入DLL到指定的地址空間以及從指定的地址空間卸載DLL的方法,需要的朋友可以參考下2014-10-10

