一个简单的string类——自动转换——Str操作——有些转换是危险的——类型转化操作函数——类型转换与内存管理——

一个简单的string类

通常情况下,一个不需要析构函数的类也不需要显示的定义复制构造函数或赋值运算符函数。

自动转换

C++自带的类型变量之间可以自动进行转换。例如:

double d=10;  //将10转换成double类型并用于初始化double变量d

double d2;

d2=10;         //将10转换成double类型并将它赋给double变量d2;

用户定义的转换(user-defined conversion):用户定义的转换定义了如何将一个其他类型转换成该类对象,以及反过来的操作。与C++自带的转换一样,编译器在使用用户定义的转换时会将一个值转换成程序需要的类型。

在类中定义类型转换包含两个方面的定义:将其他类型转换成该类类型,或者将该类类型转换成其他类型。而第一种可通过定义一个只带有一个参数的构造函数定义类型转换。

Str操作

“>>”,”<<”,”s[i]”,”s1+s2”都是二元运算符。如果我们将他们定义成为函数,每个函数都应该有两个参数,如果被定义的是一个成员函数,那么其中一个参数可以是隐式被提供的(如第11章所述)。

输入和输出运算符

对于二元运算符函数来说,其左操作数必须作为函数的第一个参数,有操作数必须作为函数的第二个参数。如果该运算符函数是成员函数,那么第一个参数(也就是左操作数)总是会默认的传递给该成员函数。

由之前的理论:判断一个函数为成员函数,就是判断他是否会改变对象状态。那么输入、出运算符会改变对象状态,照此应该作为成员函数,但是由于我们没有权限更改istream的权限,而且如果作为成员函数会将输入、出的书写形式将与库的语法规则不同。因此。输入和输出函数不能作为类的成员函数。

友元函数

友元函数:友元函数拥有与成员函数相同的访问能力。通过将输入运算符函数声明为Str类的友元函数,我们赋予了该函数与类的成员函数一样的对Str类私有成员的读写能力。

友元函数的声明可以加在类定义的任何地方:将他加在一个private标识后面与加在一个public标识后面没有任何区别。由于友元函数具有特殊的访问权利,因此它是类接口的一部分。也正是因为如此,一般在类声明的前面,Public接口的附近,会将全部友元函数的声明放在一起作为一个相对独立的组。

设计二元运算符

在二元运算符的设计中,参数转换的地位很重要。如果一个类支持转换,那么将二元运算符定义成非成员函数是一个很好的习惯。这样就可以保证两个操作数的对称性。

如果一个运算符函数是类的成员函数,那么这个运算符的左操作数不能是自动转换得到的结果。

对于成员运算符函数的操作数以及全部运算符函数的成员函数来说,都遵循与一般函数的参数相同的规律:操作数可以是任何一种能被转换成参数指定类型的类型。

通常是希望两个操作数是完全对称的,这就要求我们将运算符函数定义成一个成员函数。

有些转换是危险的

通常情况,我们总是将定义对象的结构的构造函数声明为explicit。有些构造函数的参数最后会变成对象的一部分,这些构造函数一般就不必要被声明为explicit。

类型转换操作函数

转换操作函数的函数名为operator加上目标类型名。类的编写者可以定义显示的类型转换操作,该操作定义了如何将一个对象从原来的类型转换成一个希望得到的类型。例如:如果有一个类有一个名为operator double的成员函数,这个成员函数可以用于将一个该类类型的变量转换成double类型的变量。

转换操作函数在将一个自定义类型转换成一个C++内建的类型时经常被调用,有时候也可以用他将一个类的类型转换成另一个我们没有代码类的类型。我们都不能往目标类中加入构造函数,只能在我们拥有代码的类中将转换函数定义成类的一部分。

一个指向void的指针有时候又被称为通用指针,这是一个可以指向任何类型对象的指针。

标准库允许将一个istream类型用作一个判断条件表达式,但是不能将它作为算术值使用。

类型转换与内存管理

没有explicit关键字声明的情况下,常量版本的任意类型可以隐式的转换为常量版本的该类型的引用。例如:

int a=4;

const int &b=a; //隐式转换

*作为类成员的模板函数:类可以将模板函数作为成员函数。这种类本身可以是模板类,也可以不是。一个拥有模板成员函数的类相当于拥有许多同名的成员函数。类的模板成员函数的声明方法与定义方法与其他的模板函数一样。

转载于:https://www.cnblogs.com/wenhuozhujiangcha/p/3523338.html

读书笔记——Accelerated C++ Chapter 12 使类对象获得数值功能相关推荐

  1. 《深入理解计算机系统》读书笔记-016(第 12 章 并发编程)

    <深入理解计算机系统>读书笔记-016(第 12 章 并发编程) 太惨了,这章真心不大看得懂啊--等把前面的补上之后把读书笔记重新整理一下吧.这样看了跟没看也没啥区别了. 在线程中,不同于 ...

  2. Java编程思想读书笔记——第七章:复用类

    第七章 复用类 使用类而不破坏现有程序代码,有两种达到这一目的的方法: 在新的类中产生现有类的对象,也就是说new一个对象,这种方法称为组合 按照现有类的类型来创建新类,不改变现有类的形式,在其基础上 ...

  3. 《Java编程思想》读书笔记之第7章-复用类

    第7章 复用类 什么是复用类:不必重复写以前写过的类功能,使代码可以重复利用,而不是每次从头开始写. 复用方法: 组合:在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以称之为组合.该 ...

  4. 读书笔记-人月神话12

    有多少书,我读过:有多少事,我做过:记录下学习的点点滴滴,每一天. 回顾一下经典,记录一下悟点. 读书笔记-人月神话 - 提纲挈领

  5. 读书笔记 之《Thinking in Java》(对象、集合)

    一.前言: 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说"书籍是人类 ...

  6. Java并发编程实战读书笔记(一)——线程安全性、对象共享

    一.线程安全性 一个对象是否需要是线程安全的,取决于它是否被多个线程访问. 当多个线程访问,并且其中有一个执行写入时,必须采用同步机制,Java中主要的同步关键字是 synchronized 独占加锁 ...

  7. php全局化标签,PHP – 在整个应用程序中使类对象全局化?

    有没有一种简单的方法可以在 PHP中为整个应用程序创建一个全局类对象?我需要我的课程才能在整个应用程序中实例化一次并让它100%工作. 谢谢. 编辑 决定Singleton模式是我需要的最好的想法,并 ...

  8. 读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用

    1. 什么样的接口才是好的接口 C++中充斥着接口:函数接口,类接口,模板接口.每个接口都是客户同你的代码进行交互的一种方法.假设你正在面对的是一些"讲道理"的人员,这些客户尝试把 ...

  9. 读书笔记:软件工程(12) - 传统方法学 – 软件建模-数据流图

    功能建模:数据流图 数据流图: 1.以图形的方式来描述系统中数据流程的活动状态.(这里的系统是指当前层用数据流图表示的整个抽象模型) 2.包含逻辑输入(输入的数据),逻辑输出(转换后输出的数据),加工 ...

最新文章

  1. Xamarin Andro教程搭建Xamarin Androidid开发环境(一)
  2. 在SQL Server 2005中解决死锁(转)
  3. JavaScript知识概要
  4. c++ cdi+示例_C ++中带有示例的本地类
  5. java前沿技术_互联网百强企业架构师告诉你,Java应该这么学!云和数据超全面Java中级程序员学习路线图重磅发布!...
  6. 企业级SpringBoot教程(十一)springboot集成swagger2,构建Restful API
  7. 《OpenGL编程指南(原书第9版)》——3.2 OpenGL缓存数据
  8. 线程执行者(八)执行者周期性地运行一个任务
  9. 学校为什么要单位接收函_学校让我签三方,居然是因为···
  10. 放弃 Google 搜索引擎,Firefox 欲用必应替代?
  11. SAS9.3安装经验
  12. 软件工程-可行性分析
  13. 高德地图:No implementation found for void com.autonavi.ae.gmap.GLMapEngine.nativeInitParam
  14. 一个很好用的桌面取色器和一个在线取色器
  15. 软件工程师成长为架构师必备的十项技能
  16. java导出csv文件,使用Excel打开中文乱码
  17. EL| EL表达式总结
  18. oracle创建交叉表,SQL交叉表常用实例(转载网络)
  19. python爬取拉钩网招聘信息分析
  20. 百度贴吧头像上传无尺寸限制

热门文章

  1. select a method for export 选项
  2. [李景山php]每天TP5-20161225|thinkphp5-Console.php-2
  3. easydialog中对js的修改
  4. linux用户和账号管理
  5. PlaceHolder和Panel的区别【搜藏】
  6. 蒙层禁止页面滚动的方案
  7. java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
  8. springboot增删改查案例_大神基于SpringBoot开发一个Restful服务,实现增删改查功能...
  9. cassandra 数据量_Cassandra和Spark的数据处理简介
  10. opensource项目_宣布2016年Opensource.com社区奖获奖者