这篇是各种琐碎的东西。

类的函数如果在类内部直接实现,则成为内联函数候选。类外部实现的方法,可以用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)的更多相关文章

  1. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  2. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  3. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  4. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  5. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  6. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  7. Angular复习笔记7-路由(下)

    Angular复习笔记7-路由(下) 这是angular路由的第二篇,也是最后一篇.继续上一章的内容 路由跳转 Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为.对于使 ...

  8. Angular复习笔记7-路由(上)

    Angular复习笔记7-路由(上) 关于Angular路由的部分将分为上下两篇来介绍.这是第一篇. 概述 路由所要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL来表 ...

  9. Angular复习笔记6-依赖注入

    Angular复习笔记6-依赖注入 依赖注入(DependencyInjection)是Angular实现重要功能的一种设计模式.一个大型应用的开发通常会涉及很多组件和服务,这些组件和服务之间有着错综 ...

  10. Angular复习笔记5-指令

    Angular复习笔记5-指令 在Angular中,指令是一个重要的概念,它作用在特定的DOM元素上,可以扩展这个元素的功能,为元素增加新的行为.本质上,组件可以被理解为一种带有视图的指令.组件继承自 ...

随机推荐

  1. 四元数和旋转(Quaternion & rotation)

    四元数和旋转(Quaternion & rotation) 本篇文章主要讲述3D空间中的旋转和四元数之间的关系.其中会涉及到矩阵.向量运算,旋转矩阵,四元数,旋转的四元数表示,四元数表示的旋转 ...

  2. git分支的创建与分支之间合并的底层原理

    开发一个版本,采用的发布流程: (1).从master的最新代码拉取一个开发分支,在上面进行开发(这里假设开发分支为dev) (2).在开发分支上不断地进行提交版本,期间,master也会有因为其他版 ...

  3. Android stdio使用时遇到的一些问题

    (1)android stdio加载布局时 Exception raised during rendering: com/android/util/PropertiesMap             ...

  4. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 问答系统)--学习笔记

    2.5.6 MongoDB -- 问答系统 MongoDB 数据库设计 API 实现概述 MongoDB 数据库设计 设计优化 内嵌(mongo)还是引用(mysql) 数据一致性 范式:将数据分散到 ...

  5. eclipse中把spring源码关联至当前工程

    1.下载并导入spring的相关jar包下载对应版本的spring 2.在当前工程中,选择Referenced Libraries,展开后,选择相应的jar包,右击并选择Properties 3. 在 ...

  6. python实现99乘法表

    for x in range(1,10): for y in range(1,10): if x>=y: print("%d*%d=%d\t"%(y,x,x*y),end=' ...

  7. Study_way

    一.Study 学习通Java基础视频.语法 开源中国 (Git)版本控制 读懂程序.源代码 相关资源 百度网盘 程序:方法(数学) 二.参数传递 基本数据的传参:虚参改变影响实参 引用数据的传参:数 ...

  8. 当音乐学博士搞起编程,用一本书改变了Java世界!

    前言 说到Spring,也许现在的开发者们最先想到的是 Josh Long 超快的语速与现场代码能力,让很多Java开发者折服. 然后Spring的历史上,最传奇的还是要数其创始人:Rod Johns ...

  9. 白日梦的Elasticsearch笔记(一)基础篇

    目录 一.导读 1.1.认识ES 1.2.安装.启动ES.Kibana.IK分词器 二.核心概念 2.1.Near Realtime (NRT) 2.2.Cluster 2.3.Node 2.4.In ...

  10. 【Dart】语言概述

    // 导入(import) // 导入核心库 //导入外部库 import 'package:test_api/test_api.dart'; // 导入文件 //import 'path/test. ...