C++常见问题

github

Q1:什么是重载(overload)和多态(polymorphic),区别是什么

Q2:重载(overload)和覆盖(overrid)的区别

Q3:内存分配方式

建议下载下来用Typora软件阅读markdown文件

Q1:什么是重载(overload)和多态(polymorphic),区别是什么

reference

多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。重载也是用统一的对外接口来完成不同的功能。那么两者有什么区别呢?

  1. 什么是重载(todo)

    重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址编译期就绑定了。

  2. 什么是多态

    多态是指子类重新定义父类的虚方法(virtual,abstract)。当子类重新定义了父类的虚方法后,父类根据赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的

区别:
不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法:

对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;

而对于多态,只有等到方法调用的那一刻*,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。*

Q2:重载(overload)和覆盖(overrid)的区别

    • 重载要求函数名相同,但是参数列表必须不同,返回值可以相同也可以不同。

    • 覆盖要求函数名、参数列表、返回值必须相同。

    • 在类中重载是同一个类中不同成员函数之间的关系

    • 在类中覆盖则是子类和基类之间不同成员函数之间的关系

  1. 根据参数类型来判断调用的是哪一个和根据对象类型来决定调用哪一个

    • 重载函数的调用是根据参数列表来决定调用哪一个函数

    • 覆盖函数的调用是根据对象类型的不同决定调用哪一个

    • 在类中对成员函数重载是不能够实现多态
    • 在子类中对基类虚函数的覆盖可以实现多态

Q3:内存分配方式

在C++中,内存分为五个区,他们分别是:

  1. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。
  2. 堆,C语言和操作系统的术语,堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,调用free()归还内存
  3. 自由存储区,是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区,通过delete归还内存。
  4. 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
  5. 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)

堆和自由存储区的区别:

  • 自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。

  • 一般new是通过malloc来实现的,当new通过malloc来实现时,可以说new分配的内存在自由存储区,也可以说new分配的内存在堆上。

  • new是可以重载的,当使用重载的new来实现内存分配时,且内部实现并非只有malloc()时,此时的内存空间就和堆不同了,这是一块组合的内存空间,C++中称为“自由存储区”,这是一个抽象的概念。


size_t和int的区别

size_t 无符号,在64位系统是8字节,在32位系统是4字节。

int 有符号,在64和32位系统都是4字节。


void * :指向不确定类型的指针。

# C++

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×