C++中类的6个默认成员函数
生活随笔
收集整理的這篇文章主要介紹了
C++中类的6个默认成员函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
類的6個默認成員函數
文章目錄
- 類的6個默認成員函數
- 一、構造函數
- 二、析構函數
- 三、拷貝構造函數
- 四、運算符重載
- 五、取地址操作符重載和const修飾的去地址操作符重載
一、構造函數
- 構造函數:是一個特殊的成員函數,名字與類名相同,創建對象時由編譯器自動調用,保證每個成員函數都有一個初值,
- 注意,構造函數只是給類成員賦了一個初值,并不能稱為給類成員進行初始化,因為初始化只能有一次,而構造函數可以進行多次賦值,并且在對象生命周期內只調用一次,沒有返回值。
- 初始化列表:是初始化類中每個變量,如果類成員包含引用類型成員變量、const成員變量、類類型成員變量(改類沒有默認構造函數)則這些成員變量必須放在初始化列表位置進行初始化,另外,每個成員變量只能在初始化列表出現一次。
注意:
- 函數名必須和類名相同;
- 無返回值;
- 構造函數可以重載;
- 構造函數的作用是初始化對象,并不是開空間創建對象;
- 如果類中沒有顯式定義構造函數,編譯器會自動生成一個默認無參數的構造函數,一旦用戶顯式定義,編譯器就不再生成;
- 無參數的構造函數和全缺省的構造函數都稱為默認的構造函數,并且默認的構造函數只能有一個,(我們沒有顯式定義構造函數,編譯器默認生成的構造函數,都可以認為是默認成員函數)
二、析構函數
- 析構函數:與構造函數功能相反,注意析構函數不是完成對象的銷毀,局部對象的銷毀是由編譯器完成的,而對象在銷毀前,會自動調用析構函數,完成一些對象的資源清理工作。
注意:
- 構造函數名是在類名前加~符號;
- 無參數無返回值,就沒有函數重載;
- 一個類有且只有一個析構函數,若未顯式定義,編譯器會默認生成一個;
- 在對象生命周期結束時,編譯器系統自動調用析構函數
三、拷貝構造函數
- 拷貝構造函數:用已存在類類型對象創建新對象時由編譯器自動調用,只有單個類類型引的型參,且一般用const修飾。(注意深淺拷貝問題,會在后面解決)
注意:
- 拷貝構造函數是構造函數的重載形式;
- 參數必須使用引用傳參,使用按值傳參,會引發無窮遞歸調用進行創建臨時對象;
- 最最重要的是:如果未顯示定義拷貝構造函數,系統會默認生成按值傳參的拷貝構造函數,即淺拷貝或值拷貝
四、運算符重載
- 運算符重載:是為了加強代碼的可讀性而引入的,運算符重載是具有特殊函數名的函數,有參數有返回值;
- 對于賦值運算符重載問題:一個類中一旦涉及資源管理問題,用戶必須顯式定義賦值運算符重載(注意深淺拷貝問題)。函數原型為:返回值類型 operator 要重載的操作符 (參數)
注意:
- 不能通過鏈接其他符號來創建新的操作符,如operator@;
- 重載操作符必須有一個類類型的或枚舉類型的操作數;
- 并且不能隨意更改內置類型的操作符的含義;
- 作為類成員的重載函數時,形參看起來比操作數數目少一個,其實是有一個默認的形參this作為第一個參數;
- 最最最最最重要的是".*"、"sizeof"、"?:"、"."、"::"五個運算符不能重載
- 還有注意前置++(不帶參數)、后置++(帶一個參數)和=運算符的重載
五、取地址操作符重載和const修飾的去地址操作符重載
- 取地址操作符重載和const修飾的取地址操作符重載:一般不用重新定義,編譯器會默認生成
簡單歸納:
| 構造函數 | 無返回值 | 有參和無參兩種 | 初始化對象 |
| 析構函數 | 無返回值 | 無參數 | 對象生命周期結束時,在對象刪除前做清理工作 |
| 拷貝構造函數 | 無返回值 | 引用類型的參數 | 用已存在的對象創建新的對像 |
| 運算符重載 | 不定 | 至少有一個 | 方便C++中的操作 |
還有兩個默認成員函數一般不用重新定義(取地址操作符重載和const修飾的去地址操作符重載)
注意:
- 1:const對象可以調用其他的const成員函數,而不能調用非const成員函數。
- 2.非const對象既可以調用const成員函數也可以調用非const成員函數。
- 3.const成員函數可以調用其他的const成員函數,而不能調用非const成員函數。
- 4.非const成員函數既可以調用其他的const成員函數,也可以調用非const成員函數。
總結
以上是生活随笔為你收集整理的C++中类的6个默认成员函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高精度加法(非负)和大数阶乘及和汽水问题
- 下一篇: 字符函数和内存函数模拟实现