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