Re: [問題] class的assignment運算子 (C++ Primer …

看板C_and_CPP (C/C++)作者 (咕啾咕啾魔法陣)時間15年前 (2010/11/23 21:15), 編輯推噓6(607)
留言13則, 4人參與, 最新討論串4/4 (看更多)
※ 引述《kkroy (☆㊣↖煞氣ㄟ阿喂↘ξ★)》之銘言: : 我整理一下大家幫我回答的結論: : 1. HasPtr Obj2 = Obj1; : 是拿Obj1初始化Obj2,所以呼叫copy ctor,等價於 HasPtr Obj2(Obj1); 其他部份不再贅述 只談copy initialization(用=初始)跟direct initialization的差異 1.如果ctor宣告explicit,就只能用direct initialization 2.HasPtr Obj2(XXX); 跟 HasPtr Obj2=HasPtr(XXX); 後者可能會建立暫時物件 用string當例子 string S("123")是直接呼叫string(const char*s) 而string S="123"可能會先用string(const char*s)產生暫時物件 再呼叫string(const string& str) 3.copy initialization只能呼叫單一引數的ctor -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.252.70.123

11/23 21:21, , 1F
很謝謝你!
11/23 21:21, 1F

11/23 21:46, , 2F
第二點...
11/23 21:46, 2F

11/23 21:54, , 3F
樓上想說compiler可以做掉,不用多跑一次?
11/23 21:54, 3F

11/23 21:57, , 4F
HasPtr Obj2=HasPtr(XXX); 這邊要看情形, string 那邊
11/23 21:57, 4F

11/23 21:57, , 5F
是直接當建構子參數去呼叫
11/23 21:57, 5F

11/23 22:22, , 6F
沒有暫時物件
11/23 22:22, 6F

11/23 22:27, , 7F
那是標準允許省掉這步驟吧, C++ Primer 477頁也這樣講
11/23 22:27, 7F
※ 編輯: loveflames 來自: 111.252.70.123 (11/23 22:29)

11/23 22:30, , 8F
說可以跳過copy ctor直接建物件,但並非一定得跳過
11/23 22:30, 8F

11/23 22:39, , 9F
看了規格書, 12.6.1 只有example有講到, 但沒明文規定
11/23 22:39, 9F
#include <iostream> using namespace std; struct aaa{ aaa(){} aaa(int n){} //private: aaa(const aaa& a){} }; int main (){ aaa s=1; } private那行註解如果拿掉 gcc會出現以下錯誤 initializing temporary from result of 'aaa::aaa(int)' 除非改成aaa s(1); 補充:gcc下將copy ctor宣告explicit也會不過,這就不知道原因為何了

11/23 23:15, , 10F
VC++ 是會過的, gcc 不會
11/23 23:15, 10F

11/24 04:51, , 11F
Rule of three:http://0rz.tw/YUrIh(英文維基)
11/24 04:51, 11F

11/24 04:54, , 12F
它的中文維基還有原始碼範例。
11/24 04:54, 12F
這樣不知有沒有解釋錯 T a=v在語意上等同T a(T(v)) (不管實際上有沒有跑copy ctor) 隱含了const T & temp=T(v)的意思 變成了copy initialization 所以才會出現error ※ 編輯: loveflames 來自: 111.252.74.51 (11/24 07:31)

11/24 13:55, , 13F
所以你最好是給它定義(假如有用到的話…)。
11/24 13:55, 13F
文章代碼(AID): #1Cwxvklg (C_and_CPP)
文章代碼(AID): #1Cwxvklg (C_and_CPP)