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

8. Data Member的绑定

考虑下面的一段程序代码

//某个foo.h头文件,从某处含入
extern float x;
//程序员的Point3d.h文件
class Point3d
{
public:Point3d(float, float, float);//问题:被传回和设定的x是哪一个x呢?float X() const {return x;}void X(float new_x) const {x = new_x;}//...
private:float x,y,z;
};

如果我问你Point3d::X()传回哪一个x?是class内部的x,还是外部(extern)那个x?今天每个人都会回答我是内部哪一个。这个答案是正确的。但这并不一直都是正确的,而是C++2.0的Reference manual修订后才是正确的。这个古老的语言规则被称为“member rewriting rule”,大意是“一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值(evaluated)的”。也就是说,就像下面的代码这样的效果。

extern int x;
class Point3d
{
public:...//对于函数本体的分析将会延迟,直到//class声明的右大括号出现才开始。float X() const {return x;}
private:float x;...
};
//事实上,分析在这里进行

然而。这对于member function的argument list并不是真的。Argument list中的名称还是会在他们第一次遭遇时被适当的决议(resolved)了。

typedef int length;
class Point3d
{
public://length 被决议(resolved)为global//没问题:_val被决议(resolved)为Point3d::_valvoid mumble(length val){_val = val;}length mumble(){return _val;}
private://length 必须在本class对它的第一参考操作之前被看见//这样的声明将使先前的参考操作不合法typedef float length;length _val;//...
};

上面的代码实际的过程中会编译报错。length的类型在两个member function signatures中被决议(resolve)为global typedef,也就是int。当后续再有length的nested typedef声明出现时,C++ Standard就把稍早的绑定标记为非法。


http://www.mrgr.cn/news/33378.html

相关文章:

  • 零基础Java第十六期:抽象类接口(二)
  • from sklearn.preprocessing import Imputer.处理缺失数据的工具
  • Spring框架之责任链模式 (Chain of Responsibility Pattern)
  • AGI自学分享,简单有用的理论与实践
  • SQL Server 查询设置 - LIKE/DISTINCT/HAVING/排序
  • 视频孪生技术在金融银行网点场景中的应用价值
  • 国产游戏技术能否引领全球【终稿】
  • CompletableFuture如何优雅处理异步任务超时!妙就完了
  • 国人卖家可折叠无线充电器发起TRO专利维权,功能相同可能侵权
  • 【深入学习Redis丨第六篇】Redis哨兵模式与操作详解
  • 图神经网络的新篇章:通用、强大、可扩展的图变换器
  • WebGL基础知识快速入门
  • 空栈压数 - 华为OD统一考试(E卷)
  • thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)
  • 【shell脚本4】Shell脚本学习--字符串和数组
  • 掌控历史:如何通过Git版本管理工具提升你的开发效率
  • 2024华为杯E题成品文章已出!
  • 【AI算法岗面试八股面经【超全整理】——深度学习】
  • 软件开发事故分级极简理解(灾难级、高级、中级、轻微级)
  • 学习C4模型的新网站
  • 【langchain学习】深度解析:Langchain TextSplitter 与新型正则表达式分割器的性能对比
  • 单片机原理及应用详解
  • Redis数据结构之set
  • 校园美食导航:Spring Boot技术的美食发现之旅
  • 【416】【举报垃圾信息】
  • 漏洞复现_永恒之蓝