C++?指針和對象成員訪問的區(qū)別:`.`?與?`->`?的使用小結
在學習 C++ 時,常常會遇到訪問對象成員的兩種符號:. 和 ->。這兩個符號看似簡單,但它們的正確使用卻需要理解指針和對象的本質差異。對于 C/C++ 小白來說,這篇文章將詳細解釋它們的區(qū)別,幫助你在編程時少踩坑。
一、. 與 -> 的基本概念
在 C++ 中,. 和 -> 是用來訪問類(或結構體)成員的操作符。它們的使用場景有所不同:
.(點號操作符):用于訪問非指針對象的成員。->(箭頭操作符):用于訪問指針對象所指向的成員。
這兩個操作符的作用是類似的,但它們適用的對象類型不同。
二、. 的用法
點號操作符 . 是最簡單的成員訪問操作符,適用于普通對象。通過對象名和點號,我們可以直接訪問該對象的成員函數或成員變量。
示例代碼
#include <iostream>
using namespace std;
class Stack {
public:
void enstack(int value) {
cout << "Value enstacked: " << value << endl;
}
};
int main() {
Stack s; // 創(chuàng)建一個普通對象
s.enstack(1); // 通過 . 訪問成員函數
return 0;
}輸出結果
Value enstacked: 1
在這里,s 是一個普通對象,s.enstack(1) 通過點號直接調用對象 s 的 enstack 函數。
總結 如果你創(chuàng)建的變量是一個普通對象(棧分配或靜態(tài)分配),就用 . 訪問其成員。點號操作符只能用于非指針對象。
三、-> 的用法
箭頭操作符 -> 用于指針對象。它的作用是隱式解引用指針,訪問指針所指對象的成員。
示例代碼
#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)建一個指針對象
s->enstack(1); // 通過 -> 訪問成員函數
delete s; // 釋放動態(tài)分配的內存
return 0;
}輸出結果
Value enstacked: 1
在這里,s 是一個指向 Stack 對象的指針,s->enstack(1) 隱式解引用該指針并訪問其成員函數 enstack。
總結
- 如果你使用的是指針對象,用
->訪問其成員。 - 箭頭操作符相當于
(*pointer).member的簡寫。
四、. 和 -> 的等價關系
-> 實際上是 (*pointer).member 的簡寫。這一點可以通過以下代碼理解:
示例代碼
#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);
// 等價于使用解引用和點號
(*s).enstack(1);
delete s; // 釋放內存
return 0;
}輸出結果
Value enstacked: 1
Value enstacked: 1
通過這段代碼可以看出,s->enstack(1) 和 (*s).enstack(1) 是完全等價的。
為什么有 ->?
如果沒有 ->,我們每次都需要先解引用指針再用點號訪問成員,寫起來會顯得冗長。例如:
(*pointer).memberFunction();
而 -> 直接簡化了這一過程,代碼更簡潔:
pointer->memberFunction();
五、如何判斷用哪個操作符?
檢查變量類型:
- 如果是普通對象,使用
.。 - 如果是指針對象,使用
->。
錯誤提示:
如果你試圖對指針對象使用 .,或者對普通對象使用 ->,編譯器會報錯:
- “
typedoes not have member…”(類型錯誤)。 - 或者“invalid use of member…” 示例代碼
以下是常見錯誤示例:
Stack *s = new Stack(); // 錯誤:指針不能直接用點號訪問 s.enstack(1); // 正確:使用箭頭操作符 s->enstack(1);
六、實戰(zhàn)對比示例
以下是一個綜合示例,展示如何在不同情況下使用 . 和 ->:
示例代碼
#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; // 釋放內存
return 0;
}輸出結果
Value enstacked: 10
Value enstacked: 20
七、注意事項
指針初始化:
- 使用
->前,確保指針已初始化,并指向有效對象,否則會導致未定義行為。
內存管理:
- 對于動態(tài)分配的對象,記得使用
delete釋放內存,否則會造成內存泄漏。
智能指針:
- 在現代 C++ 中,推薦使用智能指針(如
std::shared_ptr或std::unique_ptr)來管理指針,減少手動管理內存的風險。
八、總結
- 點號操作符
.用于普通對象。 - 箭頭操作符
->用于指針對象,并隱式完成了解引用操作。 - 它們之間有明確的使用場景,并可以通過解引用實現等價轉換。
了解這些基本概念后,可以避免在訪問對象成員時犯錯。
到此這篇關于C++ 指針和對象成員訪問的區(qū)別:`.` 與 `->` 的使用小結的文章就介紹到這了,更多相關C++ 指針和對象成員訪問內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言結構體(struct)常見使用方法(細節(jié)問題)
這篇文章主要介紹了C語言結構體(struct)常見使用方法(細節(jié)問題),需要的朋友可以參考下2017-03-03

