多态的概念

字面理解:“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。可以类比为“打”这个字,可以说是“老师打同学”,是击打这个动作;还可以是“我去打酱油”,是舀取的意思;也可以是“打南边来了个喇嘛”,是“从”的意思。“打”即函数名,不同的意思就是不同功能的函数。

C++中的表现形式:

  • 函数的多态性:具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。
  • 对象behavior的多态性:允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

系统实现的角度看,多态性分为静态多态性和动态多态性两类。两者区别在于静态多样性要求在程序编译时就知道调用函数的全部信息,又称为编译时的多态性;动态多态性则不在编译时确定调用的函数,而是在程序运行时才动态确定操作所针对的对象。

函数重载

C++中允许有多个拥有类似功能的同名函数的存在,但是这些同名的函数的参数个数类型或顺序这三个属性当中必须至少有一个与其余的同名函数存在差异。编译器可以通过名称修饰,找到与之相匹配的函数,从而实现不同的功能。这样一来,既减少了函数名的数量,又避免了名字空间的污染,也降低了程序员记忆的难度。需要注意的是只有函数返回值类型不同的函数不能作为重载函数。

函数重载的理解

  1. 函数重载是一种多态现象

  2. 编译原理—重载的函数符号表中生成的名称不一样。例如:

    // 生成@sum$qiii
    int sum(int a,int b,int c );
    // 生成@sum$qii
    int sum(int a,int b);
    // 生成@sum$qfff @ + sum + q + f + f + f(float)
    float sum(float a,float b,float c);
    
  3. 重载函数常用来实现功能类似而所处理的数据类型不同的问题

  4. 编译器选择最合适的重载函数的过程,称为重载决策

函数重载的规则

  1. 函数名称必须相同。

  2. 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等至少具有其中一个。允许参数的类型不同,允许参数的个数不同)

  3. 函数的返回类型可以相同也可以不相同。

  4. 仅仅返回类型不同不足以成为函数的重载。

  5. 构造函数也可以被重载,只要每个构造函数的形参列表是唯一的。不同的构造函数允许建立对象时用不同的方式来初始化数据成员。

  6. 引用作为函数参数时注意不同的格式,要与其他格式区分开来。

重载函数的最佳匹配和歧义Best matches and ambiguities 有可能会有多个重载函数能够匹配一个函数调用。例如,下面的四个函数:

void f(int i);
void f(long int li);
void f(char *p);
void f(double d, int i);

开头的三个函数可以匹配函数调用f(0)。0可以被看做intlong intchar*类的空指针。第四个函数没法匹配,因为它需要两个参数。

当面对多个可选函数时,重载决策根据函数参数类型的隐式转换来排序,找出最匹配的那个。例如,在调用f(0)时,参数0位int类型,当调用:

void f(char *p);

需要把int转换为char*。当调用:

void f(long int li);

需要把int转换为long int。而:

void f(int i);

是非常准确的匹配。准确的匹配永远是最佳选择。

那么,假设:

void f(int i);

没有被声明。这种情况下,重载决策必须在下面二者中选一个:

void f(long int li);
void f(char *p);

但它们两个不分仲伯,都需要进行类型转换。当重载决策没有办法选出一个最优匹配,那么调用就是不明确的,这会产生一个编译错误。

函数参数顺序不同也作为一种函数重载,注意:void f (int a,double b)void f(double a,int b)算是重载,而void f(int a,double b)void f(int b,double a)不算是重载

注意事项:

  • C++规定,每个类必须有一个构造函数,没有构造函数就不能创建任何对象。 若未提供一个类的构造函数,则C++提供一个默认的构造函数,该函数是无参构造函数,它不做任何初始化。 只要一个类定义了一个构造函数,C++就不再提供默认的构造函数。即如果为类定义了一个带参数的构造函数,还要无参构造函数,就必须自己定义。

  • 在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能。

默认参数值功能

在定义构造函数时,可以给括号内形参赋初值。在构造函数内,如果没有对某些参数进行赋值,那么在实例化后这些参数将获得默认值。但是,一旦这样定义构造函数后,该函数就已经包括了不同形参个数的情况。即不允许再定义产生歧义的函数,否则编译器不知道在调用时该使用哪个函数。

c++对一般的函数都允许有默认参数值功能。默认参数值一定要从右往左写,如int func(int a, int b = 0,int c = 0)这就是可以的,如int func(int a = 0,int b,int c = 0)这就是不可以的。在调用这个函数的时候,如果传入的形参的个数足够,那么就不会赋默认值了。如果少了一个形参,那么最右边一个形参会被赋默认值。少了两个最右边两个就被赋默认值。以此类推。即传入的值从左往右读,默认值从右往左赋。

注:设置默认值时在类外编写函数内容时要只在函数声明中设置默认值,而不在函数编写时二次设置。

默认参数值补充:

  1. C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替

  2. 函数默认参数的规则

    只有参数列表后面部分的参数才可以提供默认参数值

    一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值

    在默认参数规则,如果默认参数出现,那么右边的都必须有默认参数

引用

引用就是给变量起个别名,改变这个别名等同于对其本身做操作;引用变量的主要用途是用作函数的形参。

引用只能引用变量,不能引用常量和表达式

引用的声明方法:类型标识符 &引用名=目标变量名

引用变量和其所指向的变量指向相同的值和内存单元

&符号:指示变量的地址

C++给&符号赋予了另一个含义,将其用来声明引用。

必须在声明引用变量时进行初始化,不可以先声明后赋值

初始化后会一直引用该变量

当声明一个引用后,不可以再使其成为另一个变量的引用

&前面没有类型是取地址(b=&a;把a的地址赋值给b)
&前面有类型是引用(int & b = a;给a取一个叫做b的别名)

使用引用的优点—避免拷贝:

  • 拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型(包括IO类型在内)根本就不支持拷贝操作。当某种类型不支持拷贝操作时,函数只能通过引用形参访问该类型的对象。举个例子,编写一个函数比较两个string对象的长度,因为string对象可能会非常长,所以我们应该尽量避免直接拷贝它们,这时使用引用形参是比较明智的选择。

引用和指针的区别

本质上:引用是别名;指针是地址。

具体的:

  1. 从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。

  2. 从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值。

  3. 从编译上看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说引用可以被认为是不能改变的指针。

  4. 不存在指向空值的引用这个事实,意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。

  5. 理论上,对于指针的级数没有限制,但是引用只能是一级。如下:

int** p1;  // 合法。指向指针的指针int*& p2;  // 合法。指向指针的引用int&* p3;  // 非法。指向引用的指针是非法的int&& p4;  // 非法。指向引用的引用是非法的

注意上述读法是从左到右。

  1. 指针和引用的自增符号(++)意义不同。指针的自增符号表示指向下一个内存地址,引用的自增符号表示引用的变量加一。
  2. 引用过程会进行类型检查,指针不会进行类型检查,引用相对来说更加安全。
  3. 指针和引用区别的讨论,点击查看

C++助教篇3_Week2不完全知识点相关推荐

  1. 【运维篇】运维知识点

    容器 容器和虚拟机的区别 1.容器技术简介 对于容器,它首先是一个相对独立的运行环境,在这一点有点类似于虚拟机,但是不像虚拟机那样彻底.在容器内,应该最小化其对外界的影响,比如不能在容器内把宿主机上的 ...

  2. 【mysql篇】mysql数据库知识点(四种语言)

    mysql数据库语言分为四种DDL,DQL,DML,DCL下面我们一一介绍: 注:(上图取自黑马程序员的课程APP中,这些笔记也是看了黑马程序员的课程之后做的): 一,       DDL(data ...

  3. 【MyBatis】MyBatis是什么?能干什么?一篇学习MyBatis,知识点详细解释,实例演示

    文章目录 MyBatis 1.简介 1.1 什么是MyBatis? 1.2 如何获得MyBatis? 1.3 持久化? 1.4 持久层? 1.5 为什么需要Mybatis? 2.第一个MyBatis程 ...

  4. Java知识点总结《努力篇上》

    小聊:本文主要编辑小白学习 Java 时感觉重要的.容易忘掉的的细节小知识或者知识补充.想着会对学习和使用 Java 的查漏补缺很有帮助,就一点点记录下来了,内容比较多的知识点会另外写文章放在本专栏, ...

  5. C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版)

    C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版) 前言: 小编之前有跟大家分享过一篇架构师体系知识点总结的文章,今天在原来的基础上有所改变更新(2021版). ...

  6. C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2022架构师篇完整版)

    C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版) 前言: 小编之前有跟大家分享过一篇架构师体系知识点总结的文章,今天在原来的基础上有所改变更新(2021版). ...

  7. 嵌入式面试知识点总结 -- C语言篇

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/115716559 之前有写过 日常生活 – 嵌入式面试 ,讲了面试大部分都会问哪些问题. ...

  8. 【杂谈】篇篇精华,有三AI不得不看的技术综述(超过100篇核心干货)

    文/编辑 | 言有三 有三AI很少写零散的报导,因为我们的文章通常都是提炼与总结,一般遇到一个新方向,找技术综述读一读是最合适的开始,大家也可以拓展一下自己的知识边界,今天总结一下有三AI迄今为止发过 ...

  9. 【杂谈】循序渐进,有三AI不得不看的技术综述(超过100篇核心干货)

    文/编辑 | 言有三 有三AI很少写零散的报导,因为我们的文章通常都是提炼与总结,一般遇到一个新方向,找技术综述读一读是最合适的开始,大家也可以拓展一下自己的知识边界,今天总结一下有三AI迄今为止发过 ...

最新文章

  1. 更改innodb_page_size状态值
  2. MyBatis 插入数据库返回主键
  3. 美观实用的标签切换菜单
  4. .Net Core使用Ocelot网关(二) -鉴权认证
  5. 【渝粤教育】国家开放大学2018年春季 0222-21T模拟电子电路 参考试题
  6. 推荐几款好用的富文本编辑器
  7. 拷贝相同属性的两个对象的属性-BeanUtils和PropertyUtils以及区别
  8. 【常用类】字符串:String的构造方法、字符串是常量,String类的判断、 获取、转换、和其他功能、它的值在创建后不能被改变、new与不new的区别、字符串相加的情况、
  9. 10、【易混淆概念集】-第六章1 三点估算 类比估算和参数估算的区别 储备分析 历时估算 项目进度网络图
  10. ue编辑器编辑 html文件夹,ue编辑器使用教学,轻松编辑文本和项目
  11. bootstrop table api
  12. sqlite3:深入理解sqlite3_stmt 机制
  13. 前端bugger 后端debug 介绍系统内部逻辑 压测新增订单接口 tps上不去 ,oom ,常见性能问题 ,性能分析思路
  14. 帆软大屏背景怎么设置_FineReport报表工具增加动态背景色
  15. 联想小新13pro锐龙版网卡_联想小新Pro13 锐龙版简测
  16. 什么是EMO?我emo了是什么意思?
  17. BootStrap框架-旅游网页设计
  18. #笔记-面向对象基础知识
  19. 热门Epub阅读器介绍
  20. Unity3D类人动画humanoid animations

热门文章

  1. 基于S3C2440丛SD卡启动WinCE(或其它程序)的实现
  2. 计算机加法的电路原理及proteus仿真
  3. ORACLE违反协议异常
  4. GBF ASIA亚太电池展
  5. linux管理web项目目录结构图,WEB项目管理完整.doc
  6. 关于solidity解析abi方法,入参和结果字节码
  7. 阿里云ca证书申请和安装(Nginx)
  8. U盘里的文件都变成了.exe文件
  9. Landsat Collection 2 T1一级数据详细介绍(数据处理过程和几何精度)
  10. 如何用python做数据分析实战_10分钟实战python简单数据分析