c++复习笔记(3)
这篇是各种琐碎的东西。
类的函数如果在类内部直接实现,则成为内联函数候选。类外部实现的方法,可以用inline声明,使其称为内联函数候选。但是函数是否可以成为内联函数,需要看编译器的行为。、
构造函数可以使用初始列:
functionName (varList) : var1(value1), var2(value2) {}
构造函数可以放在private区(单例)。
类的成员函数可以分为改变类的值的和不改变类的值的。不改变类的值的函数可以加const:
returnType functionName (varList) const {}
这里注意,这么写的原因,有一个是:当我们声明了一个const的实例,然后调用不是const的方法就会出错。所以对不改变值的函数,加上const,就可以被const实例正常调用。
函数的参数传递和返回值,首先考虑引用。若参数不需要变化时,要传const引用。
标记friend的方法可以访问class的private部分,注意友元函数并不是类的一部分,仅仅是需要在类中进行声明。相同class的objects互为friends。
对于返回值,如果返回的是传入的指针或引用,则可以返回引用。如果返回的是函数内新建的变量,就不能返回引用(因为函数结束之后,新建的变量的生命周期就结束了,此时返回引用就会发生错误)。
所有的成员函数都默认有一个参数this,表示指向类的实例的指针。
操作符重载,一元操作符需要传一个参数,二元操作符需要传两个参数。如果重载函数是类的成员函数,那么默认多一个this。
操作符重载中,要注意返回值的类型,主要是考虑操作符连续使用时的情形(比如a+=b+=c)。
操作符重载,对于自己无法操作的类,只能写成非成员函数。
带指针的成员参数的类要自己实现拷贝的构造函数和拷贝赋值函数,因为默认的构造函数只能做对应复制,这样对于指针来说会复制地址而不是值,拷贝赋值函数同理。同时在析构函数里要记得delete。
对带指针的成员参数的类,其拷贝赋值函数一定要做是否是同一实例的判断。否则会出现删除指针指向的空间后,目标要拷贝的内容也同样被删除的问题。
栈是存在于某个作用域的一块内存空间,在函数作用域内的参数和返回值都存在栈中。堆是操作系统提供的一块可以动态分配的通用空间。
stack object在作用域结束的时候会被自动清理(调用析构函数)。可以在声明变量时增加关键字static,这样该变量在作用域结束后仍然存在,直到整个程序结束。
global object某种程度上可以看作是static object。
new出来的变量不会随着作用域结束而清理(我理解的,应该是变量被清理了,但是其内存空间没有被清理)。所以new出来的变量要记得delete。
关于new,其运行是先申请空间,再执行构造函数。(声明viod*指针并分配内存,对指针进行类型转换,在指针上执行构造函数)
关于delete,其运行是先执行析构函数,再释放指针的空间。
array new(String* a=new String[5])要搭配array delete(delete[] a)。否则会发生内存泄漏(主要原因在于,虽然删除了数组部分的内存空间,但是数组中指针指向的空间并没有处理)。
静态成员是跟类的实例脱离的。类的静态成员变量要在类外做初始化。静态函数既可以通过类名调用,也可以通过类的实例调用。类的非静态方法,相当于传入了一个this指针作为参数。
单例模式。
模版中class和typename的区别(待补充)。
复合composition,表示has-a。比如queue中拥有一个deque(双端队列),queue的若干方法都是借由deque实现的。这两者的生命周期是相同的,共同出现共同消失。
若container包含一个component(复合关系),那么构造函数中,container先调用component的构造函数,再执行自己;析构函数中,container先执行自己,再调用component的析构函数。
委托delegation(composition by reference),表示一种虚的has-a,是用指针指过去的。这两者的生命周期是不相同的,可以在需要后者时再创建后者。
pimpl(pointer to implementation)一种写法,指向实现的指针。就是类的本体只实现对外接口,所有具体功能的实现都有指针指向的委托者来实现,对外接口方法均调用委托者的实现方法。
继承inheritance,表示is-a。
总的来说,对于复合和继承这种可以看作是内外包含关系的结构。构造函数是由内向外的,析构函数是由外向内的。当然,一般来说这种问题编译器已经帮我们处理好了。
另外,base-class的析构函数必须是virtual的,否则会出现问题。(待补充)
virtual:non-virtual是不希望被继承者override的函数,virtual是希望被继承者override的函数,pure-vitrual是继承者必须override的函数(跟java的接口差不多)。
对于判断类函数中调用的函数是父类的还是子类的,一个简单的方法是,将该函数看成是this->的,这样就可以根据指针的类型和其对应的类的实现来判断。
c++复习笔记(3)的更多相关文章
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
- Java基础复习笔记基本排序算法
Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...
- Angular复习笔记7-路由(下)
Angular复习笔记7-路由(下) 这是angular路由的第二篇,也是最后一篇.继续上一章的内容 路由跳转 Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为.对于使 ...
- Angular复习笔记7-路由(上)
Angular复习笔记7-路由(上) 关于Angular路由的部分将分为上下两篇来介绍.这是第一篇. 概述 路由所要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL来表 ...
- Angular复习笔记6-依赖注入
Angular复习笔记6-依赖注入 依赖注入(DependencyInjection)是Angular实现重要功能的一种设计模式.一个大型应用的开发通常会涉及很多组件和服务,这些组件和服务之间有着错综 ...
- Angular复习笔记5-指令
Angular复习笔记5-指令 在Angular中,指令是一个重要的概念,它作用在特定的DOM元素上,可以扩展这个元素的功能,为元素增加新的行为.本质上,组件可以被理解为一种带有视图的指令.组件继承自 ...
随机推荐
- 技术选型关于redis客户端选择
redis作为分布式缓存框架的首选 相信已经毋庸置疑.能高效.合理的使用好它 必定能提升系统的可用性,高性能.高吞吐量的保障.但选择一个客户端,充分发挥它的能力,就是一个选型问题.现在市场上能选择 ...
- MobPush厂商通道排查
开启log 一.添加开启log代码 有AndroidManifest.xml的 //在AndroidManifest.xml的application标签中添加 <meta-data androi ...
- Linux设备上没有空间之复盘
某天前端在调接口的时候,发现登录页面得验证码接口居然没有响应数据,显示的是500响应码.于是我一路排查,首先排查验证码接口所属的微服务是否正常,通过lsof -i:服务端口进行排查,发现该微服务进程存 ...
- 在.NET Core中使用Channel(三)
到目前为止,我们一直在使用所谓的"Unbounded"通道.你会注意到,当我们创建通道时,我们这样做: var myChannel = Channel.CreateUnbounde ...
- 为Github仓库添加Github Actions实现持续集成: Android apk自动编译发布以及github pages同步推送coding.net
内容转载自我的博客 目录 说明 1. 编写Android项目的CI配置文件 2. 编写Jekyll项目的CI配置文件 2.1 配置coding.net 2.2 配置github 2.3 自动部署到co ...
- Java远程下载文件到本地(http协议和ssh2协议)
Java中java.io包为我们提供了输入流和输出流,对文件的读写基本上都依赖于这些封装好的关于流的类中来实现.前段时间遇到了以下两种需求: 1.与某系统对接,每天获取最新的图片并显示在前端页面.该系 ...
- Session、Cookie与Token
http协议是无状态协议 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到 ...
- 【Linux】E297: Write error in swap file 解决办法
今天登陆到服务器上,发现通过vi 打开文件就会报错: E297: Write error in swap file E303: Unable to open swap file for "c ...
- kubernets之计算资源
一 为pod分配cpu,内存以及其他的资源 1.1 创建一个pod,同时为这个pod分配内存以及cpu的资源请求量 apiVersion: v1 kind: Pod metadata: name: ...
- kubernets之pod的标签拓展
一 标签的拓展使用 1.1 标签的作用范围不仅仅适用于pod对node以及其他类的大部分资源同样适用 k label node node01 gpu=true k是kubectl的别名形式 同样对于n ...