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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # **對象的復制** ## **特殊函數** * 拷貝賦值操作 * 拷貝構造函數 # **拷貝構造函數** ## **定義方式** * 類名(類名& 對象) * 類名(const 類名& 對象) //防止在后續操作中改變原對象的值 ## **特點** * 有一個及以上的形參 * 第一個形參類型為 類名& * 不能指定返回類型 * 若用戶沒有定義,則編譯器會自己生成一個 X::X(const X&)的**缺省的拷貝構造函數,**作用為一一照賦 ## **調用時機** * 用一個已經存在的對象去初始化另一個正在被創建的對象時; 用new操作符帶對象參數創建對象時; * 對象作函數參數傳遞時; * 對象作函數的返回值時. ~~~ //1 Student st("tony"); student st1 = st; ? Student s1("Jenny"); Student *p=new Student(s1); ? //2 Student st; fn(st); ~~~ ## **例子** ~~~ #include <iostream> using namespace std; ? class Student { private: ? int id; ? public: ? Student(int a):id(a){ ? ? ? ? ? ? ? cout<<"調用普通構造函數--id:"<<id<<endl; ? } ? ? ~Student(){ ? ? ? cout<<"調用析構函數"<<endl; ? } ? ? Student(Student& s){ ? ? ? cout<<"調用拷貝函數--拷貝id:"<<s.id<<endl; ? ? ? ? ? } }; ? int main() { ? Student stu(123); ? Student sstu1(stu); ? ? return 0; } ~~~ ~~~ //結果 id:123 拷貝id:123 析構 析構 ~~~ # **默認拷貝構造函數** ## **特點** 如果數據成員的值是在動態分配空間,拷貝時只是將該數據成員的地址,與拷貝的對象之間建立聯系,并不會重新分配空間,在調用析構函數時,可能會出錯。 ## **深拷貝** 復制對象的時候重新創建空間。 * **優點** 簡單,每個對象擁有獨立的空間。 * **缺點** 內存開銷較大,速度慢。(時間復雜度和空間復雜度高,為線性級) * **適用** 存儲較少數據的容器。 ## **淺拷貝法** 設置一個數據成員 `power` ,對象復制的時候,將運算符右邊的對象的 `power` 設置為 `false`。析構的時候,若 `power` 為 `false` 則不刪除動態空間。 * **優點** 內存開銷小。(時間復雜度和空間復雜度低,為常數級) * **缺點** 不同對象之間占用同一片內存區域,修改那一塊區域的值,所有對象獲得的數據都會改變。 * **適用** 存儲較多數據的容器。 # 對象的賦值 ## 拷貝賦值操作 缺省的拷貝賦值操作聲明 ~~~ X& operator = (const X& p); // 加上& 是為了和拷貝構造函數區分 ~~~ ## 特點 * 拷貝構造函數時在聲明時賦值 * 拷貝賦值操作是在聲明之后,在賦值 * 默認拷貝賦值操作是淺拷貝 * 聲明類時,如果沒有聲明拷貝賦值操作,編譯器會自動生成默認拷貝賦值操作 ## 例子 ~~~ #include <iostream> using namespace std; ? class Box { public: ? Box(int=10,int=10,int=10); ? ? ? //聲明有默認參數的構造函數 ? ? ? int volume( ); ? private: ? int height; ? ? ? int width; ? ? ? int length; }; ? Box∷Box(int h,int w,int len) { height=h; ? width=w; ? length=len; } ? int Box∷volume( ) { return(height*width*length); ? ? //返回體積 } ? int main( ) { Box box1(15,30,25),box2; ? ? ? ? ? ? ? ? ? ? ? //定義兩個對象box1和box2 ? cout<<″The volume of box1 is ″ ? <<box1.volume( )<<endl; ? box2=box1; ? ? ? ? ? //將box1的值賦給box2 ? cout<<″The volume of box2 is ″ ? <<box2.volume( )<<endl; ? return 0; } ~~~ ~~~ 結果: The volume of box1 is 11250 The volume of box2 is 11250 ~~~
                  <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>

                              哎呀哎呀视频在线观看