C++每日一练(构造、析构、虚函数)

122 阅读2分钟

本文已参与「新人创作礼活动」,一起开启掘金创作之路。

一、今日课题

1.构造函数 && 析构函数

2.虚函数 && 纯虚函数

二、实战演练

  1. 构造/析构

构造函数:与类名相同的,在建立对象时自动调用的函数。如果在定义时,没有为类定义构造函数,编译系统就会生成一个默认形式的隐含的构造函数,这个构造函数体是空的,因此默认构造函数不具备任何功能。

析构函数:析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

1)有何用?

构造:

  • 给创建的对象建立一个标识符;
  • 为对象数据成员开辟内存空间;
  • 完成对象数据成员的初始化;

析构:

析构函数是在对象被撤销时被自动调用, 用于对成员撤销时的一些清理工作。

2)怎么用?

下面通过一个简单的例子来解释构造、析构函数是如何使用的:

这里写图片描述

  • 在main主函数中,首先定义了变量p1和指针p2,变量p1就会调用myclass()构造函数,而p2是一个指针变量,不会调用构造函数(调用构造函数的各种情况,后便将会提到),按照myclass()构造函数定义会输出"A"字符,至此,完成了图例中表示的第1步;

  • 第2步,定义的是一个字符类变量,所以会调用myclass(char c)函数,输出“X”;

  • 第3步是调用析构函数~myclass(),输出“B”字符,由于前2步调用了两次构造函数,所以在这里也会调用两次析构函数,输出“BB”

调用构造函数的条件


  1. 虚函数/纯虚函数

虚函数在于定义了一个从最早的父类,到最后的子类,都必须具备的一个功能(函数),只是在不断的进化(继承)中,这个功能会略微发生改变。通过虚函数,我们在调用不同的衍生类的时候,可以拥有不同的功能。

纯虚函数,就是虚函数了以后,末尾还要加=0的那一类函数。

1)有何用?

虚函数:

  • 运行时多态;
  • 父类中提供虚函数的实现,为子类提供默认的函数实现;

纯虚函数:

“只提供申明,没有实现”,是对子类的约束,是“接口继承

2)怎么用?

#include <iostream>

using namespace std;

class A
{
public:
	virtual void out1() = 0;        //由子类实现
	virtual ~A() {};
	virtual void out2()     //默认实现
	{
		cout << "A(out2)" << endl;
	}
	void out3()        //强制实现
	{
		cout << "A(out3)" << endl;
	}
};

class  B:public A
{
public:
	virtual ~B() {};
	void out1()
	{
		cout << "B(out1)" << endl;
	}
	void out2()
	{
		cout << "B(out2)" << endl;
	}
	void out3()
	{
		cout << "B(out3)" << endl;
	}
};

int main()
{
	A *ab = new B;
	ab->out1();
	ab->out2();
	ab->out3();
	cout << "-----------------------------------------" << endl;
	B*bb = new B;
	bb->out1();
	bb->out2();
	bb->out3();

	delete ab;
	delete bb;
	system("pause");
}