构造函数 与 析构函数
构造函数代表一个对象的生成,主要作用是初始化类的成员变量,可以被重载
如果没有显式构造函数,则实例化对象时,系统会自动生成一个无参的构造函数
构造函数的名称与类名相同
析构函数代表的是一个对象的销毁,不可以被重载
析构函数的名称是 ~类名()
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");
}
基类的构造函数和析构函数不会继承给派生类,但会在派生类生成对象时调用
构造函数调用顺序:先调用基类无参构造函数,再调用派生类的构造函数,如果想要调用基类的有参构造函数,需要显式调用 Dog(string name, int age) : Animal(name, age)
析构函数调用顺序:先调用派生类析构函数,再调用基类析构函数
顺便讲一下函数重载、函数重定义和函数重写的区别
函数重载:函数名相同,函数参数列表不同(参数类型、参数顺序、参数个数),通过传入不同的实参,调用不同的函数,执行不同的功能
函数重定义:当发生继承关系的时候,子类和父类存在同名函数,子类会 隐藏 父类的同名函数,执行自己的函数
函数重写:当发生继承关系的时候,父类提供虚函数,子类 重写(覆盖) 父类的虚函数,展现的是子类的功能