刚刚因为这个面试失败,我仍然很困惑:
class A
{
public:
A(int a) : a_(a) {}
// Copy constructor
// Assignment operator
private:
int a_;
};
class B : public A
{
public:
B(int a, int b) : A(a), b_(b) {
}
// Copy constructor
// Assignment operator
private:
int b_;
};
如何实现复制构造函数/赋值操作,为什么B的构造函数必须在初始化列表中初始化A ?如果不在列表中,它将无法工作。
如何实现copy constr/assign op
我想这是骗人的问题。在这种情况下,最好的选择是什么都不做。两个类都不包含(也不拥有)任何需要超出默认特殊成员函数的资源。遵守零规则。
一些风格指南建议显式默认特殊成员函数。在本例中
class A
{
public:
A(int a) : a_(a) {}
A(const A &) = default;
A& operator=(const A &) = default;
private:
int a_;
};
可能是合适的
为什么B的构造函数必须在初始化列表中初始化A ?
所有类成员和基类必须在进入构造函数体之前完全构造好。
B(int a, int b)
{ // Entering constructor's body. A must be constructed before we get here.
}
A
没有默认构造函数,因此必须在初始化列表中显式调用它所拥有的构造函数来构造基类,然后才能继续构造B
。
解决评论
A
的复制构造函数和赋值操作符是平凡的:
A(const A & src): a_(src.a_)
{
}
A& operator=(const A & src)
{
a_ = src.a_;
return *this;
}
B
有点棘手,因为它还必须确保复制A
B(const B & src): A(src), // copy the base class
b_(src.b_)
{
}
B& operator=(const B & src)
{
A::operator=(src); // assign the base class by explicitly calling its
// assignment operator
b_ = src.b_;
return *this;
}
注意:如果我要招聘的话,我会选择那些在刁难问题上给我打电话的程序员,而不是那些做额外工作并冒着非强制错误风险的程序员。
为什么B的构造函数必须在类中初始化A初始化器列表吗?
A
只有一个接受int类型的构造函数。B
将A
作为基类,这意味着每个B
对象必须首先构造一个A
对象。除了使用初始化器列表,您还将如何构造带有所需参数的A
对象?