1、一般来说,类的私有成员只能在类的内部访问,类外的函数是不能访问它们的。 但是,可以将一个函数定义为类的友元函数,这时该函数就可以访问该类的私有成员了。
  • 友元之普通函数(非成员函数,自由函数)
  • 友元之成员函数,,用到类的前向声明---->声明的是一个不完全的类。
  • 友元之类。friend  Line 或friend class Line
  • 友元关系是单向的关系。不能传递,是不可继承的。
  • 只有两个有强相关的时候,才使用,一般不使用。
2、运算符重载
总原则目的:为了使对用户自定义数据类型的数据的操作与内置的数据类型的数据的操作形式一致。--->例子:复数。
内置类型 (8 种):
 >int /char / short / long /float /double /bool /
 > C++ 定义内置类本身具有复制语义 。值语义(复制语义),不能进行(禁止)复制的类,对象语义
  • 不能重载的运算符有:   (带点的不能重载
  • 成员访问符  .
  • 成员指针访问运算符  .*   
  • 域运算符  ::   
  • 长度运算符  sizeof
  • 条件运算符号  ?:      

重载规则
  1. 不能对内置类型的运算符进行重载
  2. 重载操作符必须具有一个自定义类类型或者是枚举类型的操作数 int operator+(int, int);//不能重载
  3. 优先级和结合性是固定的,操作符的优先级、结合性或操作数个数不能改变 X == Y + Z;
   4.  如果一旦重载了逻辑运算符,则它不再具备短路求值特性 ,不建议重载逻辑运算符。重载操作符并不保证操作数的求值顺序  &&  ||  。
   5、对于绝大多数可重载操作符来说,两种重载形式都是允许的。但对下标运算符[] 、赋值运算符=、函数调用运算符()、指针运算符->,只能使用成员函数形式。

运算符重载的方式分为下面3种:   
1. 采用普通函数(自由函数)的重载形式   -->  +  -  *  / 
2. 采用友元函数的重载形式  --->   +  -  *  /  
3. 采用成员函数的重载形式 
--->    复合运算符 +=  ++   --    复制运算符  =    operator new/delete
函数调用运算符  ()  --->函数对象
[  ]   --->下标访问运算符
 
右值,在操作符的右边,同理,左值。
  • +=   -= 建议使用成员函数重载。 -->对于复合赋值运算符。自增,自减运算符。(对于重载来说,前置++,更容易实现,可以返回& ,complex & operator++( )。对于后置++ 不能返回引用了,写成,Complex operator ++(int) //int不代表一个参数,只是作为一个标志,与前置++做区别)  所以,能够使用前置的时候,就不要使用后置。(因为前置++ 的效率高于后置++)特别是在迭代器的时候。
  • 对于+ - * 、可以使用自由函数或friend重载。
  • 对于绝大多数可重载操作符来说,两种重载形式都是允许的。但对下标运算符[] 、赋值运算符=、函数调用运算符()、指针运算符->,只能使用成员函数形式。
  • 函数调用运算符()同样只能重载为成员函数形式,返回类型 operator()(arg1,arg2,……)     参数个数可以有多个,没有限制。  这里的对象是一个函数对象,它是重载了函数调用运算符的类创建的对象。
  • 下标运算符[ ]    返回类型& operator[ ](参数类型); 下标运算符的重载函数只能有一个参数,不过该参数并没有类型限制,任何类型都可以,如果类中未重载下标运算符,编译器将会给出下标运算符的缺省定义。
3、运算符重载--->续
  • 输入>> 输出 <<的重载
    • 输入输出流运算符第一个参数要求是流类型(ostream , istream) ,而如果作为成员函数存在,则它的第一个参数是this 指针,故不能以成员函数重载,建议以自由函数,且为友元函数。
    • 流对象是不能进行复制的。故只能返回引用。不能返回一个类型。
    • 注意参数类型时i,不修改的才能加const ,要修改的不能加const 。
  • 指针运算符 -> 和 * 的重载
    • 在智能指针时,还会讲解,有应用。
  • 类型转换
    • 转换场合有:
      • 赋值转换 表达式中的转换 显式转换
      • 函数调用,
      • 传递参数时的转换
    • 转换方向有:
      • 由定义类向其他类型的转换
      • 由其他类型向定义类的转换
  • 由其他类型(如int、double)等向自定义类的转换是由构造函数来实现的
  • 类型转换函数
    • 在类中定义类型转换函数的形式一般为:
    • operator 目标类型名();
    • 有以下几个使用要点:
    • 转换函数必须是成员函数,不能是友元形式。
    • 转换函数不能指定返回类型,但在函数体内必须用return语句以传值方式返回一个目标类型的变量。
    • 转换函数不能有参数
    • 尽量不要多使用,违反直觉思维的。
  • 类作用域
    • 在类中定义的成员变量和成员函数的作用域是整个类
    • (1)全局作用域 在函数和其他类定义的外部定义的类称为全局类
    • (2)类作用域(类中类、嵌套类)               一个类可以定义在另一类的定义中,这是所谓嵌套类,---> 嵌套类可以用来封装。
    • PIMPL设计模式    ---->了解一下。
      • 实现信息隐藏
      • 能够保证接口的稳定性,内部的实现做任何变化都不会影响使用该头文件的程序,可以最小的变化做到平滑升级库的目的。
      • 减小编译的依赖。
    • 块作用域 类的定义在代码块中,这是所谓局部类,该类完全被块包含,其作用域仅仅限于定义所在块,不能在块外使用类名声明该类的对象
4、写时复制 (Copy -on -Write)
 ---->    编程界“懒惰行为”——拖延战术的产物
GNU-GCC 5.X.X  --->  String类也有应用,SSO (短字符串优先)short string optimazation 
GNU-GCC  4.X.X  ---->COW ( 写时复制 )
表达复制语义时,才是写时复制。
比如:fork( )中就有体现。
  • 我们把引用计数放在上面,采用将引用计数放在字符串的‘\0’的后一位。
  • 引用计数加减一,用函数封装,在复制构造函数时需要先浅拷贝,在加一。
  • 赋值运算符,如果不是自赋值,先左操作数,引用计数减一,判断是否为0,若是,在delete  ,浅拷贝,在右操作数计数加一。在返回。
  • 用 [ ]重载后,用来修改,如果引用大于1,就原来引用减去1,然后开空间,在去复制,,在浅拷贝(修改指向),在初始化新的引用计数。

C++学习笔记系列四相关推荐

  1. Android学习笔记系列四2 —— Activity的生命周期

    2019独角兽企业重金招聘Python工程师标准>>> 启动一个Activity 使用startActivity(Intent intent). intent指定了你想要启动的act ...

  2. SQL Server 2008/2012中SQL应用系列及BI学习笔记系列--目录索引

    SQL Server 2008中的一些特性总结及BI学习笔记系列,欢迎与邀月交流. 3w@live.cn  ◆0.SQL应用系列 1.SQL Server 2008中SQL增强之一:Values新用途 ...

  3. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  4. BizTalk学习笔记系列之二:实例说明如何使用BizTalk

    BizTalk学习笔记系列之二:实例说明如何使用BizTalk --.BizTalk学习笔记系列之二<?XML:NAMESPACE PREFIX = O /> Aaron.Gao,2006 ...

  5. SQLServer学习笔记系列2

    SQLServer学习笔记系列2 一.写在前面的话 继上一次SQLServer学习笔记系列1http://www.cnblogs.com/liupeng61624/p/4354983.html以后,继 ...

  6. Windows x64内核学习笔记(四)—— 9-9-9-9-12分页

    Windows x64内核学习笔记(四)-- 9-9-9-9-12分页 前言 9-9-9-9-12分页 实验一:线性地址转物理地址 页表基址 定位基址 PTE to PXE 实验二:通过页表基址定位各 ...

  7. Intel VT学习笔记(四)—— VMCS(下)

    Intel VT学习笔记(四)-- VMCS(下) 要点回顾 VM-Exit Information Guest state fields 代码实现 参考资料 要点回顾 在上一篇中,我们了解了如何设置 ...

  8. 数据结构学习笔记(四):重识数组(Array)

    目录 1 数组通过索引访问元素的原理 1.1 内存空间的连续性 1.2 数据类型的同一性 2 数组与链表增删查操作特性的对比 2.1 数组与链表的共性与差异 2.2 数组与链表增删查特性差异的原理 3 ...

  9. 《Go语言圣经》学习笔记 第四章 复合数据类型

    <Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...

最新文章

  1. java startswith忽略大小写_Java String startsWith()方法与示例
  2. 【Linux】一步一步学Linux——jobs命令(129)
  3. 双曲线和直线联立公式_圆锥曲线联解公式
  4. PHP苹果不给上架,苹果商城上架拒绝
  5. 面向对象(OOP)一
  6. DreamFactory入门指南
  7. 网友调侃特斯拉股价要冲向火星 马斯克:疯狂的时代
  8. json.decoder.JSONDecodeError: Expecting ‘,‘ delimiter: line xx column xx (char xxx)
  9. Matlab rand randn randint
  10. mysql时间总结_MYSQL日期时间总结
  11. net.java.html.boot.BrowserBuilder
  12. 河南省邓州市计算机学校,2019年邓州市职业技术学校招生简章及招生专业
  13. 加解密:MD5DesAesRSARSA C#和Java适配
  14. C#中背景图片布局设置
  15. POJ 3580 SuperMemo(伸展树的几个基本操作)
  16. 基于OXC的光电联动全光网组网方案研究与实践
  17. 移动硬盘损坏怎么恢复?看完再也不怕丢失数据
  18. 基于springboot+jsp的服装穿搭信息管理系统
  19. c语言控制台数字键打地鼠,C语言编程打地鼠
  20. FTP上传下载端口号

热门文章

  1. HDU 4027 Can you answer these queries?(线段树/区间不等更新)
  2. git revert
  3. 如何在android模拟器中安装apk
  4. 通过修改explorer.exe内存隐藏文件及注册表项
  5. webp转换gif_用 WebP 创建尺寸更小、细节更丰富的图片,以此来提高网站的速度...
  6. java程序员_Java和Python的区别 好程序员帮大家解读
  7. 游戏笔记本计算机购买,2021大学生买电脑,容易犯的七种错误!游戏本和轻薄本买哪个?...
  8. java中数据类型转换、ASCII编码
  9. CentOS 7安装Development Tools 失败 报错 group tools does not exist. Maybe run: yum groups mark install
  10. MySQL高级篇(事务视图存储过程与函数)