C++ Primer 5th笔记(chap 13 拷贝控制)拷贝构造函数
1. 拷貝構造函數
如果一個構造函數的第一個參數是自身類類型的引用,且任何額外參數都有默認值,則此構造函數是拷貝構造函數。
class Foo{ public:Foo();//默認構造函數 (僅在程序員沒有定義構造函數的情況下)Foo(const Foo&);//拷貝構造函數 };注:拷貝構造函數通常不應該是explicit的, 否則不能用于拷貝形式初始化
Sales_data item1(null_book); // 正確:直接初始化 Sales_data item2 = null_book; //錯誤:不能將explicit的構造函數用于拷貝形式初始化過程2、合成拷貝構造函數synthesized copy constructor
如果我們沒有給一個類定義拷貝構造函數,則編譯器會定義一個拷貝構造函數。
2.1 定義
編譯器將其參數的成員逐個拷貝到正在創建的對象中,編譯器從給定對象中依次將每個非static成員拷貝到正在創建的對象中。
- 類類型成員:使用它的拷貝構造函數來拷貝
- 內置類型:直接拷貝
- 數組類型:逐元素拷貝
2.2 如果使用的初始化值要求通過一個 explicit 的構造函數來進行類型轉換
vector<int> v1(10); //正確,直接初始化 vector<int> v2 = 10; //錯誤,接受大小參數的構造函數是explicit 的 void f(vector<int>); //f的參數進行拷貝初始化 f(10); //錯誤,不能使用一個explicit的構造函數拷貝一個實參 f(vector<int>10); //正確,從一個int值直接構造一個臨時的vector3、拷貝初始化
  3.1 定義
. 使用指定構造函數創建一個臨時對象
 . 復制構造函數將那個臨時對象復制到正在創建的對象。
3.2 兩種初始化
直接初始化: 直接調用與實參匹配的構造函數
 拷貝初始化:總是調用復制構造函數
3.3 注意
. 如果一個類有一個移動構造函數,則拷貝初始化有時會使用移動構造函數而非拷貝構造函數。
 . 當復制構造函數被聲明為私有時,所有的復制初始化都不能使用。
3.4 拷貝初始化的其他情形:
不僅僅在使用= 定義變量時發生拷貝初始化,如下情況也會發生拷貝初始化:
- 將一個對象作為實參傳遞給一個非引用類型的形參。
- 從一個返回類型為非引用類型的函數返回對象。
- 用花括號列表初始化一個數組中的元素或者一個聚合類中的成員。
- 某些類類型還會對它們所分配的對象使用拷貝初始化,當初始化標準庫容器時,調用其 insert 或 push 成員,容器會對其元素進行拷貝初始化,與之相對,用 emplace 創建的成員執行直接初始化。
4. 編譯器可以繞過拷貝構造函數
在拷貝初始化的過程中,編譯器可以(但不是必須)跳過拷貝/移動構造函數,直接創建對象。
 eg.
- 前提條件:拷貝/移動構造函數必須是存在并且可訪問的
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 13 拷贝控制)拷贝构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha
