C++继承、构造函数和析构函数

构造函数 与 析构函数

构造函数代表一个对象的生成,主要作用是初始化类的成员变量,可以被重载
如果没有显式构造函数,则实例化对象时,系统会自动生成一个无参的构造函数
构造函数的名称与类名相同

析构函数代表的是一个对象的销毁,不可以被重载
析构函数的名称是 ~类名()

class Animal
{
public:
	string name;
	int age;
	Animal():name("dog"), age(12)  //显式无参构造函数,这里借助c++11的列表初始化
	{
		cout << "这是无参构造函数" << endl;
	}

	Animal(string name, int age)  //显式有参构造函数
	{
		this->name = name;
		this->age = age;
		cout << "这是有参构造函数" << endl;
	}
	~Animal(){};  //析构函数
};

Animal dog1; //会调用无参构造函数
Animal dog2("xiaohei",12); //会调用显式有参构造函数

注意事项:构造函数/析构函数 如果显式调用,则必须是public权限

C++封装

作用:保证数据安全性

三种权限
public:类内可以访问 子类可以访问 类外可以访问
protected:类内可以访问 子类可以访问 类外不可以访问
private:类内可以访问 子类不可以访问 类外不可以访问

C++继承

作用:实现代码复用,节省代码量

继承中的构造函数和析构函数

class Animal
{
public:
	string name;
	int age;
	Animal():name("dog"), age(12)
	{
		cout << "这是基类无参构造函数" << endl;
	}

	Animal(string name, int age)
	{
		this->name = name;
		this->age = age;
		cout << "这是基类有参构造函数" << endl;
	}
	~Animal()
	{
		cout << "这是基类析构函数" << endl;
	}
};

class Dog:public Animal  //公有继承自Animal类
{
public:
	string name;
	int age;
	Dog()
	{
		cout << "这是Dog类无参构造函数" << endl;
	}

	Dog(string name, int age)
	{
		this->name = name;
		this->age = age;
		cout << "这是Dog类有参构造函数" << endl;
	}
	~Dog()
	{
		cout << "这是Dog类析构函数" << endl;
	}
};

void Func1()
{
	Dog dog1();
	Dog dog2("小黑", 12);
}

int main()
{
	Func1();
	system("pause");
}

C++继承、构造函数和析构函数_第1张图片

基类的构造函数和析构函数不会继承给派生类,但会在派生类生成对象时调用
构造函数调用顺序:先调用基类无参构造函数,再调用派生类的构造函数,如果想要调用基类的有参构造函数,需要显式调用 Dog(string name, int age) : Animal(name, age)
析构函数调用顺序:先调用派生类析构函数,再调用基类析构函数

顺便讲一下函数重载、函数重定义和函数重写的区别

函数重载:函数名相同,函数参数列表不同(参数类型、参数顺序、参数个数),通过传入不同的实参,调用不同的函数,执行不同的功能
函数重定义:当发生继承关系的时候,子类和父类存在同名函数,子类会 隐藏 父类的同名函数,执行自己的函数
函数重写:当发生继承关系的时候,父类提供虚函数,子类 重写(覆盖) 父类的虚函数,展现的是子类的功能

你可能感兴趣的:(C++,c++,开发语言)