【问题标题】:C++ method declaration [duplicate]C ++方法声明[重复]
【发布时间】:2012-06-06 23:22:20
【问题描述】:

可能重复:
Benefits of Initialization lists

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

第一个变量被初始化为 var(value)

class Foo
{
    public:
        Foo(): itsVar1(2), itsVar2(345){}

    private:
        int itsVar1;
        int itsVar2;      
};

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

class Foo
{
    public:
        Foo()
        {
            itsVar1 = 2;
            itsVar2 = 345;
        }

    private:
        int itsVar1;
        int itsVar2;
}; 

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

【问题讨论】:

  • “:”语法是一个 C++“初始化列表”。在某些情况下,您必须使用它们。在其他情况下(例如您的示例),您可以在构造函数主体和初始化列表之间进行选择。有关更多详细信息,请参阅 James McNellis 引用的链接或 Google 的“C++ 构造函数与初始化列表”。这里还有一个链接:forums.codeguru.com/showthread.php?t=464084

标签: c++


【解决方案1】:

前一种表示法将在构造函数调用之前初始化成员。在初始化所说的内容之前,不会在构造函数内部执行任何操作。如果有继承,父类的构造函数会在当前构造函数调用之前被调用。

我认为,构造函数的显式和隐式声明在 c++ 中与 python 不同。当你的构造函数只有一个参数不是类本身的类型时(构造函数不是复制构造函数),它可以用于类型转换。当你把 explicit 放在构造函数的名字之前,你告诉编译器没有我的明确许可不要转换任何东西。

【讨论】:

  • 这种错过了所有的原因:(
【解决方案2】:

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

  1. Not 使用初始化列表使得保证异常安全变得更加困难。为您的类成员变量使用 RAII 类以及初始化列表,可以轻松保证您的构造函数在遇到成员变量的构造函数抛出的异常时不会泄漏资源。

  2. 分配的性能并不比初始化列表好。如果成员变量类型是非平凡的,那么赋值实际上会执行得更差。使用初始化器,成员变量将在适当的位置构造,并且不会发生默认构造。使用赋值让所有成员变量都成为默认构造的优先。

  3. 初始化列表是为引用和常量成员变量赋值的唯一方法。

【讨论】:

    【解决方案3】:

    当构造函数被声明为时

     Foo(): itsVar1(2), itsVar2(345){}
    

    这意味着变量 "itsVar1" "and itsVar2" 在创建其局部变量成员(即 itsVar 和 itsVar2)时被初始化。这种初始化方法称为初始化列表。在用户定义类型的情况下,这样的初始化将调用用户定义类型的复制构造函数。更多信息请访问:http://en.wikipedia.org/wiki/Initialization_(programming)#Initializer_list

    当构造函数被定义为

      Foo()
        {
            itsVar1 = 2;
            itsVar2 = 345;
        }
    

    构造函数创建内存并且不初始化成员变量itsVar1 和itsVar2。 一旦创建成员并且控制流入构造函数的主体,它们就会被分配一个值。

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

    【讨论】:

    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多