gpt4 book ai didi

c++ - 类成员初始化差异

转载 作者:太空狗 更新时间:2023-10-29 20:00:44 25 4
gpt4 key购买 nike

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

定义 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()”是什么意思?

最佳答案

它被称为初始化列表。在类的构造函数中,您可以使用此语法初始化成员变量。所以在这里,它等同于将语句 re = r; im = i; 在构造函数的主体中。

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

  • 对于 const 变量和引用变量,它们必须在初始化列表中初始化。它们不能通过在正文中分配给它们来初始化。
  • 对于具有非平凡构造函数的对象,如何在初始化列表中初始化它们对应于被调用的构造函数。如果省略该变量,则会调用该对象的默认构造函数(如果该对象没有默认构造函数,则会出现编译器错误)。

因此,通常建议在初始化列表中初始化具有构造函数的对象以避免冗余工作——如果您通过从初始化列表中省略它来运行其默认构造函数,然后在构造函数中执行某种初始化body,你要初始化它两次,这可能很浪费。

例如:

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
}
};

关于c++ - 类成员初始化差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com