首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类成员初始化差异

类成员初始化差异
EN

Stack Overflow用户
提问于 2011-03-05 06:39:49
回答 5查看 230关注 0票数 3

关于复数的类定义,我看到了两种类型的定义:

定义1

代码语言:javascript
复制
class Complex
{
   private:
      double re;
      double im;

   public:
      Complex(float r,float i) {re = r; im = i;}
      ~Complex() {};
};

定义2

代码语言:javascript
复制
class Complex
{
   private:
      double re;
      double im;

   public:
      Complex(double r,double i): re(r), im(i) {}
      ~Complex() {};
 };

第一个定义对我来说还可以,但我不太理解第二个定义,如何

代码语言:javascript
复制
 Complex(double r,double i): re(r), im(i) {}

工作?"re( )“是什么意思?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-05 06:48:06

它被称为初始化器列表。在类的构造函数中,可以使用以下语法初始化成员变量。因此,在这里,它相当于将语句re = r; im = i;放入构造函数的主体中。

对于intdouble和指针类型等POD变量,初始化器列表语法和正文中的常规赋值之间没有区别。但是,对于具有非平凡构造函数的const变量、引用和对象,有一个重要的区别:

对于const变量和引用变量,必须在初始化器列表中对其进行初始化。

  • 对于具有非平凡构造函数的对象,在初始化器列表中初始化它们的方式与被调用的构造函数相对应。如果省略该变量,则调用该对象的默认构造函数(如果该对象没有默认构造函数,则这是一个编译器错误)。

因此,通常建议在初始化器列表中初始化具有构造函数的对象,以避免多余的工作--如果您通过从初始化器列表中省略它的默认构造函数来运行它,然后在构造函数体中执行某种类型的初始化,那么您将初始化它两次,这可能是浪费。

例如:

代码语言:javascript
复制
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
    }
};
票数 4
EN

Stack Overflow用户

发布于 2011-03-05 06:45:50

第二种形式的Complex构造函数使用initialization lists,它是初始化类成员的不同形式(和preferred way)。

re(...)意味着成员字段re应该使用传递给它的任何参数来构造。

再举一个例子--你可以像这样创建像doubleint这样的原语:

代码语言:javascript
复制
double d(5.0d);
int i(5);

这应该解释了圆括号在列表中是如何工作的。

票数 2
EN

Stack Overflow用户

发布于 2011-03-05 06:43:24

这是一个初始化列表。它将re的值设置为r,将im的值设置为i

通常,通过使用初始化列表,您会看到性能的提高,但知道何时不使用它也很重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5200064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档