重载:在同一可访问区内被声明的几个具有不同参数列表(参数的类型,参数个数,顺序不同)的同名函数,程序会根据不同的参数列表确定调用哪个函数。重载不关心函数返回值类型。
友元函数是不能被继承的,可理解为:你父亲的朋友不一定是你自己的朋友
友元函数可以访问所在类的保护成员、公有成员和私有成员
const在前,内容不能变;
const在后,指针不能变;
const* ,指针指向为常量;
*const ,指针本身为常量。
总结:左定值,右定向。
常见的不能声明为虚函数的有:普通函数(非成员函数),静态成员函数,内联成员函数,构造函数,友元函数。
动态联编(Dynamic Binding)是面向对象编程中的一个重要概念,也称为运行时多态性(Runtime Polymorphism)或晚期绑定(Late Binding)。它是一种在程序运行时(而不是编译时)确定对象的方法、属性和方法的机制。
动态联编通常与以下概念相关联:
-
多态性(Polymorphism):多态性是一种概念,它允许不同类的对象对相同的消息或方法调用做出不同的响应。这意味着通过基类或接口引用调用的方法可以根据实际对象的类型进行动态分派。多态性有助于编写更加灵活和可维护的代码,因为您可以编写通用代码,该代码可以与多个具体类一起使用。
-
虚函数(Virtual Function):在许多面向对象编程语言中,通过将基类中的函数标记为“虚函数”,可以实现动态联编。虚函数是可以在子类中重写的函数,它使编译器能够在运行时选择正确的函数实现,以响应对象的实际类型。
-
基类和派生类(Base Class and Derived Class):动态联编通常涉及到基类和派生类之间的关系。基类通常定义了一个或多个虚函数,而派生类可以重写这些虚函数以提供特定的实现。
在实际编程中,动态联编使得可以通过基类引用或指针来操作不同派生类的对象,而不需要在编译时知道对象的确切类型。这提高了代码的可扩展性和灵活性,并允许在运行时根据程序的状态选择正确的方法实现。
new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构。malloc和free不会调用类的构造函数和析构函数。
模板函数和普通函数都符合条件时,优先执行普通函数。
编译器不为const分配内存空间,而是直接保存在符号表中,没有了内存读取操作,效率就提高了。编译器会对const进行安全类型检查,define由于没有类型所以无法进行类型检查。define宏在定义的时候不会分配内存。
作用域运算符“::”的功能是标识成员是属于哪个类的
函数模板必须由程序员实例化为可执行的函数;
函数模板和类模板的实例化都是由编译器实现的;
类模板中的成员函数都是函数模板;
类模板实例化后,没有用到的成员函数没有实例化;
int* p[4]
是一个包含4个指向整数的指针的数组。
int (*p)[4]
是一个指针,指向一个包含4个整数的数组的指针。
int *(*p)()
是一个函数指针的声明。它声明了一个指针 p
,该指针可以指向一个函数,这个函数返回一个指向整数指针的指针。
int (*p)()
是一个函数指针的声明。它声明了一个指针 p
,该指针可以指向一个函数,这个函数不接受任何参数,并返回整数。
static类变量又叫静态成员变量,它不需要创建对象就可以已经在内存中存在了
在创建实例对象的时候,内存中会为每一个实例对象的每一个非静态成员变量开辟一段内存空间,用来存储这个对象所有的非静态成员变量值
static类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果
实例变量则属对象私有,某一个对象将其值改变,不影响其他对象
静态分配是指在编译阶段就能确定大小,由编译器进行分配,堆不可以进行静态分配,堆的申请都是在执行过程中进行的。