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元素上,可以扩展这个元素的功能,为元素增加新的行为.本质上,组件可以被理解为一种带有视图的指令.组件继承自 ...
随机推荐
- 记一次由于引用第三方服务导致的GC overhead limit exceeded异常
最近笔者遇到一个问题 监控平台忽然告警 GC overhead limit exceeded 这个异常 第一反应估计是堆溢出了.于是各种各种jmap jstack下载堆栈文件和堆日志文件. 以下是 ...
- 在 CAP 中使用 AOP ( Castle.DynamicProxy )
简介 本篇文章主要介绍如何在 CAP 中集成使用 Castle.DynamicProxy,Castle DynamicProxy 是一个用于在运行时动态生成轻量级.NET代理的库.代理对象允许在不修改 ...
- openbmc编译错误汇总,持续更新,建议收藏
本文汇总自己在编译openbmc时遇到的一些问题及解决思路,希望对有兴趣研究openbmc的同学有一些帮助. 项目地址:https://github.com/openbmc/openbmc 编译步骤: ...
- Sql Server Sum函数的特殊使用
利用Sql Server的Sum函数开窗得到累计值 具体详解https://www.cnblogs.com/zhaoshujie/p/9594676.html 个人示例例子 DECLARE @Sale ...
- redis 5.0.5 安装
redis 5.0.5 安装脚本: #!/bin/bash cd /data/src/ test -e tcl8.6.9-src.tar.gz || wget http://downloads.sou ...
- python模块详解 | progressbar
参考官方文档:https://pypi.org/project/progressbar/#description progressbar 安装: pip install progressbar pro ...
- python学习笔记 | 猜拳游戏
''' @author: 人人都爱小雀斑 @time: 2020/3/6 18:52 @desc: 实验结果心得: 1.难点主要在判断谁输谁赢 2.挺好的 ''' import random d={1 ...
- sa-token 之权限验证
权限验证 核心思想 所谓权限验证,验证的核心就是当前账号是否拥有一个权限码 有:就让你通过.没有:那么禁止访问 再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包括我需要检测的那 ...
- 【Problem】前端项目运行:Module build failed:Error Node Sass does not yet support my current environmen
我在运行renren-fast-vue前端项目时,安装完依赖cnpm install 启动服务npm run dev 出现问题. Module build failed: Error: Node Sa ...
- 【ORA】 ORA-01031:权限不足的问题
今天创建一个用户,赋予dba权限,在plsql中选择sysdba登录,但是报错 ORA-01031 在网上找了好久最后的解决办法是 不仅仅要有dba权限 还要有这个权限: grant all priv ...