关于复数的类定义,我看到了两种类型的定义:
定义1
class Complex
{
private:
double re;
double im;
public:
Complex(float r,float i) {re = r; im = i;}
~Complex() {};
};定义2
class Complex
{
private:
double re;
double im;
public:
Complex(double r,double i): re(r), im(i) {}
~Complex() {};
};第一个定义对我来说还可以,但我不太理解第二个定义,如何
Complex(double r,double i): re(r), im(i) {}工作?"re( )“是什么意思?
发布于 2011-03-05 06:48:06
它被称为初始化器列表。在类的构造函数中,可以使用以下语法初始化成员变量。因此,在这里,它相当于将语句re = r; im = i;放入构造函数的主体中。
对于int、double和指针类型等POD变量,初始化器列表语法和正文中的常规赋值之间没有区别。但是,对于具有非平凡构造函数的const变量、引用和对象,有一个重要的区别:
对于const变量和引用变量,必须在初始化器列表中对其进行初始化。
因此,通常建议在初始化器列表中初始化具有构造函数的对象,以避免多余的工作--如果您通过从初始化器列表中省略它的默认构造函数来运行它,然后在构造函数体中执行某种类型的初始化,那么您将初始化它两次,这可能是浪费。
例如:
class Example
{
private:
std::string m_string;
public:
Example()
{
// m_string is first initialized by the std::string default constructor,
// then we assign to it with operator=(const char *).
// This is inefficient.
m_string = "test";
}
Example(int dummy)
: m_string("test")
{
// Better: we just call the std::string(const char*) constructor directly
}
};发布于 2011-03-05 06:45:50
第二种形式的Complex构造函数使用initialization lists,它是初始化类成员的不同形式(和preferred way)。
re(...)意味着成员字段re应该使用传递给它的任何参数来构造。
再举一个例子--你可以像这样创建像double和int这样的原语:
double d(5.0d);
int i(5);这应该解释了圆括号在列表中是如何工作的。
发布于 2011-03-05 06:43:24
这是一个初始化列表。它将re的值设置为r,将im的值设置为i。
通常,通过使用初始化列表,您会看到性能的提高,但知道何时不使用它也很重要。
https://stackoverflow.com/questions/5200064
复制相似问题