拷贝构造函数和赋值操作符在继承中的应用

在继承中,拷贝构造函数和赋值操作符表现的特性是不同的。

拷贝构造函数承担着构造和拷贝双重责任,无论什么情况下都需要构造基类部分,赋值操作符则不同,其目标是已经构造好的对象,只需要赋值即可。

派生类无构造函数和赋值操作符场景:

#include 
using namespace std;


class B {
public:
	B()
	{
		cout << "B()" << endl;
	}
	B(const B&b) {
		cout << "B" << endl;
	}
	B& operator=(const B &b) {
		cout << "B=" << endl;
		return *this;
	}
};

class D: public B{
public:
	D()
	{
		cout << "D()" << endl;
	}
private:
	B b;
};

int main()
{
	D d1;
	cout << "----------------\n";
	D d2 = d1;
	cout << "----------------\n";
	d2 = d1;
	return 0;
}
示例代码如上所示,其运行结果为:

B()
B()
D()
----------------
B
B
----------------
B=
B=
请按任意键继续. . .

在示例中派生类还包括基类的对象,由结果看出: 当派生类拷贝构造函数和赋值操作符为空时,会自动调用基类以及成员对象的构造函数和赋值操作符。

派生类构造函数和赋值操作符不完全场景:

#include 
using namespace std;


class B {
public:
	B()
	{
		cout << "B()" << endl;
	}
	B(const B&b) {
		cout << "B" << endl;
	}
	B& operator=(const B &b) {
		cout << "B=" << endl;
		return *this;
	}
};

class D: public B{
public:
	D()
	{
		cout << "D()" << endl;
	}
	D(const D&d){
		cout << "D" << endl;
	}
	D& operator=(const D &d) {
		cout << "D=" << endl;
		return *this;
	}
private:
	B b;
};

int main()
{
	D d1;
	cout << "----------------\n";
	D d2 = d1;
	cout << "----------------\n";
	d2 = d1;
	return 0;
}
示例代码如上所示,其运行结果为:

B()
B()
D()
----------------
B()
B()
D
----------------
D=
请按任意键继续. . .
由结果看出: 拷贝构造函数会调用基类和成员对象的默认构造函数,并不会调用拷贝构造函数,赋值操作符则仅限于派生类自身函数

派生类完全构造函数和赋值操作符场景:

根据上述情形,完整的写法为:

#include 

using namespace std;


class B {
public:
	B()
	{
		cout << "B()" << endl;
	}
	B(const B&b) {
		cout << "B" << endl;
	}
	B& operator=(const B &b) {
		cout << "B=" << endl;
		return *this;
	}
};

class D: public B{
public:
	D()
	{
		cout << "D()" << endl;
	}
	D(const D&d):B(d), b(d){
		cout << "D" << endl;
	}
	D& operator=(const D &d) {
		B::operator =(d);
		b = d.b;
		cout << "D=" << endl;
		return *this;
	}
private:
	B b;
};

int main()
{
	D d1;
	cout << "----------------\n";
	D d2 = d1;
	cout << "----------------\n";
	d2 = d1;
	return 0;
}
结果为:

B()
B()
D()
----------------
B
B
D
----------------
B=
B=
D=
请按任意键继续. . .
相比第一种情形,在调用基类和成员函数的拷贝函数和赋值操作符的基础上增加了派生类函数的处理方式。





你可能感兴趣的:(C++)