標籤:

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 |