重载和重写
方法重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
1、方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
2、重载Overloading是一个类中多态性的一种表现。
3、重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
1、如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)
2、但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写
3、若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类
总结:
1、同样的一个方法能够根据输入数据的不同,做出不同的处理,即方法的重载——有不同的参数列表(静态多态性)
2、而当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法,
即在子类中重写该方法——相同参数,不同实现(动态多态性)
重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分
OOP三大特性:
封装、继承、多态
1、封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
2、继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
3、多态性(polymorphisn)多态就是指一个类实例的相同方法在不同情形有不同表现形式
封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用。
访问控制:
友元函数:
1、类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
2、友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
3、如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend
不管char*, int*, float*,所有类型的指针变量在32位系统上都是4字节, 64位系统上都是8字节。
struct 占用字节:
原则:
1、struct首地址应为结构体变量最大长度的整数倍
2、每个变量的偏移量应为变量的整数倍
3、struct占用内存总和应为结构体变量最大长度的整数倍
ps:函数不占用内存
虚函数,有个虚拟函数表指针,占用4个字节
static变量不占内存
可用预编译命令#pragma pack(n) 来改变字节对齐规则
为何要内存对齐:
1、平台原因(移植原因)
A 不是所有的硬件平台都能访问任意地址上的任意数据的;
B 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:
A 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
B 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。