C++学习-9
- 友元主要用于访问私有变量,友元函数跟所在位置的权限没有任何关系friend+函数声明
友元类通常设计为一种对数据操作或类之间传递消息的辅助类(注意一下顺序)
- Explicit就是要求严格的匹配,不允许转换适应,可以强转(最后的那一层一定至少披着同类型的外衣)
- 做类方面的重载的时候一定得考虑深浅拷贝的问题
- 流运算符的重载必须在类的外部
- 运算符重载: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的更多相关文章
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Unity3d学习 制作地形
这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
随机推荐
- [原创]ubuntu14.04部署ELK+redis日志分析系统
ubuntu14.04部署ELK+redis日志分析系统 [环境] host1:172.17.0.4 搭建ELK+redis服务 host2:172.17.0.3 搭建logstash+nginx服务 ...
- vim学习、各类插件配置与安装
vim学习.各类插件配置与安装 vim 插件 配置 1. vim学习 vim基础学习:根据网上流行基础文章<简明Vim练级攻略>,进阶书籍<vim实用技巧>.注:进阶书籍可以在 ...
- Java集合框架(六)—— Collections工具类
操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集 ...
- leetcode第一天
leetcode 第一天 2017年12月24日 第一次刷leetcode真的是好慢啊,三道题用了三个小时,而且都是简单题. 数组 1.(674)Longest Continuous Increasi ...
- POJ - 2492 种类并查集
思路:保存每个点与其父节点的关系,注意合并和路径压缩即可. AC代码 #include <cstdio> #include <cmath> #include <cctyp ...
- Kaggle新手入门之路
学完了Coursera上Andrew Ng的Machine Learning后,迫不及待地想去参加一场Kaggle的比赛,却发现从理论到实践的转变实在是太困难了,在此记录学习过程. 一:安装Anaco ...
- Linux shell的问题
1.uptime命令可以查看当前系统的启动时间: w命令显示当前登录者top命令显示当前任务ps命令显示所有进程信息 uptime命令可以查看系统启动时间 2.使用shell时,默认的环境变量放在 ...
- 用感知机(Perceptron)实现逻辑AND功能的Python3代码
之所以写这篇随笔,是因为参考文章(见文尾)中的的代码是Python2的,放到Python3上无法运行,我花了些时间debug,并记录了调试经过. 参考文章中的代码主要有两处不兼容Python3,一个是 ...
- ul 和 ol 标签的相关设置
初学者不喜欢 ul 标签的最重要一点莫过于其前面的黑点了,每次写个无序列表其前面总有一个黑点是个很讨厌的事,去掉黑点的话自然是要用到 list-style:none:这条css 属性设置了. p.p1 ...
- java线程池技术(二): 核心ThreadPoolExecutor介绍
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程池技术属于比较"古老"而又比较基础的技术了,本篇博客主要作用是个人技术梳理,没什么新玩意. 一.Java线程池技术的 ...