具有变量初始化的C ++构造函数

时间:2019-01-21 01:18:57

标签: c++ visual-c++ constructor

我正在读一本关于数据结构的书,偶然发现了这段代码:

class UnorderedArray 
{
public:
UnorderedArray(int size, int growBy = 1) :
    m_array(NULL), m_maxSize(0), m_growSize(0), m_numElements(0)
{
    if (size) {
        m_maxSize = size;
        m_array = new T[m_maxSize];

        m_growSize = ((growBy > 0) ? growBy : 0);
    }
}

private:
T * m_array;

int m_maxSize;
int m_growSize;
int m_numElements;

}

有人可以帮我解释一下这段代码吗?

UnorderedArray(int size, int growBy = 1) :
m_array(NULL), m_maxSize(0), m_growSize(0), m_numElements(0)

我相信这是对这些变量的某种初始化,但是我似乎找不到具体的答案。

3 个答案:

答案 0 :(得分:2)

是的,代码将变量初始化为括号中的值。 C ++的此功能称为初始化列表

Standard C++ FAQ中所述,在编写类构造函数时,您应该更喜欢使用成员初始化列表进行赋值:

  

请考虑以下初始化成员对象for item in WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a[href$='20012019.csv']"))): 的构造函数   使用初始化列表:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC 。的   这样做的最常见好处是提高了性能。对于   例如,如果表达式 whatever 与成员的类型相同   变量x_,构造 every 表达式的结果   直接在Fred::Fred() : x_(whatever) { }内部-编译器不会单独复制   宾语。即使类型不同,编译器通常   与初始化列表相比,使用初始化列表可以做得更好   作业。

     

构建构造函数的另一种(无效的)方法是通过赋值,   例如:x_。在这种情况下,表达式   任何都会导致创建一个单独的临时对象,并且   临时对象被传递到x_对象的赋值运算符中。   然后,该临时对象在Fred::Fred() { x_ = whatever; }处被销毁。效率低下。

     

这似乎还不够糟糕,这是效率低下的另一个原因   在构造函数中使用赋值时:成员对象将获得   完全由其默认构造函数构造而成,对于   例如,分配一些默认的内存量或打开一些默认值   文件。如果有任何表达,那么所有这些工作都是徒劳的   和/或赋值运算符使对象关闭该文件和/或   释放该内存(例如,如果默认构造函数未分配   足够大的内存池或打开错误的文件)。

     

结论:在所有其他条件相同的情况下,如果   您使用初始化列表而不是分配。

换句话说,所示代码优于在构造函数的主体中初始化类的成员变量的备用代码:

x_

答案 1 :(得分:0)

UnorderedArray是类,

UnorderedArray(int size, int growBy = 1):

是采用一个或两个整数的构造函数的签名,如果未提供第二个整数,则默认为1(即,如果不提供参数,则为1)。

m_array(NULL), m_maxSize(0), m_growSize(0), m_numElements(0)

是成员的显式初始化,它将m_array设置为Null,m_maxSize设置为0,m_growSize设置为0,m_numElements设置为0。

答案 2 :(得分:0)

正如songyuanyao注释指示的那样,这称为初始化列表,并在cpp reference进行了深入说明。 m_array(NULL)等同于构造函数主体中的m_array = NULL