相关疑难解决方法(0)

为什么我更喜欢使用成员初始化列表?

我偏向于使用我的构造函数的成员初始化列表......但我早就忘记了这背后的原因......

您是否在构造函数中使用成员初始化列表?如果是这样,为什么?如果没有,为什么不呢?

c++ oop object-construction

212
推荐指数
6
解决办法
13万
查看次数

在这种特定情况下,使用成员初始化列表和在构造函数中分配值之间是否存在差异?

在内部和关于生成的代码,是否有真正的区别:

MyClass::MyClass(): _capacity(15), _data(NULL), _len(0)
{
}
Run Code Online (Sandbox Code Playgroud)

MyClass::MyClass()
{
  _capacity=15;
  _data=NULL;
  _len=0
}
Run Code Online (Sandbox Code Playgroud)

谢谢...

c++ initialization initialization-list

88
推荐指数
5
解决办法
5万
查看次数

初始化列表的好处

我所知道的使用初始化列表的好处是它们在初始化非内置的类成员时提供了效率.例如,

Fred::Fred() : x_(whatever) { }

比较好,

Fred::Fred() { x_ = whatever; }

如果x是自定义类的对象.除此之外,为了保持一致性,这种风格甚至与内置类型一起使用.

这样做的最常见好处是提高了性能.如果表达式与成员变量x_的类型相同,则任何表达式的结果都直接在x_中构造 - 编译器不会创建该对象的单独副本.

使用另一种样式,表达式可以创建单独的临时对象,并将此临时对象传递给x_对象的赋值运算符.然后该临时对象在;处被破坏.那效率很低.

问题
使用初始化列表,以下示例中是否存在任何效率增益.我认为没有收获.第一个版本调用字符串的复制构造函数,另一个调用字符串的赋值运算符(没有创建任何临时的).这是正确的吗?

class MyClass
{
public:
    MyClass(string n):name(n) { }
private:
    string name;
};

class MyClass
{
public:
    MyClass(string n)
    {
        name=n;
    }
private:
    string name;
};
Run Code Online (Sandbox Code Playgroud)

c++ initialization-list

40
推荐指数
4
解决办法
2万
查看次数