当前位置: 首页 > news >正文

上海高端品牌网站建设专家公司要搭建网站

上海高端品牌网站建设专家,公司要搭建网站,如何建设网站论文文献,w3school网站建设教程前言 本文将介绍 C 继承体系下,函数缺省参数的绑定和函数访问说明符的绑定。这些奇怪的问题实际上不应在我们的代码中出现,但它们能帮助我们理解 C 的动态绑定和静态绑定,也能帮助我们更好的通过面试。 缺省参数值 先来看一段代码&#xf…

前言

本文将介绍 C++ 继承体系下,函数缺省参数的绑定和函数访问说明符的绑定。这些奇怪的问题实际上不应在我们的代码中出现,但它们能帮助我们理解 C++ 的动态绑定和静态绑定,也能帮助我们更好的通过面试。

缺省参数值

先来看一段代码:

class A {
public:virtual void fun(char ch = 'A') {cout << ch << endl;}
};class B : public A {
public:virtual void fun(char ch = 'B') {cout << ch << ch << endl;}
};int main() {A* pa = new B;pa->fun();return 0;
}

上述代码的运行结果是什么?是 A 还是 BB 呢?

很遗憾,都不是,代码的运行结果是 AA。

解释

发生这种现象的原因是:virtual 函数是动态绑定,而缺省参数是静态绑定。静态绑定又名前期绑定,在编译时确定;动态绑定又名后期绑定,在运行时确定。

cppreference 对这行为的解释:虚函数的覆盖函数不会从基类定义获得默认实参,而在进行虚函数调用时,默认实参根据对象的静态类型确定。

静态类型与动态类型:

A* pa = new B;	// 静态类型是 A*,动态类型是 B*
B* pb = new B;	// 静态类型是 B*,动态类型是 B*

对象的静态类型就是我们在代码中所写的类型,而动态类型则是指「目前所指对象的类型」。

这样也就能解释上述代码了,因为 a 的静态类型是 A*,在编译时,参数的缺省值绑定的是 ‘A’。而虚函数是动态绑定,取决于动态类型,绑定的是 B 类中重写后的函数实现。

为什么 C++ 采用了如此奇怪的方式运行?

答案在于运行期效率。如果缺省参数是动态绑定,编译器就必须有某种方法在运行期为 virtual 函数决定适当的参数缺省值。这比目前实行的「在编译期决定」的机制更慢而且更复杂。

访问说明符

下面来看一段更加奇怪的代码:

class A {
public:virtual void fun() {cout << "A" << endl;}
};class B : public A {
private:virtual void fun() {cout << "B" << endl;}
};int main() {A* pa = new B;pa->fun();B b;b.fun();return 0;
}

上述代码的运行结果是什么?

a->fun() 正确,并打印出 B;b.fun() 报编译错误,无法访问 private 成员。

解释

发生这种现象与访问说明符作用时间有关。

cppreference 对访问说明符的说明:

每个类成员(静态、非静态、函数、类型等)的名字都具有与其关联的「成员访问」。在程序的任何位置使用成员的名字时都会检查其访问,而且如果它不满足访问规则,那么程序不能编译。成员访问检查是对任何给定语言构造进行解释之后的最后一步。此规则的目的是使得以 public 替换任何 private 时始终不会改变程序的行为。

对虚函数的名字的访问规则,在调用点使用(用于代表调用该成员函数的对象的)表达式的类型进行检查,忽略最终覆盖函数的访问。

从上述表述,可以得出两点:

  1. 访问说明符只在编译时有效,当代码加载到内存后,没有任何访问说明符上的区别
  2. 虚函数的访问说明符,由调用该虚函数的对象的静态类型决定

这也就能解释上述代码了:

pa 的静态类型为 A*,A::fun() 是 public 的,可以调用。b 的静态类型是 B,B::fun() 是 private 的,不能调用。

http://www.yayakq.cn/news/828823/

相关文章:

  • 朝阳做网站哪家公司好做网站什么数据库用的多
  • 电子商务网站功能特点用vis做的简单网站
  • 网站建设分金手指专业二wordpress怎么放图片
  • 嘉兴网站制作设计搜索引擎优化的核心是
  • 怎样进行公司网站建设重庆点优定制网站建设
  • 宿州城市建设投资网站wap是什么意思?
  • 让公司做网站要注意什么计算机专业主要学什么课程
  • 里水网站设计腾讯云服务器怎么重启
  • 做网站以后的趋势知乎网站上放百度地图
  • 263网站建设怎么样小企业如何建网站
  • 珠海中企网站建设公司网站空间被挂马
  • 网站开发用什么字体一般wordpress管理用户插件
  • 重庆营销网站江门网站建设自助建站
  • 网站开发教程PDF微盘下载网站布局模式
  • 在电脑上建设个人网站深夜禁用直播app软件
  • seo怎么优化网站织梦本地做网站
  • 广州行业门户网站建设wordpress被改密码
  • 建设银行 u盾不弹出网站珠海网站系统建设
  • 室内设计培训网站常见的网站空间
  • 网站建设客户去哪找wordpress报错
  • 排版好看的网站界面优质专业建设申报网站
  • 免费注册com的网站内部购物券网站怎么做
  • 深圳大浪网站建设怎样做自己公司的网站
  • 网站开发宣传标语吴江网站建设收费
  • 网站建设内页用网站做邮箱吗
  • 太原市建设局网站首页动漫做3d游戏下载网站有哪些
  • 灵感中心素材网站汉服网站设计模板
  • 电商平台建设做网站wordpress 分销
  • 网站每年要交钱吗产品类网站模板
  • 河北省廊坊市建设网站粉末涂料 技术支持 东莞网站建设