构造函数和拷贝控制

每个类操作包括创建,拷贝,移动,赋值,销毁。、

虚析构函数

注:这里说的基类指针如果不加说明,就是new 开辟动态空间。

在你的程序中,你保证没有基类指针指向派生类这种情况,就无需定义虚析构函数,因为程序会做更多的操作执行,浪费资源。

如果有基类指针指向派生类,则必须定义虚析构函数,这样在销毁对象时候,会动态调用派生类的析构函数,而不是仅仅调用基类的构造函数,进行对象的销毁工作。

Pass:以前说的只有当类里面分配资源的时候,才需要定义析构函数。基类的析构函数却是一个例外,一个基类总是需要一个析构函数.

合成拷贝和继承

1.如果基类中默认构造函数,拷贝构造函数,拷贝赋值运算符和析构函数是删除的或者不可访问的,派生类中这些成员也是删除的。因为派生类无法调用基类函数对它基类部分进行构造,赋值和拷贝。

2.如果基类有不可访问或删除的析构函数,那么派生类中的构造函数和拷贝构造函数是删除的。因为派生类的基类部分数据无法析构。

3.如果基类中移动操作是删除的,那么派生类的移动操作也是删除的。因为派生类无发移动它基类部分。

派生类的拷贝控制成员

派生类的拷贝构造函数和构造函数非常类似,下面给出模板。

class Base
{
public:
	/*
	定义你想的操作
	*/
};
class Derive:public Base
{
public:
	Derive(/*可能有东西*/) :Base(/*可能有东西*/)/*这里是派生类成员初始化*/ {/*这里是派生类成员拷贝*/ }
	Derive(const Derive &d):Base(d)/*这里是派生类成员初始化*/ {/*这里是派生类成员拷贝*/ }
	Derive(Derive &&d):Base(std::move(d))/*这里是派生类成员初始化*/ {/*这里是派生类成员拷贝*/ }
};

如果你舍去初始化列表里面对基类相应成员的调用,那么系统自动调用默认构造函数。所以建议在初始化列表直接调用相应函数就行了。

派生类复制构造函数:

Derive &operator=(const Derive &d)
	{
		if (this != &d)
		{
			Base::operator=(d);
			/*
			你自己需要操作
			*/
		}
		return *this;
	}

派生类析构函数,只负责自己类的资源的销毁工作,在自己资源销毁完毕后会调用自己类中对象销毁,在对直接基类销毁。

继承的构造函数

一个类只初始化它的直接基类,一个类只能继承它的直接基类的初始函数。

class Base
{
public:
	Base(int) {}
	Base(const Base &) {}
	Base(Base &&) {}
};
class Derive:public Base
{
public:
	using Base::Base;
};

Derive这个类中实际上产生了形如derived(parms):base(args){}

derived表示派生类名,parms是形参列表,base基类名,args代表形参。

无论using出现在哪边它的访问级别是由基类来定,它的explicit属性也是由基类的属性来定。

猜你喜欢

转载自blog.csdn.net/qq_41657315/article/details/80949575