我正在读一本关于数据结构的书,偶然发现了这段代码:
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)
我相信这是对这些变量的某种初始化,但是我似乎找不到具体的答案。
答案 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
。