c 基礎 拷貝初始化和直接初始化的誤區

2021-07-29 11:29:23 字數 785 閱讀 4777

本文參照csdn部落格

首先大多數人卻認為,直接初始化是構造物件時要呼叫複製建構函式,而複製初始化是構造物件時要呼叫賦值操作函式(operator=),其實這是一大誤解。

實際上是編譯器編譯時對程式進行優化而產生的誤解。

我們直接看**:

#include 

#include

using

namespace

std;

class classtest

classtest(const

char *pc)

; int main()

如此編譯執行的結果是

而把**中的第24行取消注釋 得出的結果:

卻是編譯錯誤

個中原因可以參照我的總結進行推想,詳細可見上面**

總結:

①含有「=」的執行分為兩步:先生成乙個物件(可能為臨時物件),再把物件複製。

②系統會進行**優化:因為系統預設生成:複製建構函式classtest(const classtest& ct) 且 原來為public,就把兩步變成一步,直接優化成沒有「=」的

③所以把複製建構函式classtest(const classtest& ct)變成private系統就不會進行優化了,因為你拒絕了系統的優化。

④整個過程都沒有用到賦值操作函式operator=(這個顯而易見)

直接初始化和拷貝初始化

定義 示例 string dots 10,直接初始化 string s dots 直接初始化 string s2 dots 拷貝初始化 string null book 9 999 99999 9 拷貝初始化 string nines string 100,9 拷貝初始化注 直接初始化實際上是要求編...

c 直接初始化與拷貝初始化

我們常見的幾種初始化的形式 string str1 first 拷貝初始化,編譯器允許把這句話改寫為string str first 但是string類必須有public的拷貝 移動 建構函式 string str2 10,a 直接初始化 string str3 str2 直接初始化 string ...

直接初始化與拷貝 複製 初始化

認識這兩種初始化有助於我們加深對語言的理解,可以更好的優化 我們常見的幾種初始化的形式 string str1 first 拷貝初始化,編譯器允許把這句話改寫為string str first 但是string 類必須有 public 的拷貝 移動 建構函式 string str2 10,a 直接初...