C++中“swap2”: 对重载swap函数怎么用的调用不明确

实验前言(建议认真阅读) 一、仩机实验的目的 上机实验的目的是提高学生的分析问题、解决问题的能力和动手能力通过实践环节理解C++语言的基本结构和程序设计方法。通过亲手编程掌握C++语言编程的方法 二、实验基本内容 为了使学生在上机实验时目标明确,本实验指导书针对课程内容编写了五个实验学生在课内机时先完成指导书中标有“*”号的程序,理解所学的知识在此基础上再编写其他应用程序。 指导书中的五个个实验如下: 1. swap函数怎么用与编译处理 2. 指针与引用 3. 类和对象 4. 继承和派生类 5. 多态性 三、实验提交(特别提醒) 1. 实验题目以附件形式提交每个附件限一个源程序,附件以实验编号-题号-自己学号.cpp命名;如学号同学提交实验1的第5题则附件命名方式为:1-5cpp,错误提交的将视为未提交 2. 提交时间定为該次实验课的一周内,过期不再接收 四、评分和作弊处理 1. 要求提交实验题总数为6题(带“*” 号),占期末总评成绩的20%; 2. 存在抄袭和被莏袭的作业无论抄袭与被抄袭者,本门课程平时成绩以零分记存在两次及两次以上抄袭和被抄袭者,本门课程以不及格记 五、实验課要求(重点强调) 1. 严禁QQ、MSN等即时软件工具聊天; 2. 严紧接听手机、发送短信; 3. 严紧玩游戏。 实验1 swap函数怎么用与编译处理 一、实验目的 1. 掌握swap函数怎么用声明、定义和使用的方法; 2. 掌握形参与实参之间的对应关系; 3. 掌握swap函数怎么用调用时形参、实参之间的“值传递”和“引用傳递”的区别; 4. 掌握swap函数怎么用递归调用的方法; 5. 掌握全局变量、局部变量、静态变量的使用方法; 6. 掌握文件包含的使用方法。 二、实验內容 1. 定义两个swap函数怎么用swap1和swap2目的是实现两个整数的次序交换,其中swap1的参数是传递值参数swap2的参数是引用参数,在程序中分别调用这两个swap函数怎么用其输出结果如下所示: 初始值 :x=1,y=2 调用swap1后的结果:x=1 y=2 调用swap2后的结果:x=2 y=1 2. 编写一个swap函数怎么用,用来计算从键盘上输入的整数的阶乘 3. 编写swap函数怎么用判断一个数是否是素数,在主程序中实现输入、输出 4. 编写一个程序,设计一个swap函数怎么用可以计算并返回输入的4个数嘚平均值 *5. 给定某个年、月、日的值,例如2005年7月11日,计算出这一天属于该年的第几天要求写出计算闰年的swap函数怎么用和计算日期的swap函數怎么用。 三、实验要求 1. 结合上课内容写出程序、调试程序,使用典型数据测试程序并就实验结果加以分析。 2. 整理上机步骤总结经驗和体会。 3. 完成实验并上交程序。 实验2 指针与引用 一、实验目的 1. 熟练掌握指针、地址、指针类型、void指针、空指针等概念; 2. 熟练掌握指针變量的定义和初始化、指针的间接访问、指针的加减运算和指针表达式; 3. 会使用数组的指针和指向的指针变量; 4. 会使用字符串的指针和指姠字符串的指针变量; 5. 学会使用指向swap函数怎么用的指针变量; 6. 了解指针与链表关系 二、实验内容 1. 编写一个swap函数怎么用f,将传入此swap函数怎麼用的直角坐标值转换为极坐标值并返回主调swap函数怎么用中。求极坐标的公式是: c= q=arctan(y/x) 若要将两值返回主调swap函数怎么用有多种方式可以完荿,请试之: (1)两值均以指针形参带回 (2)由指针形参带回一个值swap函数怎么用值返回另一个值 (3)两值均以引用形参返回 (提示:程序中可以使用库swap函数怎么用sprt、pow及atan,它们的头文件为math.h) ? 2. 使用指针变量对一字符串按照字母空格、数字和其他字符进行分类统计( 提示:读┅行字符包括空格用swap函数怎么用cin.getline(ch, 81) )。 3. 用指针变量设计一通用swap函数怎么用该swap函数怎么用查找实型数组中最大和最小元素并输出相应元素和丅标。 ? 三、实验要求 1. 结合上课内容写出程序、调试程序,使用典型数据测试程序并就实验结果加以分析。 2. 整理上机步骤总结经验和體会。 3. 完成实验并上交程序。 实验3 类和对象 一、实验目的 1. 掌握类的概念、类的定义格式、类的成员属性和类的封装性; 2. 掌握对象的定义; 3. 理解类的成员的访问控制的含义公有、私有和保护成员的区别; 4. 掌握构造swap函数怎么用和析构swap函数怎么用的含义与作用、定义方式和实現,能够根据要求正确定义和重载构造swap函数怎么用能够根据给定的要求定义类并实现类的成员swap函数怎么用; 5. 掌握友元swap函数怎么用的含义,友元swap函数怎么用和成员swap函数怎么用的区别

到目前为止C++ 仍然是计算机编程領域的经典语言之一,C++ 17 标准在2017上半年已经讨论确定本期我们汇集了编程专家——祁宇(《深入应用 C++ 11》作者,C++ 开源社区 /apolukhin/magic_get)这个库也准备進入 boost。我们来看看 magic _ get 的使用示例

 
上面的代码在编译期将类型 int 和 char 做了一个编码,将类型转换为一个具体的编译期常量后面就可以根据这些編译期常量来获取对应的具体类型。
编译期根据 id 获取 type 的代码如下:
 
上面的代码中 id _ to _ type 返回的是 id 对应的类型的实例如果要获取 id 对应的类型还需偠通过 decltype 推导出来。magic _ get 通过一个宏将 pod 基本类型都做了一个编码以实现 type 和 id 在编译期的相互转换。
 
将类型编码之后保存在哪里以及如何取出来昰接着要解决的问题。magic _ get 通过定义一个 array 来保存结构体字段类型 id
 
array 中的定长数组 data 中保存字段类型对应的 id,数组下标就是字段在结构体中的位置索引

萃取 pod 结构体字段

 
前面介绍了如何实现字段类型的保存和获取,那么这个字段类型是如何从 pod 结构体中萃取出来的呢具体的做法分为彡步:
  • 定义一个保存字段类型 id 的 array;
  • 将 pod 的字段类型转换为对应的 id,按顺序保存到 array 中;
  • 筛除 array 中多余的部分
 
 
定义 array 时需要定义一个固定的数组长喥,长度为多少合适呢应按结构体最多的字段数来确定。因为结构体的字段数最多为 sizeof(T)所以 array 的长度设置为 sizeof(T)。array 中的元素全部初始化为0一般情况下,结构体字段数一般不会超过 array 的长度那么 array 中就就会出现多余的元素,所以还需要将 array 中多余的字段移除只保存有效的字段类型 id。具体的做法是计算出 array 中非零的元素有多少接着再把非零的元素赋给一个新的 array。下面是计算 array 非零元素个数同样是借助 constexpr 实现编译期计算。
 

 

 
这个结构体比较特殊我们先把它简化一下。
这个结构体的特殊之处在于它可以用来构造任意 pod 类型比如 int、char、double 等类型。
因为 ubiq 构造swap函数怎麼用所需要的类型由编译器自动推断出来所以它能构造任意 pod 类型。通过 ubiq 结构体获取了需要构造的类型之后我们还需要将这个类型转换為 id 按顺序保存到定长数组中。
 
上面的代码中先将编译器推导出来的类型转换为 id然后保存到数组下标为 I 的位置。
 


将 pod 结构体字段 id 保存到数组Φ之后接下来就需要将数组中的 id 列表转换为 tuple 了。
 
pod 字段 id 序列转换为 tuple 的具体做法分为两步:
 
下面是具体的实现代码:
 
 
id _ to _ type 返回的是某个 id 对应的类型实例所以还需要 decltype 来推导类型。这样我们就可以根据 T 来获取一个 tuple 类型了接下来是要将 T 的值赋给 tuple,然后就可以根据索引来访问 T 的字段了
 
对于 clang 编译器,pod 结构体是可以直接转换为 std::tuple 的所以对于 clang 编译器来说,到这一步就结束了
 
然而,对于其他编译器如 msvc 或者 gcc,tuple 的内存并不是連续的不能直接将 T 转换为 tuple,所以更通用的做法是先做一个内存连续的 tuple然后就可以将 T 直接转换为 tuple 了。
 
下面是实现内存连续的 tuple 代码:
 
 
这样僦可以通过 get 就可以获取 tuple 中的元素了
到此,magic _ get 的核心代码分析完了由于实际的代码会更复杂,为了让读者能更容易看懂我选取的是简化蝂的代码,完整的代码可以参考 GitHub 上的 或者简化版的代码
 
get 无需额外的负担和代码就可以实现编译期反射的特点,很适合做 ORM 数据库访问引擎囷通用的序列化/反序列化库我相信还有更多潜力和应用等待我们去发掘。
Modern C++ 的一些看似平淡无奇的特性组合在一起就能产生神奇的魔力讓人不禁赞叹 Modern C++ 蕴藏了无限的可能性与神奇。
 
 
 
 
 
 

我要回帖

更多关于 swap函数怎么用 的文章

 

随机推荐