C++取類成員變數地址的問題?
先放代碼:
#include &
class C {
public:
void fn() {
std::printf("0x%X
", C::v_);
std::printf("0x%X
", (C::v_));
}
private:
int v_;
};int main() {
C c;
c.fn();
return 0;
}
運行結果:
第一句C::v_輸出的應該是v_的offset?
第二句只是加個括弧為什麼就輸出實際的內存地址了?
應該不是優先順序的問題,這個括弧到底做了什麼,標準有這種規定嗎?
T::M本身是一個語法。C::v本身也可以理解為this-&>C::v,這個跟C::v取offset又重複了,所以有這種規定是正常的。總不能在類裡面就不能拿offset了。
訪問被子類覆蓋的父類的名字,就是用Type::Member的,經常用於在虛函數裡面調用被自己覆蓋的上一代虛函數。
一個是 int C::* 型的非靜態數據成員指針,一個是普通的 int * 型指針。
(C::v_)獲得指針類型為int*,而C::v_獲得的指針類型為int C::*。參見http://en.cppreference.com/w/cpp/language/pointer中的Pointers to members一項。
一言以蔽之:
- C::v_取的是成員在類中的偏移量。
- (C::v_)取得是對象中成員變數實際的指針地址。
如果你的v_是public的,那麼 (C::v_)其含義如同 c.v_ (c是C的對象)
另外,《深度探索C++對象模型》是本好書,建議題主閱讀(可能部分內容存在過時)。
其中第三章有本問題相關話題的探討,但是有些細節錯誤,如果你嫌原文太長。題主可以直接閱讀我之前寫的兩篇勘誤:
- 拾遺與填坑《深度探索C++對象模型》3.2節
- 拾遺與填坑《深度探索C++對象模型》3.3節
不過,一碼勝千言,題主運行一下我下面的代碼,基本就可以跳過原文了……:
#include&
using namespace std;
class C {
public:
void fn() {
std::printf("%p
", C::v_);
std::printf("%p
", C::x_);
std::printf("%p
", (C::v_));
std::printf("%p
", (C::x_));
}
//private:
public:
int v_;
int x_;
};
int main() {
C c;
c.fn();
std::printf("%p
", c.v_);
std::printf("%p
", c.x_);
cout&<&<"***********"&<&
奇怪,以我的水平來看,想得到變數地址可以直接使用this.v_,或者(this-&>v_)就可以啊,還有,printf不是在std里的吧?
推薦閱讀:
※C++ 有哪些經常用到的設計模式?
※斷言、異常和返回值的選擇問題?
※生物信息學需要掌握C++嗎?
※Qt 重繪問題?
※什麼是面向對象編程?它與面向過程編程的異同有哪些?
TAG:C |