class A
{
public:
int m;
int *p=&m;
};
A1是類A的一個物件。如果要通過指標p給變數m賦值10,相應的陳述句是_____。
這題的正確答案是 *A1.p=10;
我寫的答案是:A1.*p=10;
我想問個問題,為什么這個指標符號放在了物件名前面?這個陳述句的意思是什么?
uj5u.com熱心網友回復:
.優先級比*高uj5u.com熱心網友回復:
.* 是一個運算子它叫成員指標訪問運算子
A1.*p 在這里p是一個成員指標,而你的p是一個成員。
struct S
{
S(int n): mi(n) {}
mutable int mi;
int f(int n) { return mi + n; }
};
struct D: public S
{
D(int n): S(n) {}
};
int main()
{
int S::* pmi = &S::mi;
int (S::* pf)(int) = &S::f;
const S s(7);
// s.*pmi = 10; // 錯誤:無法通過 mutable 進行修改
std::cout << s.*pmi << '\n';
D d(7); // 基類的指標可以在派生類物件上作業
D* pd = &d;
std::cout << (d.*pf)(7) << ' '
<< (pd->*pf)(8) << '\n';
}
uj5u.com熱心網友回復:
*A1.p=10;相當于 *(A1.p)。對一個int指標型別的 p變數(這里時被先計算的A1.p的值)解參考【取得指向位置的int的空間】
------------------
A1.*p = 10;
這個相當于直接對成員變數進行解參考,一步到位
x.*y如一個雙目運算子。取x物件的y偏移上的 (預先宣告的) 資料型別的變數 解參考【起始和上面也是一樣的目的】
更具象的就是:
int(宣告該變數的型別) CLASSNAME::(宣告這是相對于CLASSNAME這個類的物件而言的(偏移)) *(宣告這是一個指標) pp;
如:
<1>int Point::* pp;
這句話有三個資訊:
1. * 意味著pp是個指標
2. Point::意味著pp是一個相對與Point類的物件的一個指標(專門用于Point物件的,在Point類的域下有意義的,其它不行。這里也可以看出這算是一個對類級別(而非具體物件)的指標)
3.int 意味著pp是一個int型別的指標(專門用于int的,其它不行)
然后指標我們要為這個指標賦值。
<2>pp = &Point::y;//點類的y軸坐標的指標,此時并未對該指標指定具體物件,只說是Point這個類。和那個多型有些神似,這兩個在概念原理上其實實一樣的,我認為。先限定基本的范圍,實際運用中可以根據具體情況靈活調整。
上面這個代碼,如果把pp理解為一個偏移,一個相對于Point類的一個偏移,一個基于Point類的攜帶了型別(int)的偏移會更直觀一些。
接著我們可以使用這個pp直接對仍和Point物件的y坐標進行操作了
如
Point A;Point B;Point C;
通過
<3>A.*pp = 10; B.*pp = 30; C.*pp = 40;如此賦值。
XXXXX.*pp代表我們要對XXXXX這個Point物件的 y的進行進行操作。這里.*作為一個運算子,對XXXXX位置的pp偏移(<1>和<2>處進行了宣告定義與賦值)作int 的解參考
uj5u.com熱心網友回復:
這個1樓的回答屬于我見識短淺,不太行。看到2樓的回復后,經過進一步學習,重新回復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165188.html
標籤:C++ 語言
