<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 一.概述 1. **為什么要有引用** + 指針不夠安全,當指針指向了一個非法的地址,訪問指針會出現未定義的行為。 2. **概念** 引用是個別名,當建立引用時,程序用另一個變量或對象(目標)的名字初始化它。 + 引用不占存儲空間。 + 引用只有聲明,沒有定義,而且只能聲明一次。 + 聲明引用時必須初始化。 >[danger]賦值不是建立新的引用,而是修改被引用對象的值。 ```c++ int a = 2020; int &b = a;//聲明一個左值引用 const int &c = 2020; //ok b = 2021;//對引用賦值(直接修改a值,而不是建立一個新的引用) cout<<a;//2021 ``` ## [11+]二.引用的類型(新版) 1. **左值引用** 只能引用左值 + 聲明 `const 類型名 &標識符` + **左值引用不可引用右值** 若引用一個右值,則程序會嘗試去創建一個臨時變量,其作用域到語句末尾。由于它的作用域比引用的作用域短,編譯器會報錯。 + 對于類類型、對象,當形參為 `T&` ,而傳入的對象類型 `T1` 必須是 `T` 或者 `T` 的派生類。需要注意的是, **這不會進行 `T1`到 `T` 的類型轉換** 。 >[warning] 以下代碼只能在 VC++6.0下運行,其他編譯器下運行會報錯。 ```c++ #include <iostream> using std::cout; using std::ostream; class Complex { private: double real_; double imaginary_; public: Complex() : real_(0), imaginary_(0) { } Complex(double real) : real_(real), imaginary_(0) { } Complex(double real, double imaginary) : real_(real), imaginary_(imaginary) { } Complex(const Complex &old) { this->real_ = old.real_; this->imaginary_ = old.imaginary_; } Complex &operator=(const Complex &old) { this->real_ = old.real_; this->imaginary_ = old.imaginary_; return *this; } Complex &set_real(double new_val) { this->real_ = new_val; return *this; } Complex &set_imaginary(double new_val) { this->imaginary_ = new_val; return *this; } friend ostream &operator<<(ostream &os, Complex c); }; ostream &operator<<(ostream &os, Complex c) { return os << '(' << c.real_ << ',' << c.imaginary_ << ')'; } void pass_a_reference(Complex& a) {} int main() { pass_a_reference(Complex(2,3));//OK return 0; } ``` >[test-vc] >沒有輸出 2. **常量左值引用** 即可以引用左值,也可以引用右值。 + 聲明 `const 類型名 &標識符` + 無法通過引用這種方式修改被引用變量的值。 + **常量左值引用可引用右值** 若引用一個右值,則程序會嘗試去創建一個臨時變量,且會延長臨時變量的作用域,使其與引用的作用域相同。 + 常量左值引用的初始化 **允許類型轉換** 。 3. **\[11+\][$]右值引用** 只能引用右值,不可以引用左值。 + 聲明 `類型名 &&標識符` + 具名的右值引用是 **左值** ,而匿名的右值引用是 **將亡值**。 + 右值引用延長了臨時變量或字面量的作用域,使其與引用的作用域相同。 > 左值引用和右值引用中的“左值”和"右值"指的是被引用的對象,而不是它本身。 4. **\[11+\][$]通用引用** 即可以引用左值,也可以引用右值。 + 聲明 `類型名 &&標識符` + **發生時機** 編譯器進行自動類型推斷,如使用 `auto` 關鍵字或函數模板的類型自動推導。 + **引用折疊** 編譯器會自動將奇數個 `&` 轉換成 `&` ,將偶數個 `&` 轉換成 `&&` 。 ```C++ template <typename T> T my_abs(T &&i); double d = -3.14; my_abs(1);//T=int 參數i的類型為 int&& my_abs(d);//T=double& 參數i的類型為 int& ```
                  <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>

                              哎呀哎呀视频在线观看