首页 > 代码库 > c++第五章-(类与对象、构造器和析构器)

c++第五章-(类与对象、构造器和析构器)

1.构造器与结构体的区别:构造器多支持方法。其作用有申请内存,初始化变量。

在c++中构造器没有返回值:语法Class Name(); 

2.析构器的作用:释放内存。

在c++中析构器没有返回值:语法~ClassName();

 

class Animal{public:    std::string mouth;    std::string name;        void eat();    void sleep();    void drool();        Animal(std::string theName);};class Pig:public Animal{public:    void climb();        Pig(std::string theName);};class Turtle:public Animal{public:    void swim();        Turtle(std::string theName);};void Animal::eat(){    std::cout << this->name << "会吃东西\n";}void Animal::sleep(){    std::cout << this->name << "会睡觉\n";}void Animal::drool(){    std::cout << this->name << "会流口水\n";}void Pig::climb(){    std::cout << this->name <<"会爬树\n";}void Turtle::swim(){    std::cout << this->name << "会游泳\n";}/** *  构造器,子类的构造器的值是通过改变父类的值的来的 */Animal::Animal(std::string theName){    this->name = theName;}Pig::Pig(std::string theName):Animal(theName){    }Turtle::Turtle(std::string theName):Animal(theName){    }int main(int argc, const char * argv[]){    Animal animal("大动物");    animal.eat();    animal.sleep();    animal.drool();        Pig bigPig("小母猪");    Turtle greenTurtle("小甲鱼");            bigPig.climb();    greenTurtle.swim();        return 0;}

 控制台返回的结果:

大动物会吃东西大动物会睡觉大动物会流口水小母猪会爬树小甲鱼会游泳

 

2.继承情况下构造器和析构器的生命周期

class BaseClass{public:    BaseClass();    ~BaseClass();        void doSomething();};class SubClass:public BaseClass{public:    SubClass();    ~SubClass();    };void BaseClass::doSomething(){    std::cout << "父类做了某件事" << std::endl;}BaseClass::BaseClass(){    std::cout << "父类构造器\n";}SubClass::SubClass():BaseClass(){    std::cout << "子类构造器\n";}BaseClass::~BaseClass(){    std::cout << "父类析构器\n";}SubClass::~SubClass(){    std::cout << "子类析构器\n";}int main(int argc, const char * argv[]){    SubClass subclass;    subclass.doSomething();    std::cout << "完工" << std::endl;        return 0;}

控制台打印结果:

父类构造器子类构造器父类做了某件事完工子类析构器父类析构器

 

 3.class SubClass:private BaseClass//":private"说明只有SubClass该类可以使用基类的元素

 4.覆盖

class Animal{public:    std::string mouth;            void eat();    void eat(int eatCount);    void sleep();    void drool();        Animal(std::string theName);    protected:    std::string name;};class Pig:public Animal{public:    void climb();    //overRide    void eat();        Pig(std::string theName);};class Turtle:public Animal{public:    void swim();    //overRide    void eat();        Turtle(std::string theName);};void Animal::eat(){    std::cout << this->name << "会吃东西\n";}void Animal::eat(int eatCount){    /**     *  OverLoad重载     */    std::cout << "饿了,该吃上" << eatCount << "碗饭" << std::endl;}void Animal::sleep(){    std::cout << this->name << "会睡觉\n";}void Animal::drool(){    std::cout << this->name << "会流口水\n";}void Pig::climb(){    std::cout << this->name <<"会爬树\n";}void Pig::eat(){    //overRide覆盖    Animal::eat();    std::cout << this->name << "在吃菜\n";}void Turtle::swim(){    std::cout << this->name << "会游泳\n";}void Turtle::eat(){    //overRide覆盖    Animal::eat();    std::cout << this->name<< "在吃海草\n";}/** *  构造器,子类的构造器的值是通过改变父类的值的来的 */Animal::Animal(std::string theName){    this->name = theName;}Pig::Pig(std::string theName):Animal(theName){    }Turtle::Turtle(std::string theName):Animal(theName){    }int main(int argc, const char * argv[]){    Animal animal("大动物");    animal.eat();    animal.sleep();    animal.drool();        std::cout<< std::endl;    std::cout<< std::endl;        Pig bigPig("小母猪");    bigPig.climb();    Turtle greenTurtle("小甲鱼");    greenTurtle.swim();        std::cout<< std::endl;    std::cout<< std::endl;        //两个子类覆盖过的吃东西方法    bigPig.eat();    greenTurtle.eat();        std::cout << std::endl;    std::cout << std::endl;    //重载吃东西的方法    bigPig.Animal::eat(3);        return 0;}

控制台输出结果:

大动物会吃东西大动物会睡觉大动物会流口水小母猪会爬树小甲鱼会游泳小母猪会吃东西小母猪在吃菜小甲鱼会吃东西小甲鱼在吃海草饿了,该吃上3碗饭

 5.继承下来的子类不能对继承下来的方法进行重载overLoad