<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 一.指向數據成員的指針 ### (一) 使用普通指針指向數據成員 1. 直接使用一個普通的指針變量接受一個數據成員的地址。 ```c++ //類的聲明 class Complex { public: double real_; double imaginary_; Complex(double real,double imaginary):real_(real),imaginary_(imaginary){} }; //定義 Complex c(1,2); double *cp = &c.real_; ``` ### \[$\](二) 使用數據成員指針指向非靜態數據成員 1. **語法** `類型 類名::*指針變量名` ```c++ class Complex { public: double real_; double imaginary_; Complex(double real, double imaginary) : real_(real), imaginary_(imaginary) {} }; //定義對象 Complex c(1, 2); //定義指針并初始化 double Complex::*dmp = &Complex::real_; //取值 cout << c.*dmp; ``` 2. **數據成員指針的值** 為數據成員所在地址相對于對象起始地址的偏移值(這個偏移值是按照數據成員聲明的順序計算的,因此對象定義前就可以取值),空指針為`-1` 。 ```c++ class Complex { public: double real_; double imaginary_; Complex(double real, double imaginary) : real_(real), imaginary_(imaginary) {} int calculate(int a) { return 0; }; }; //對象定義 Complex c(8, 2), d(3, 4); double Complex::*dmp = NULL; printf("%d\n",dmp);//-1 dmp = &Complex::real_; printf("%d\n",dmp);//0 dmp = &Complex::imaginary_; printf("%d\n",dmp);//8 ``` >[warning] 使用 `cout` 輸出時,成員指針會轉換成 `bool` ,導致輸出結果不唯一。 ## 二.指向非靜態成員函數的指針 若有以下類: ```c++ class Box { private: int width_; int height_; public: Box(int width, int height) : width_(width), height_(height) { } int calculate() { return this->width_ * this->height_; } Box &set_width(int width) { this->width_ = width; return *this; } Box &set_height(int height) { this->height_ = height; return *this; } }; ``` 1. 定義和初始化一個成員函數指針 + **語法** `函數返回值 (類名::*指針變量名)(參數表)` ```c++ //用函數名初始化 Box & (Box::*pb)(int) = &Box::set_height; //不帶 & 的寫法不是標準寫法,部分編譯器有可能報錯(如VS2019會報C3867) Box & (Box::*pb)(int) = Box::set_height; ``` 2. 通過成員函數指針調用函數 + **語法** `(類名.*指針變量名)(參數表)` ```c++ //定義對象 Box b(10, 20); //調用函數 (b.*pb)(30); //下面代碼的意思是調用一個名為ps的函數,然后使用該函數的返回值作為指針指向成員運算符(.*)的運算對象。然而ps并不是一個函數,因此代碼將發生錯誤。 b.*pb(30); ``` 3. [$] **微軟編譯器下,成員函數指針的值** + 成員函數指針是一個結構體指針,里面包含了偏移量,虛函數表索引,函數地址等數據。 + 對于非虛函數,函數地址就是函數真實的地址。其中函數的第一個參數為 `this` 指針。 + 對于虛函數,函數地址指向一小段代碼(一般被稱為 `vcall thunk`),用于從虛函數表中尋找虛函數的地址。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看