关于面向对象

    xiaoxiao2021-03-25  41

    关于构造函数与析构函数: 如果父亲有默认构造,则儿子不需要在子构造函数调用父亲构造,否则需要。 顺序:父构造函数—子构造函数—子析构函数—父析构函数 如果构造函数很析构函数定义为private,那么该类是不能被继承的。 构造函数不能为虚函数,因为多态是在运行阶段实现的。构造函数只能创建固定类型的对象,不具备多态性,任何构造函数(默认、复制)都不能定义成虚函数。 析构函数一般都定义为虚函数。

    关于成员属性: private:只有类本身能够访问,子类和对象都不能访问 public:都可以访问 protected:类本身和子类能够访问,对象不能访问

    重载:一个类中同名函数有不同参数 隐藏:子与父亲中的同名成员,父成员会被隐藏 (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。 (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。 覆盖(重写):派生类中存在重新定义的函数。 其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。 重写的基类中被重写的函数必须有virtual修饰。 多态:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。 如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。 当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数。 由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应。 静态成员:静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放)。 静态成员变量是在程序编译时分配空间,而在程序结束时释放空间。初始化静态成员变量要在类的外面进行.初始化的格式如下:数据类型 类名::静态成员变量名 = 初值; 静态成员变量只能通过静态方法来进行操作,静态方法可以通过类名或类的对象使用(包括派生类)。 若派生类可能被用作基类,用虚继承(解决菱形问题)。

    确保一个类不能被复制,可以把复制构造函数和赋值函数定义在private中(无需实现)。

    Class A { private: A(const A&); A& operator = (const A&); }

    上述方法能保证实例对象不能复制,但是仍然可以创建多个对象。要实现只有一个实例的单例,需要将默认构造函数、复制构造函数、和赋值操作函数均定义在private中,然后在public中实现静态对象。

    Class A { private: A(); A(const A&); A& operator = (const A&); public: static A& GetInstance() { static A OnlyInstance; return OnlyInstance; } }

    若想禁止在栈中创建实例(即用new实现对象,在堆中分配内存),只需把析构函数定义在private中,但是这样做需要在public中定义公用的static方法类释放该类的资源,因为在main中是不能调用其析构函数的。

    友元函数和友元对象可以访问类的私有变量和方法。 A中定义了 friend class B,则B可以访问A的private变量和方法。

    转载请注明原文地址: https://ju.6miu.com/read-26131.html

    最新回复(0)