[問題] ctor 和 cp assignment問題

看板C_and_CPP作者 (我好弱 又不認真)時間13年前 (2013/01/25 01:59), 編輯推噓0(0036)
留言36則, 4人參與, 最新討論串1/1
請問一下 現在有一個Class A 如果我宣告 A a; 這樣會call一次constructor 那 A a = A(); 這樣 為什麼不是 = 前半 call一次 constructor = 後半 再call 一次 constructor 最後再 call copy assignment呢...? 實際上這樣寫只會call 一次 constructor 而已 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.162.48.249

01/25 02:24, , 1F
T t1 = t2; // means implict copy construct
01/25 02:24, 1F

01/25 02:24, , 2F
same as T t1( t2 );
01/25 02:24, 2F

01/25 02:40, , 3F
可是 T t1 = T() 他會call ctor 而不是 cp ctor @@
01/25 02:40, 3F

01/25 02:41, , 4F
因為一個是 initialization 另一個是 assignment
01/25 02:41, 4F

01/25 02:42, , 5F
簡單來說 ctor 是一個讓你轉型的途徑, 定義的時候 =
01/25 02:42, 5F

01/25 02:42, , 6F
所以初始化的時候這樣寫和 T a; 或 T a();一樣嗎@@
01/25 02:42, 6F

01/25 02:43, , 7F
一個值, compiler 就會去尋找合適的 ctor 來轉
01/25 02:43, 7F

01/25 02:43, , 8F
恩恩... 所以如果後面也是在初始物件 他就直接用ctor囉
01/25 02:43, 8F

01/25 02:44, , 9F
如果事件已經存在 他才用cp ctor@@?
01/25 02:44, 9F

01/25 02:44, , 10F
呼叫default ctor =不寫小括號, 你 T a(); 是宣告函式
01/25 02:44, 10F

01/25 02:45, , 11F
QQ... new的時候才要加...
01/25 02:45, 11F

01/25 02:45, , 12F
或者是說 有帶值進去初始化 要加吧@@?
01/25 02:45, 12F

01/25 02:46, , 13F
物件初始化完成後看到的 = 全部都是 assignment
01/25 02:46, 13F

01/25 02:46, , 14F
那如果 = 後面接的是 function的回傳值 而回傳值是call
01/25 02:46, 14F

01/25 02:47, , 15F
return ctor的結果呢?
01/25 02:47, 15F

01/25 02:47, , 16F
new 的時候不用加, 你這個例子的 T() 是建立一個暫時
01/25 02:47, 16F

01/25 02:48, , 17F
物件, 之後回傳的東西, 還是看你物件初始化提供了哪些
01/25 02:48, 17F

01/25 02:48, , 18F
ctor 來轉型
01/25 02:48, 18F

01/25 02:49, , 19F
他回傳的時候 物件已經存在了 那為什麼 = 的時候 不用
01/25 02:49, 19F

01/25 02:50, , 20F
cp ctor呢 如果 = 後面是接一個 function call 它回傳
01/25 02:50, 20F

01/25 02:50, , 21F
ctor的結果的話
01/25 02:50, 21F

01/25 02:52, , 22F
我class裡面有寫 ctor, cp ctor, cp = 可是這樣寫還是
01/25 02:52, 22F

01/25 02:52, , 23F
只會call ctor
01/25 02:52, 23F

01/25 02:55, , 24F

01/25 08:24, , 25F
A a(); 寫成這樣就比較好理解了吧!
01/25 08:24, 25F

01/25 08:24, , 26F
int i=5; 也可寫成 int i(5);
01/25 08:24, 26F

01/25 10:47, , 27F
上面推文講過了 A a(); 這種形式是宣告一個函式
01/25 10:47, 27F

01/25 23:22, , 28F
謝謝回答 ! 另外問一下 A a();這樣宣告之後可以怎樣用?
01/25 23:22, 28F

01/26 01:33, , 29F
就宣告函式 a() 阿, 你可以呼叫 a()
01/26 01:33, 29F

01/26 01:41, , 30F
如果是在其他function裡面 這就只能宣告不能定義吧@@?
01/26 01:41, 30F

01/26 01:42, , 31F
試著寫過 只能宣告compile會過 還沒成功定義過...
01/26 01:42, 31F

01/26 01:42, , 32F
是說在其他function scope裡面@@
01/26 01:42, 32F

01/26 01:43, , 33F
要寫在global 或是class裡面才能定義嗎?
01/26 01:43, 33F

01/26 01:56, , 34F
當然, 這是語法的限制, 你要達成'定義'的效果可以用
01/26 01:56, 34F

01/26 01:57, , 35F
lambda expr
01/26 01:57, 35F

01/26 02:03, , 36F
恩恩 謝謝板主^^
01/26 02:03, 36F
文章代碼(AID): #1H0NPid6 (C_and_CPP)