C++ 实例化对象的不同方法的优缺点是什么?

C++ 实例化对象的不同方法的优缺点是什么?,c++,class,initialization,instantiation,C++,Class,Initialization,Instantiation,初始化对象有几种方法,例如复制赋值、复制初始化、直接初始化等。下面的代码段显示了其中的一些方法(不确定是否包括所有可能的方法) class A{ A(int) { } // converting constructor A(int, int) { } // converting constructor (C++11) operator bool() const { return true; } }; class B{ explicit B(int) {

初始化对象有几种方法,例如复制赋值、复制初始化、直接初始化等。下面的代码段显示了其中的一些方法(不确定是否包括所有可能的方法)

class A{
    A(int) { }      // converting constructor
    A(int, int) { } // converting constructor (C++11)
    operator bool() const { return true; }
};

class B{
    explicit B(int) { }
    explicit B(int, int) { }
    explicit operator bool() const { return true; }
};

int main(){
    A a1 = 1;      // OK: copy-initialization selects A::A(int)
    A a2(2);       // OK: direct-initialization selects A::A(int)
    A a3 {4, 5};   // OK: direct-list-initialization selects A::A(int, int)
    A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int)
    A a5 = (A)1;   // OK: explicit cast performs static_cast
    if (a1) ;      // OK: A::operator bool()
    bool na1 = a1; // OK: copy-initialization selects A::operator bool()
    bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization

    B b1 = 1;      // error: copy-initialization does not consider B::B(int)
    B b2(2);       // OK: direct-initialization selects B::B(int)
    B b3 {4, 5};   // OK: direct-list-initialization selects B::B(int, int)
    B b4 = {4, 5}; // error: copy-list-initialization does not consider B::B(int,int)
    B b5 = (B)1;   // OK: explicit cast performs static_cast
    if (b2) ;      // OK: B::operator bool()
    bool nb1 = b2; // error: copy-initialization does not consider B::operator bool()
    bool nb2 = static_cast<bool>(b2); // OK: static_cast performs direct-initialization
}
A类{
一个(int){}//转换构造函数
(int,int){}//转换构造函数(C++11)
运算符bool()常量{return true;}
};
B类{
显式B(int){}
显式B(int,int){}
显式运算符bool()常量{return true;}
};
int main(){
a1=1;//确定:复制初始化选择A::A(int)
a2(2);//确定:直接初始化选择A::A(int)
a3{4,5};//确定:直接列表初始化选择A::A(int,int)
a4={4,5};//确定:复制列表初始化选择A::A(int,int)
a5=(A)1;//确定:显式转换执行静态\u转换
if(a1);//确定:A::运算符bool()
bool na1=a1;//确定:复制初始化选择一个::运算符bool()
bool na2=static_cast(a1);//确定:static_cast执行直接初始化
B1=1;//Orror:复制初始化不考虑b::b(int)
b2(2);//确定:直接初始化选择B::B(int)
b3{4,5};//确定:直接列表初始化选择B::B(int,int)
B B4= { 4, 5 };//Orror:复制列表初始化不考虑b::b(int,int)
b5=(B)1;//确定:显式转换执行静态\u转换
if(b2);//确定:B::运算符bool()
BOOL NB1= B2;//Rebug:复制初始化不考虑B:操作符BooL()
bool nb2=static_cast(b2);//确定:static_cast执行直接初始化
}

你能简单解释一下(可能包括一些低级的澄清)它们各自的作用吗?我的问题来自明确的说明符,显然它限制了副本初始化…但我们为什么要这样做?…然后我开始问自己实例化的不同方式。谢谢!

“实例化”在C++中,只需使用“初始化”或“创建对象”。在这种情况下。您似乎已经非常了解这些功能。实际问题主要是关于程序员为什么希望使用
explicit
关键字吗?复制分配不会初始化对象。它依赖于已初始化的对象(由构造函数初始化),因此它处于有效状态,并且(可能)圣战的圣战,圣战的“圣战”,现在我们可以有一个新的圣战。C++中的“实例化”与模板有关,只要坚持“初始化”或可能。“创建一个对象”在这个上下文中。你似乎已经非常了解这些功能了。实际问题主要是关于程序员为什么想要
explicit
关键字?复制赋值不初始化对象。它依赖于已经初始化的对象(由构造函数初始化),因此它处于有效状态,并且(可能)会改变这种状态。好处是,有十几种方法初始化一个对象可以给每个人带来灵活性。它可以分散人们对空格-v-tabs圣战和“花括号到哪里去?”圣战的注意力。现在我们可以有一个新的圣战了。