我在Image.cpp一些代码:
Image::Image( int width, int height, int depth ) : m_sFileName(0)
{
...
}
and in Image.h:
class Image: public DrawAble, public RenderAble
{
...
private :
std::string *m_sFileName;
};
我的问题是:什么是与发生m_sFilename
在第一线? 我想这是设置为null,但什么是做这样的地步。 会是这样做:
Image::Image( int width, int height, int depth )
{
m_sFileName(0);
...
}
第一种使用所谓的一个初始化列表 。
当你进入构造函数体,所有的类成员必须已经建立(这样他们就可以使用)。 所以,如果你有这样的:
class Foo
{
public:
Foo()
: str() // this is implicit
{
str = "String.";
}
private:
std::string str;
};
因此, str
被构建,然后分配。 更好的将是:
class Foo
{
public:
Foo()
: str("String.")
{
}
private:
std::string str;
};
这样str
被直接构造。 这不会使你的情况的不同,因为指针没有构造函数。
一般认为在构造函数中运行的代码使用初始化列表很好的做法。 初始化列表应该用于初始化 ,构造函数应该用于运行的代码。
另外,为什么使用指针来串? 如果你想要一个字符串,使用的字符串; 不是指向字符串。 机会是,你真正想要的字符串。
更多关于初始化列表:
初始化列表有更多的用途比类的初始化刚刚成员。 它们可以被用来传递参数为基础的构造函数:
class Foo
{
public:
Foo(int i) { /* ... */ }
}
class Bar
: public Foo
{
public:
Bar()
: Foo(2) // pass 2 into Foo's constructor.
// There is no other way of doing this.
{
/* ... */
}
};
或恒定的成员:
class Foo
{
public:
Foo()
: pi(3.1415f)
{
pi = 3.1415f; // will not work, pi is const.
}
private:
const float pi;
};
或引用:
class Foo
{
public:
Foo(int& i)
: intRef(i) // intRef refers to the i passed into this constructor
{
intRef = i; // does *not* set intRef to refer to i!
// rather, it sets i as the value of
// the int intRef refers to.
}
private:
int &intRef;
};
这就是所谓的初始化。 您应习惯使用它们。 在这种情况下,它并不重要。 但在其他情况下不使用它们可能意味着非指针成员的双重初始化。 先用默认值,然后用你的价值观。 终于有一个成员不无参数的构造函数的情况。 在这种情况下,你没有选择,只能使用一个初始化。
这将是一样的做
Image::Image( int width, int height, int depth )
{
m_sFileName = 0;
// ...
}
请注意,使用指针std::string
通常不是一个好主意,因为一个空字符串同样是一个不错的什么,在这里,标记,你不必在意的破坏,如果你让一个普通的一员。
m_sFileName(0)
在构造函数中的遗体将被解释为调用名为m_sFileName的功能。 你可以将其替换为
m_sFileName = 0;
但是,推荐初始化是在构造函数初始化列表,如在第一个例子。 未在构造函数初始化列表初始化所有数据成员将其类型的默认构造函数被自动初始化。
它不一样的:
Image::Image( int width, int height, int depth )
{
m_sFileName = 0;
...
}
您正在使用的语法:
Image::Image( int width, int height, int depth ) : m_sFileName(0)
{
...
}
被称为初始化列表。 它将分配值0到你的成员变量。
使用m_sFileName = 0; 在构造函数体就会少高性能,因为(因为它未初始化列表中包含一个时间自动,和第二次与您的明确初始化)的成员将被初始化两次。
这两个变种几乎是一样的-你是正确的,因为
: m_sFileName(0)
导致m_sFileName
被初始化以0
。
当你想创建一个C ++为什么有这种特殊的初始化语法的原因就变得很重要const Image
。 (也许不是你想在这种情况下做的,但它可以是你可能要为“轻量级”类型的事。)对于一个const Image
, this
是在构造函数中,以及在每一个“正常”的成员一个const指针功能等m_sFileName=0
是不允许的。
为了解决这个问题,C ++有初始化列表,其中执行初始化,不分配。 顺便说一句,如果m_sFileName
是一个对象,就不会有除了额外的差异const
注意事项:初始化列表会导致m_sFileName
的构造函数被调用,而分配将调用赋值运算符。
除了所有这些考虑,初始化列表是传达意图的好方法 - 以表示你正在初始化,不分配。