1. 友元主要用于访问私有变量,友元函数跟所在位置的权限没有任何关系friend+函数声明

友元类通常设计为一种对数据操作或类之间传递消息的辅助类(注意一下顺序)

  1. Explicit就是要求严格的匹配,不允许转换适应,可以强转(最后的那一层一定至少披着同类型的外衣)
  2. 做类方面的重载的时候一定得考虑深浅拷贝的问题
  3. 流运算符的重载必须在类的外部
  4. 运算符重载:1.类的内部重载2.在类的外部重载(要配合friend)简称 友元重载

在每个类都重载了对应的操作之后,可以使用模板进行公共接口的创建

Template<class T>

Void show(T &t)

{ cout<<t<<endl;}

这样就把相同功能统一了接口

在类这个级别的重载运算符,其实就是把对基本数据的操作,整合提升为对类的操作

原则就是跟写函数的形式是一样的

6.在重载自增自减的时候,(int)搞一个填充位标识为后 重载是不改变优先级的

shortsafe  operator++(int) 先自增再引用(后自增的思路:创建一个临时对象记录当前状态,再自增原对象然后返回临时对象)

void operator++()先引用临时再自增原本 

对于运算符重载是不严格控制返回值或者参数的,          

7.赋值重载:主要用于类型转换,基本数据类型转换成类类型都是可以的

Void operator=(const myclass& my1)赋值重载(主要是下一阶段的赋值)

Myclass(const myclass&my1)拷贝构造(主要用于初始化阶段)

重载的精髓在于,你可以随心的控制接口的摆法,至于函数块的实现完全由你根据需求去实现

狭义的:只是用于类对象自己的拷贝和赋值

广义的而言:把参数换成对应的类型就可以生成对应的类型转换

说到底的总结:重载操作符还是重载构造函数:在面向过程向面向对象转换的这个阶段,由对基本数据类型的操作转换到对类类型对象的相关操作这个过程中,重载操作就是自定义许多的原子操作构成类操作

8.非指针深浅拷贝都一样,自己开辟了内存就得注意深浅拷贝

Myclass& operator=(const myclass& my1)赋值重载

返回类对象的时候,此时会调用拷贝构造函数,注意是否拷贝构造也重写了深拷贝

9.typeid(表达式).name()只会获取表达式的类型,但是不会对表达式进行计算

10,你在栈上创建一个对象,即使内部是用new创建的内存,在你返回对象的时候,对象还是无效的

参数都是引用,就不会调用拷贝构造(栈上创建的指针指向在堆上开辟的内存)

拷贝构造深拷贝,赋值重载深拷贝

对象在栈上有生命周期,拷贝栈上的对象,需要深拷贝

拷贝成员的返回值的深浅拷贝总结:

1.Void operator=(const myclass& my1)赋值重载(主要是下一阶段的赋值)

Myclass(const myclass&my1)拷贝构造(主要用于初始化阶段)

狭义的:只是用于类对象自己的拷贝和赋值

广义的而言:把参数换成对应的类型就可以生成对应的类型转换

2.赋值重载有返回值的时候(返回的直接是对象而不是引用或者指针),如果你在创建的对象是在栈上的话,此时返回的时候对象就会调用析构函数,(1).如果你的拷贝构造函数没有进行深拷贝重写,那么内存就会出错(此时指针指向的内容就已经释放掉了),(2)如果拷贝构造是深拷贝,那么流程就是:赋值重载->拷贝构造(当你在赋值重载有返回值的时候,你就得注意你的拷贝构造是否需要深拷贝)   (3)如果没有重载返回值的时候,你把析构函数的释放内存的那步给搞掉,那么程序还是可以继续运行。

3. 赋值重载有返回值的时候(指针或引用),是不会调用拷贝构造,但是你的对象必须是在堆上创建,只要是栈上创建的对象都会调用析构函数,一定会被销毁。一个被销毁的对象深浅拷贝都已经没有意义了。

4.在一个函数里面的一个对象实在栈上创建的,那么即使他的成员是在堆上开辟的那么只要函数块走完,析构函数就会完完整整的释放掉这段内存,(所以啊,看一个对象是否会在函数块结束的时候被销毁,就看这个对象创建的时候是在栈上还是在堆上,而不是看他的成员是否在堆上还是在栈上,因为成员的销毁与否,都由析构函数进行指挥)

11.内存四区:

成员函数,静态函数都在代码区,

全局对象,静态变量(只会初始化一次)在静态区

类的大小不算成员函数,静态成员

类中的非静态成员跟对象创建的位置相关

栈区,堆区

Myclass*p=new(指针)。。。。   什么区就跟指针的区相关

类中的const和类的成员数据一样

重载只要涉及到this指针的时候必须是成员函数=,[],(),->

重载的三种形式:

友元重载;涉及到私有或者保护变量

成员函数重载

一般函数重载:那么类一般都是公有成员

重点操作:

Strcpy()实现字符串的深拷贝

Strcat()实现字符串的拼接

宏观总结:在编译器会默认操作的如:delete[],运算符。。。。。这些已经嵌入到了编译器的底层,你需要做的懂是什么搞法,掌握套路即可

C++学习-9的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  10. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

随机推荐

  1. JMeter之Http协议接口性能测试

    一.不同角色眼中的接口 1.1,开发人员眼中的接口    1.2,测试人员眼中的接口 二.Http协议基本介绍 2.1,常见的接口协议 1.:2. :3. :4.:5.: 6. 2.2,Http协议栈 ...

  2. 关于 JS 拖拽功能的冲突问题及解决方法

    前言 我在之前写过关于 JS 拖拽的文章,实现方式和网上能搜到的方法大致相同,别无二致,但是在一次偶然的测试中发现,这种绑定事件的方式可能会和其它的拖拽事件产生冲突,由此产生了对于事件绑定的思考.本文 ...

  3. 使用canvas编写时间轴插件

    使用canvas编写时间轴插件 背景 项目中有一个视频广场的功能,需要一个时间轴类似视频播放中进度条功能一样显示录像情况,并且可以点击.拖动.放大缩小展示时间轴,获取到时间轴的某个时间.原来的时间轴是 ...

  4. 在Angular中利用trackBy来提升性能

    在Angular的模板中遍历一个集合(collection)的时候你会这样写: <ul> <li *ngFor="let item of collection"& ...

  5. mysql常用脚本及命令记录

    mysql导出用户权限 mysql中直接通过授权即可使用对应用户,不必使用创建用户命令(如CREATE USER 'xxx'@'%' IDENTIFIED BY 'XXX';)先建用户再授权. 方法一 ...

  6. 转:客户端session与服务端session

    会话(Session)跟踪是Web程序中常用的技术,用来 跟踪用户的整个会话 .常用的会话跟踪技术是Cookie与Session. Cookie通过在客户端记录信息确定用户身份 , Session通过 ...

  7. 利用linq的Take Skip方法解决 集合拆分的问题

    public static void Main(string[] args) { List<string> list = new List<string>(); ; i < ...

  8. 拼接SQL语句缺少“break”

    1.错误描述 [ERROR:]2015-07-20 16:42:21,734 [插入失败] org.hibernate.exception.SQLGrammarException: error exe ...

  9. Struts2实现文件上传报错(一)

    1.具体报错如下 2014-5-1 23:02:38 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service( ...

  10. Flex的 Event中属性currentTarget与target的区别

    Flex的 Event中属性currentTarget与target的区别 1.区别 (1)currentTarget是事件的处理对象(event processor) (2)target是事件的调用 ...