二义性和C++消除二义性

article/2025/10/14 20:36:59

1.二义性

       二义性的定义是:“如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的。”(该定义来自于百度百科)用通俗的话讲,如果一句话或者一个符号具有两种以上的解释和含义,就说明该话或者符号具有二义性。二义性意味着含义不清和不明确。

       在计算机语言中,如果语言具有二义性,必须消除二义性,才能使程序正常运行。 

2.C++消除二义性

       C++中消除二义性的过程主要包括:1)重载消除二义性;2)和C语言混编消除二义性;3)多继承消除二义性。

1)重载消除二义性

       重载是C++等面向对象语言区别于C语言等纯面向过程语言的主要特性之一(随不是面向对象语言的三大特性之一)。泛型编程依赖于重载;作为静态多态的特性也依赖于重载。

       重载之所以能成功,是因为C++通过C++编译器,把同名函数转为不同的函数。也就是说,重载的同名函数,最终还是不同的函数。

       C++编译器在编译的时候,编译的规则如下:把同名函数,如void test() 和  void test(int),分别改为test()或_test 和 test(int) 或_test_int。       

void test(); //在编译器中改为test() 或 _test
void test(int); //在编译器中改为test(int) 或 _test_int

       这种改名方法,让C++可以重载同名函数。

       顺便说一下重载的意义:

       1)C++是一种强类型的语言,C++要保证类型的强制性;

       2)C++是一种面向对象语言,面向对象语言要使语言和抽象设计更加符合,和人类实际语言更加贴切;

       3)基于上面两个原则,重载才会存在。

2)C++和C混编消除二义性

        C++全部兼容了C语言的所有特性,C++是C语言的超集。但C++和C语言混编的时候,会出现各种问题。因为C语言本身不支持重载和多态,C语言的函数不存在改名或者始终是一个函数。这就会造成一个问题,如果C程序和C++混编,存在二义性问题。

       严格来说,C和C++混编的二义性,不是C程序造成的,而是C++对原来的纯C函数进行了改名。改名以后,原来的C程序找不到原来的函数,就会出现问题。

       为了避免该类问题,C++和C程序混编的时候,采用的方法是:C程序编译的时候,采用C语言的规则,并让C++编译器知道这部分程序是C语言的,并用C方法对C程序进行编译。

       使用方法为:使用extern "C"方法,让程序明白采用了C函数。通用规则如下;

        

#ifdef __cplusplus
extern "C" {
#endif.......#ifdef __cplusplus
}
#endif

3)多继承消除二义性

       C++支持多重继承,多重继承带来了便利,也带来了各种麻烦。(与愚蠢的C++(自嘲语,毕竟我靠C++吃饭这么长时间)相比,JAVA就避免了多重继承这个特性,并避免了这个麻烦)

       C++的多重继承问题,最主要体现为菱形继承。即基类被多个衍生类继承,多个衍生类被同一个子类继承。这会继承的子类最后出问题,即某个实体的含义不清楚。

       菱形继承图示如下:

         

      这样的多重继承,在最终类D里,会无法确定成员的含义。

      为了让大家理解多重继承的二义性,举个二义性的样例:

     

class Grand
{
public:Grand();~Grand();void fun();
};class FatherA: public Grand
{
public:FatherA();~FatherA();
};class FatherB: public Grand
{
public:FatherB();~FatherB();
};class Son: public FatherA, public FatherB
{
public:Son();~Son();
};int main(int argc, char *argv[])
{Son s;s.fun(); //二义性,因为不能确切属于哪个成员return 0;
}

       为了消除该二义性,方法如下:

       1)多重继承采用虚继承;

       2)采用 类名称::函数,即作用域加功能方法。

4.推广

       二义性问题其实在实践中广泛存在,并不仅仅属于C++和编程。这个问题属于任何领域。在工程中,消除任何意义的二义性,显然是一个工程师都应该做的。


http://chatgpt.dhexx.cn/article/yMnijjYc.shtml

相关文章

C++ 二义性是什么?怎么解决?

一、什么是二义性 在多继承的场景里,当父类中存在同名变量时,子类访问父类的同名变量,将出现二义性,因为编译器不知道你将要访问的是哪个父类中的变量。 举个例子: class A { public:int a; // B1,B2 都…

ES6一维数组去重,合并去重方法分享

ES6去重的几个小方法 1.使用set方法 2.setArray.from() 3.filtermap 4、Array.fromsetflatsort 排序去重 flat:对数组进行扁平化处理 sort:排序 b-a:倒序 a-b:正序 5.数组合并去重

[记录]es6常用去重方法(数组、字符串)

数组去重 ES6 ES6以下方法除了代码简洁外,对于undefined和NaN也同样可以达到去重的效果 new Set()是ES6新增的数据结构,类似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合,Set本身是一个构造函数,用来生成 Set 数据结构。 Set搭配扩展运算符 ……

JavaScript数组去重—ES6的两种方式

说明 JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript 数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种方法,代码可是足…

ES6 Set() 数组去重

ES6 Set()去重 Set。它类似于数组,但是成员的值都是唯一的 通过add()方法向 Set 结构加入成员 let arr [1,2,3,4,1,5,2,3]; var set2 new Set(); arr.forEach(item>{set2.add(item) }) console.log(set2); console.log(Array.from(set2));let str [测试1,测试…

ES6数组去重的三个简单办法

ES6数组去重的三个简单办法 简单说一下利用ES6实现数组去重的三个办法。 第一种: 利用Map对象和数组的filter方法 贴上相关代码 打印后的结果 通过打印我们发现,确实实现了我们想要的效果。那么下面简单来解释一下。 1.Map对象是ES6提供的一个新的数据结构&…

一文弄懂Python中的*args 和 **kwargs

1. 引言 在本文中,我们将讨论 Python 中的 *args 和 **kwargs 及其用法和示例。 闲话少说,我们直接开始吧。 2. 问题引入 在Python中写函数的时候,我们经常需要给函数传值,这些值被称为函数参数。 我们不妨来举个栗子&#xff…

**kwargs python_python中**kwargs怎么用?

1、使用两个星号是收集关键字参数,可以将参数收集到一个字典中,参数的名字是字典的 “键”,对应的参数的值是字典的 “值”。请看下面的例子:>>> def print_kwargs(**kwargs): ... print(kwargs) ... >>> pr…

Python技巧:​args 和 kwargs 原来这么强大

大家好,今天我给大家分享Python技巧:​args 和 kwargs的相关技巧。喜欢记得收藏、关注、点赞。 注:完整代码、资料、技术交流文末获取 现在args和 kwargs参数仍然是 Python 中非常有用的特性,而且理解它们的威力将使您成为更有效…

*args和**kwargs是什么意思

去面试的时候,做了一道笔试题——什么是*args和**kwargs,区别在哪里? 有点蒙,好像见过,但是不知道具体的意思。所以回来查了一下资料,做一下笔记。 总的来说,*args代表任何多个无名参数&#x…

埃及分数c语言设计,埃及分数(四)

最优分解 源程序 下面就是求埃及分数最优分解的 C 语言源程序 EgyptianFraction.c: 1: #include 2: #include 3: #include 4: 5: const int SIZE 64; 6: static int wp -1, bp -1; 7: static mpz_t z, w, work[SIZE], best[SIZE]; 8: static mpq_t q1, q2; 9:…

埃及分数问题

问题描述: 古埃及人喜欢用最少的分子为 1 的真分数来表示一个真分数,比如7 / 8 1 / 2 1 / 3 1 / 24 。设计程序把一个真分数表示为最少的埃及分数之和的形式。 思路: 首先要知道什么是真分数:真分数是指大于0小于1的所有分数。这些分数的特…

贪心算法之埃及分数问题

1.问题:给定一个分数,如7/8,我们可以把它表示为1/2 1/3 1/24,埃及分数问题即把一个真分数表示为最少的埃及分数之和的形式,输入一个真分数把其分解为埃及分数之和。 2.设计思路:设分数为a/b,则cb/a,db%a,…

【数模】相关性分析

相关性:如果一个变量的变化引起了另一个变量的变化 目录 一、四种基本变量 二、 相关性分析方法 1.Pearson相关系数 2.Spearman 等级相关系数 3.Kendall tua-b 等级相关系数 4.卡方检测 5.Eta系数 *SPSS操作 三、偏相关 1.SPSS操作 2.偏相关系数和检验&…

数学建模-相关性分析及热力图

目录 一、相关性分析 二、相关性分析实例 三、三种相关系数 3.1 Pearson线性相关系数 3.2 Kendall tau系数 3.3 Spearman相关系数 4、Matlab代码 4.1 Pearson 显著性检验 4.2 Pearson 相关系数矩阵 4.3 Kendalltau相关系数矩阵 4.4 Spearman相关系数矩阵 5、代码…

R语言基础——简单相关性分析(1)

简单相关性分析(1) 简介1. 协方差和相关系数1.1 协方差1.2 相关系数 2. 相关性分析参考 简介 初次接触相关性分析,在摸索中前进,也顺便将笔记记录下来,未雨绸缪嘛! 简单来说,相关性分析就是衡量…

分类变量、有序变量与数值变量相关性分析方法总结及 R 语言应用

文章目录 一、分类 & 分类相关性分析二、有序 & 有序相关性分析三、数值 & 数值相关性分析四、分类 & 有序相关性分析五、分类 & 数值相关性分析六、有序 & 数值相关性分析 本文全部假设显著性水平为0.05,特殊说明的除外。 一、分类 & …

数据分析方法和思维—相关性分析法

01 写在前面 在数据分析的问题中, 经常会遇见的一种问题就是相关的问题, 比如抖音短视频的产品经理经常要来问留存(是否留下来)和观看时长, 收藏的次数, 转发的次数, 关注的抖音博主数等等是否有相关性, 相关性有多大。 因为只有知道了哪些因素和留存比较…

python相关性分析_python实践统计学中的三大相关性系数,并绘制相关性分析的热力图...

本文首发地址: https://yishuihancheng.blog.csdn.net/article/details/83547648 欢迎关注我的博客【Together_CZ】,我是沂水寒城! 今天我简单地使用了scipy模块进行了统计学中三大相关性分析方法(皮尔森相关性系数、斯皮尔曼相…

数据相关性分析笔记

一、数据相关性的含义 数据类型 数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据。(ppt)数值型数据、分类型数据、定序数据。 数据相关性 数据相关性是指数据之间存在某种关系&#…