类用于指定对象的格式,它包含了数据表明的手法和用于处理数据的方法。类中的数据和方法称为类的成员。简单的理解就是‘类’是同一类对象的命名。例如
class Dog{//定义一个Dog的抽象类,其中一条狗的名字,年龄,体重这些属性就是它的成员
public:
string name;
int age;
int weight;
};
类中实例化对象的方法
1)从栈中实例化对象
例如:Dog dog;
2)从堆中实例化对象(需要手动释放空间)
例如:Dog *dog;
内存这方面有点类似c语言中的管理方法,也有点不同,在c语言中要将数据存放在堆区中需要用malloc函数。
构造函数在对象实例化时被系统自动调用,仅且调用一次。
1)构造函数必须与类名同名;
2)可以重载;
3)类名()可以加参数;
4)没有返回类型,即使是void也不行。
类名::类名
例:
Dog::Dog(){}
析构函数
与构造函数相反,在对象结束其生命周期时系统自动执行析构函数
1)析构函数的格式为~类名();
2)调用时释放内存;
3)~类名()不能加参数;
4)没有返回值,即使是void也不行。
类名::~类名()
例:
Dog::~Dog(){}
继承
继承允许依据一个类来定义另外一个类
新创建的类被成为派生类,而已有的类叫做基类。
class derived-class:class-specifier base-class
derived-class是定义的派生类名称
base-class是已有的基类名称
1、公有继承(public):当一个类派生继承公有基类时,基类的公有成员也是派生类的公有成员。
2、保护继承(protected):当一个类派生继承保护基类时,基类的公有和保护成员将成为派生类的保护成员。
3、私有继承():当一个类派生继承私有基类时,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
#include#include using namespace std; class Animal{ private: int age; public: string color; }; class Dog:public Animal{ private: public: string name; }; int main(){ Dog dog; dog.color="yellow"; dog.name="旺财"; cout<<"名称:"< 重载 函数重载 #include#include using namespace std; class Dog { public: string name; void getWeight(int weight){ count<<""< 多态 形成多态的三个条件:
虚函数
1、必须存在继承关系;
2、继承关系必须有同名虚函数(其中虚函数是在基类中使用关键字 virtual 声明的函数,在派 生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数);
3、存在基类类型的指针或者引用,通过该指针或引用调用函数。是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时, 会告诉编译器不要静态链接到该函数。我们想要的是在程序中任意点可以根据所调用的对象类 型来选择调用的函数,这种操作被称为动态链接,或后期绑定。虚函数声明如下:virtual ReturnType FunctionName(Parameter) 虚函数必须实现,如果不实现,编译器将报错。
纯虚函数若在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基 类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。 包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的 指针或引用。
#include数据封装#include using namespace std; class Animal{ public: virtual void run();//定义一个虚函数 }; class Dog:public Animal{ public: void run(); }; class Cat:public Animal{ public: void run(); }; void Dog::run(){ cout << "狗的方法"<< endl; } void Cat::run(){ cout << "猫的方法"<< endl; } int main(){ Animal *animal;//声明一个Animal的指针对象 没有实体化它 Dog dog;//实体化一个Dog的对象 Cat cat;//实体化一个Cat的对象 animal=&dog;//指针对象指向实体化的dog对象的地址 animal->run();//调用run方法 animal=&cat;//指针对象指向实体化的cat对象的地址 animal->run();//调用run方法 return 0; } 数据封装是一种把数据和操作数据的函数捆绑在一起的机制
#include#include using namespace std; class Dog{ public: string name; Dog(int i=0){ totle=i; } void addFood(int number){ this->totle=this->totle+number; } int getFood(){ return this->totle; } private: int totle; }; int main(){ Dog dog; dog.addFood(5); cout<<"第一次喂食:"< 当一个类继承后就可以通过继承公有的数据封装来改变,私有继承的数值。
接口(抽象类)如果类中至少有一个函数被声明为纯虚函数,则这个类就是一个抽象类。
#include#include using namespace std; //定义一个Animal的抽象类型 class Animal{ public: virtual void run()=0;//定义一个run()的纯虚函数 }; class Cat{ public: void run(){// cout<<"猫的方法"<



