C++ C++;方法声明

C++ C++;方法声明,c++,C++,可能重复: 过去几天我一直在学习C++,我看到两种格式,我无法确定这两种方法的优缺点。希望有人能帮我 第一个变量使用var(value) 第二个使用赋值运算符var=value初始化 一个比另一个有优势吗?这是个人喜好吗? 第一种样式(?)看起来更让我困惑。看起来您正在调用一个方法并传入该值。看起来很含蓄;然而,第二种方法是非常显式的,作为来自Python的人,“显式优于隐式”,我更喜欢第二种方法。我错过了什么 前面的符号将在构造函数调用之前初始化成员。在初始化之前,构造函数内部不会执行任何操

可能重复:

过去几天我一直在学习C++,我看到两种格式,我无法确定这两种方法的优缺点。希望有人能帮我

第一个变量使用
var(value)

第二个使用赋值运算符
var=value
初始化

一个比另一个有优势吗?这是个人喜好吗?

第一种样式(?)看起来更让我困惑。看起来您正在调用一个方法并传入该值。看起来很含蓄;然而,第二种方法是非常显式的,作为来自Python的人,“显式优于隐式”,我更喜欢第二种方法。我错过了什么

前面的符号将在构造函数调用之前初始化成员。在初始化之前,构造函数内部不会执行任何操作。如果存在继承,则将在当前构造函数调用之前在此调用父类的构造函数


同样,构造函数的显式和隐式声明在C++中与Python不同。当构造函数只有一个参数不是类本身的类型(构造函数不是复制构造函数)时,它可以用于类型转换。当您将显式放在构造函数名称之前时,您会告诉编译器,未经我的显式许可,编译器不会转换任何内容。

前面的符号将在构造函数调用之前初始化成员。在初始化之前,构造函数内部不会执行任何操作。如果存在继承,则将在当前构造函数调用之前在此调用父类的构造函数


同样,构造函数的显式和隐式声明在C++中与Python不同。当构造函数只有一个参数不是类本身的类型(构造函数不是复制构造函数)时,它可以用于类型转换。当您将显式放在构造函数名称之前时,您会告诉编译器,未经我的显式许可,编译器不会转换任何内容。

当构造函数声明为

 Foo(): itsVar1(2), itsVar2(345){}
这意味着变量“itsVar1”和“itsVar2”在创建其局部变量成员(即itsVar和itsVar2)时初始化。这种初始化方法称为初始化列表。对于用户定义的类型,这样的初始化将调用用户定义类型的复制构造函数。更多信息,请访问:

当构造函数定义为

  Foo()
    {
        itsVar1 = 2;
        itsVar2 = 345;
    }
构造函数创建内存,不初始化成员变量itsVar1和itsVar2。 一旦创建了成员并将控件流到构造函数体中,就会为它们分配一个值


使用初始值设定项列表的优点是成员变量不会被调用两次(一次在创建期间,另一次在赋值期间)。成员变量的创建和初始化同时发生。如果初始值设定项列表中有许多变量,那么在调用构造函数时,与调用其他方法相比,您将获得轻微的性能优势。

当构造函数声明为

 Foo(): itsVar1(2), itsVar2(345){}
这意味着变量“itsVar1”和“itsVar2”在创建其局部变量成员(即itsVar和itsVar2)时初始化。这种初始化方法称为初始化列表。对于用户定义的类型,这样的初始化将调用用户定义类型的复制构造函数。更多信息,请访问:

当构造函数定义为

  Foo()
    {
        itsVar1 = 2;
        itsVar2 = 345;
    }
构造函数创建内存,不初始化成员变量itsVar1和itsVar2。 一旦创建了成员并将控件流到构造函数体中,就会为它们分配一个值


使用初始值设定项列表的优点是成员变量不会被调用两次(一次在创建期间,另一次在赋值期间)。成员变量的创建和初始化同时发生。如果您的初始值设定项列表中有许多变量,那么在调用构造函数时,您将比调用其他方法获得轻微的性能优势。

尽可能始终使用初始值设定项列表(第一种样式)。这样做的主要原因是:

  • 不使用初始值设定项列表会使异常安全性难以保证。为类成员变量使用RAII类以及初始值设定项列表,使得在遇到成员变量的构造函数引发的异常时,保证构造函数不会泄漏资源变得很简单

  • 赋值的性能并不比初始值设定项列表好。如果成员变量类型是非平凡的,那么赋值实际上会执行得更差。使用初始值设定项,成员变量将就地构造,并且不会发生默认构造。使用赋值可以使所有成员变量首先成为默认的构造变量

  • 初始值设定项列表是为引用和常量成员变量赋值的唯一方法


  • 尽可能使用初始值设定项列表(第一种样式)。这样做的主要原因是:

  • 不使用初始值设定项列表会使异常安全性难以保证。为类成员变量使用RAII类以及初始值设定项列表,使得在遇到成员变量的构造函数引发的异常时,保证构造函数不会泄漏资源变得很简单

  • 赋值的性能并不比初始值设定项列表好。如果成员变量类型是非平凡的,那么赋值实际上会执行得更差。使用初始值设定项,成员变量将就地构造,并且不会发生默认构造。使用赋值可以使所有成员变量