C++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测
第一个程序
class myClass
{
public:myClass() {}double func(double n) { return n; }
private:int func(int n) { return n; }
};int main()
{myClass mc;mc.func(7); //报错return 0;
}
程序在编译的过程中会报错,而不是返回7,原因如下:
编译器在对func(7)这个调用进行决议时,主要做了三件事情,依次如下:
- 名字查找:在做其他事情之前,编译器会查找所有函数名为func的函数作为候选,查找时不受访问权限的限制,也就是说候选列表中有func(double)和func(int)两个函数。
- 重载决议:目的是在候选列表中找到唯一一个最佳匹配,程序中的参数为7,是int,所以选择的函数为func(int)。
可访问性检查:编译器进行访问行检测,确定被选定的函数是否可以被调用。
综上,在进行可访问性检查时发现,func(int)函数处于private作用域中,不能够被调用,所以在对func(7)进行调用时会报错。
编译过程会报错:无法访问private成员,函数myClass::func(int)不可访问。
第二个程序
class myClass
{
public:myClass() {}double func(double n) { return n; }
private:unsigned func(unsigned n) { return n; } //不是int而是unsigned
};int main()
{myClass mc;mc.func(7); //报错return 0;
}
在调用func(7)时同样会进行上述的三步决议,
- 名字查找:找到func(double)和func(unsigned)两个函数。
- 重载决议:由于7是int类型,在函数列表中没有一个函数与之匹配,所以出现二义性,即编译器也不知道选择哪个函数比较好。所以在重载决议时就会发生错误
- 可访问性检测:显然还没有检测可访问性就已经出错
编译过程会报错:对重载函数的调用不明确。
第三个程序
#include <string>int func(int); //全局函数class myClass
{
public:double test(){return func(7); //调用哪个?} private:std::string func(std::string) //类内部函数{return "hello world!";}
};int main()
{myClass mc;mc.test();
}
这个程序包含一个全局函数func(int),一个类内部的函数func(std::string);
程序通过test接口调用func(7)函数,同样也需要进行决议:
- 名字查找:名字查找的规则是倘若在一个作用域中找到至少一个名字匹配的函数,就不再去外层作用域中进行寻找。本程序中首先在类内部作用域中寻找,找到std::string func(std::string);函数,而后停止。换句话说,候选函数只有func(std::string);一个,而没有func(int);
- 重载决议:7是int类型,候选函数列表中没有与之匹配或者可以进行转换的函数,导致在重载决议处发生错误。
- 可访问性检测:仍然没有进行到这里。
编译过程会报错:没有从int到std::string的适当转换。
C++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测相关推荐
- C++学习笔记:(三)静态与名字空间
目录 5.静态与命名控制 5.1静态数据成员 5.2静态成员函数 5.3静态对象 5.4类作用域及对象的生存期 5.5命名空间 5.静态与命名控制 通常,在函数体内定义一个变量时,每次函数调用时编译器 ...
- 吴恩达神经网络和深度学习-学习笔记-21-何时该改变开发集+测试集或指标
需要我们改变开发集+测试集或指标的情况,是现有的指标或开发测试集并不能帮助我们选择出最好的模型! 如果你的评估指标,无法正确评估好算法的排名,那么就需要花时间定义一个新的评估指标. (加权来排除某一类 ...
- Windows驱动开发学习笔记(七)—— 多核同步内核重载
Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...
- Linux基本命令学习笔记--文件查看、下载、查找
1.Linux基本命令学习笔记–(文件查看) cat -整个查看 -n:行号 >(创建.覆盖) >>(追加)a.txt<<EOF:编写内容 内容 EOF (定格写:结束) ...
- C++学习记录:派生类向基类转换及其可访问性
知乎有很多博主学不会了一言不合就抄书,我觉得这对学习计算机科学是一样的. 这里说一个自己或许也有许多人都会也不太注意的点,派生类向基类转换及其可访问性,抄自<C++ Primer>. 派生 ...
- Unix网络编程学习笔记之第11章 名字与地址转换
一. 域名系统(DNS) 1. 简介 DNS主要用于主机名和IP地址之间的映射. 主机名可以是简单的名字ljm,也可以是全限定域名ljm.localdomainbaidu.com等. 2.资源记录 D ...
- Java 虚拟机学习笔记 | 运行时数据区总结
前言 要想学习好 Java,Java虚拟(JVM)的学习是绕不开的.学习 Java虚拟(JVM)首先就要先了解的就是Java虚拟(JVM)运行时数据区. 在Java语言和虚拟机规范中对运行时数据区进行 ...
- Linux学习笔记13:把网卡名字都修改成eth*
修改网卡名: 对于Centos6一般就不改了,默认就是eth*,那么网卡名在哪里定义? 在这个文件:/etc/udev/rules.d/70-persistent-net.rules 如图:指明了MA ...
- 学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案
今天在写单向链表实现线性表的时候打算重载输出运算符用来将线性表输出,结果无奈又遇到了问题. 大致代码如下 <pre name="code" class="cpp&q ...
最新文章
- 【区块链Go语言实现】区块链基本原型
- qrp文件如何用excel打开_问与答66: 如何不打开Excel文件删除行?
- 牛顿二项式定理计算平方根
- 向linux内核增加新的系统调用,为linux内核添加新的系统调用
- [Java]Java中的i++不是原子操作
- token拦截器android_vue.js添加拦截器,实现token认证(使用axios)
- SSM项目使用Idea打war包
- 爬虫python区别_Python爬虫-04:贴吧爬虫以及GET和POST的区别
- Thread 1: signal SIGABRT
- HTTP协议到底是怎么回事
- [置顶] ibatis框架----控制台输出SQL语句
- 一维搜索——进退法matlab实现(含代码)
- Spring Boot引起的“堆外内存泄漏”排查及经验总结 1
- 浅谈接龙红包的技术实现
- mysql排序检索数据
- 北京市平谷区谷歌卫星地图下载
- chm打不开解决办法
- 多旋翼智能飞行和视觉识别(H题)(组委会自命题)
- 了解HTTP和HTPS的S之差
- 客户价值分析(聚类)
热门文章
- c# json datatable_KoobooJson一款高性能且轻量的JSON库
- 【数据结构】—顺序表的插入、删除、查找操作
- Linux 内核 up down,信号量机制中的DOWN操作与UP操作详解
- 构建之法阅读笔记之速读篇
- 2011Google校园招聘笔试题
- ajax跨域请求Flask后台
- [leetcode]203. Remove Linked List Elements链表中删除节点
- Spring Caching集成Ehcache
- innerHTML,innerText
- 广播(broadcast)、电视与电视网络