看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
kkroy:很謝謝你! 11/23 21:21
loveme00835:第二點... 11/23 21:46
loveflames:樓上想說compiler可以做掉,不用多跑一次? 11/23 21:54
loveme00835:HasPtr Obj2=HasPtr(XXX); 這邊要看情形, string 那邊 11/23 21:57
loveme00835:是直接當建構子參數去呼叫 11/23 21:57
loveme00835: 沒有暫時物件 11/23 22:22
loveflames:那是標準允許省掉這步驟吧, C++ Primer 477頁也這樣講 11/23 22:27
※ 編輯: loveflames 來自: 111.252.70.123 (11/23 22:29)
loveflames:說可以跳過copy ctor直接建物件,但並非一定得跳過 11/23 22:30
loveme00835:看了規格書, 12.6.1 只有example有講到, 但沒明文規定 11/23 22:39
#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也會不過,這就不知道原因為何了
loveme00835:VC++ 是會過的, gcc 不會 11/23 23:15
johnhmj:Rule of three:http://0rz.tw/YUrIh(英文維基) 11/24 04:51
johnhmj:它的中文維基還有原始碼範例。 11/24 04:54
這樣不知有沒有解釋錯 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)
johnhmj:所以你最好是給它定義(假如有用到的話…)。 11/24 13:55