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的批量操作是什么?怎么实现的延时队列?以及订阅模式、LRU。
前言 这次的内容是我自己为了总结Redis知识而扩充的,上一篇其实已经总结了几点知识了,但是Redis的强大,以及适用范围之广可不是单单一篇博文就能总结清的.所以这次准备继续总结,因为第一个问题,Re ...
- Adnc简介
Adnc是一个轻量级的.Net Core微服务(microservices)快速开发框架,同时也可以应用于单体架构系统的开发.框架基于JWT认证授权,包含基础的后台管理功能,代码简洁.易上手.学习成本 ...
- 【Spring】Spring 入门
Spring 入门 文章源码 Spring 概述 Spring Spring 是分层的 Java SE/EE 应用全栈式轻量级开源框架,以 IOC(Inverse Of Control,反转控制)和 ...
- mac配置Android SDK
下载地址:http://tools.android-studio.org/index.php/sdk 2.找到tools文件夹 选中android-sdk-macosx包下的tools文件夹,按com ...
- 【IMP】导出的时候显示ddl建表语句
导出数据后,在导入的时候想要显示出建表语句,可以用show=y这个选项来实现 imp test/test file=test.dmp ignore=y show=y fromuser=test1 to ...
- 【Oracle】10g rac如何开启归档和关闭归档
开启归档: 1.设置想设置的归档的位置,我们这里归档的位置为ASM磁盘组,磁盘组的名称为DATA alter system set log_archive_dest_1='location=+DATA ...
- 【Oracle】什么是DRM,怎么关闭
DRM 分析及案例讲解 什么是DRM DRM(Dynamic Resource management)是oracle10.10.2里面推出来的一个新特性,一直到现在最新的12cR1,都存在,且bug非 ...
- SDUST数据结构 - chap9 排序
判断题: 选择题: 编程题: 7-1 排序: 输入样例: 11 4 981 10 -17 0 -20 29 50 8 43 -5 输出样例: -20 -17 -5 0 4 8 10 29 43 50 ...
- SAPCAR使用说明
1.首先看一下SAPCAR的功能usage:create a new archive:SAPCAR -c[vir][f archive] [-P] [-C directory] [-A filen ...
- git 基本命令和操作
设置全局用户名+密码 $ git config --global user.name 'runoob' $ git config --global user.email test@runoob.com ...