好多东西都忘了,现在重新复习一遍,把遇到的要点都记录下来。随时更新。
# 指针
- C保证在为数组分配存储空间的时候,**指向**数组之后的第一个位置的**指针**也是合法的。也就是说保证**指针** `a + SIZE` 是合法的,但是不保证 `a[SIZE]` 合法.
- `const double * p` 为指向常量的指针,`double * const p` 为常量指针.
- 多维数组实际上一维的,可以用指针以一维的方式进行遍历。 `z[0]` 、 `z[1]` **指向的是一个包含两个int值的数组**
![](http://images.cnblogs.com/cnblogs_com/xz816111/786501/o_2016-03-29%2021128.jpg)
- `int (* p) [2]` p是**一个 指向包含2个int值的数组 的指针**
- 允许把非常量指针赋值给常量指针,但是前提是只进行一层间接运算。在进行两层间接运算时,可能会发生`const **p -> p -> const * p`,即 `常量指针指向非常量指针,非常量指针又指向常量指针,这时候就能用非常量指针改变常量的值`.
- 声明多维数组的指针时,除了最左边的方括号可以留空之外,其它都需要填写数值。因为首方括号表示这是一个指针,而其它方括号描述的是所指向对象的数据类型。
- `void (* pf)(char *)` `pf`是一个指向函数的指针,可以用 `(*pf)("test")` 这种方式,因为 `pf` 是指向函数的指针,所以 `*pf` 就是访问函数;也可以用 `pf("test")` 的方式,因为函数名本身就是一个指针。如今二者都可以用。
- 数组名是一个指针常量。只有在两种场合下,数组名才不用指针常量来表示:一是当数组名作为`sizeof`操作符或单目操作符`&`的操作数时。`sizeof`返回的是整个数组的长度,而不是指针的长度。取一个数组名的地址产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。
- 声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值是一个常量,指向这段空间的起始位置。声明一个指针变量时,编译器只为指针本身保留内存空间,它并不为任何整形值分配内存空间。因此,在执行`int a[5];int * b;`的声明后,`*a` 是完全合法的,但是`* b`将访问内存中某一个不确定的位置。另一方面,表达式`b ++`可以通过编译,但是`a ++`却不行,因为`a`的值是一个常量。
- C函数的所有参数都是**按值传递**,指针参数实际上也是通过按值方式传递,函数得到的是该指针的一份拷贝。
- 将一维数组作为函数参数时,之所以无需注明元素数目,是因为函数并不为数组参数分配内存空间,形参只是一个指针,它指向的是已经在其他地方分配好内存的空间。


  • 默认构造函数(只能有一个):

    • 不带参数的默认构造函数。如Test()
    • 带有参数且所有参数都有默认值的构造函数。如Test(int = 1,double = 2)

如果二者都有的话,会产生二义性,比如Test one,此时匹配上方任意一个都可以,因此只能二选一。

  • 复制构造函数(默认为Class_name(const Class_name &)

    • 当新建一个对象,并将其初始化为同类现有对象时,复制构造函数将被调用
    • 每当程序生成了对象的副本时,编译器都将使用复制构造函数。具体地说,当函数按值传递对象或者返回对象时,都将使用复制构造函数。按值传递意味着创建原始变量的一个副本。

由于按值传递对象将调用复制构造函数,因此应该按引用传递对象。这样可以节省调用构造函数的时间以及存储新对象的空间。

  • 赋值运算符

    • 将已有对象赋给另一个对象时,重载的赋值运算符将被调用
  • 初始化列表

    • Class::Class(int n,int m) : mem_1(n),mem_2(m)
    • 采用这种方式时,初始化工作是在对象创建时完成的,而不是之后
    • 这种格式只适用于构造函数
    • 必须用这种格式来初始化非静态const数据成员引用数据成员
  • 更好的选择:

    • C++ 11 允许以下面这种方式进行初始化,与使用初始化列表等价
    class   my_class
    {
    int mem_1 = 10;
    int mem_2 = 20;
    // ...
    }
  • 只要类方法不修改调用对象,就应该将其声明const

  • 派生类

    • 派生类不能直接访问基类的私有成员,必须通过基类的方法进行访问
    • 派生类的构造函数:
      • 派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
      • 派生类构造函数初始化派生类新增的数据成员
    • 派生类的构造函数总是要调用一个基类的构造函数
  • 继承

    • 基类指针或引用可以指向派生类,但是不能反过来
    • 使用引用或继承时,如果使用vitual,程序将根据引用或指针指向的对象的类型来选择方法。如果没有使用virtual,程序将根据引用或指针类型来选择方法。
    • 在基类方法的声明中使用virtual可使该方法在基类以及所有的派生类(包括从派生类派生出来的类)中是虚的。
    • 构造函数不能是虚函数,析构函数应该是虚函数,友元不能是虚函数。
    • 重新定义继承的方法并不是重载,而是覆盖掉原方法。
    • 如果在派生类中重新定义了基类几个重载函数当中的一个版本,则其它版本将被隐藏,派生类对象无法使用它们,因此如果要在派生类中重新定义,就应该重新定义所有的基类版本。
  • 虚函数与纯虚函数

    • 虚函数:使用引用或继承时,程序将根据引用或指针指向的对象的类型来选择方法。

      • 基类的析构函数应该是虚的,不然将只会调用基类的析构函数而不会调用派生类的。
      • 构造函数不能是虚函数,没有任何意义,派生类总是会先调用基类的构造函数,然后又调用自己的构造函数。
    • 纯虚函数:可以不实现,主要用在基类上来进行派生。
  • 虚函数的实现机制

    • 编译器会给每个对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针,这个数组叫做虚函数表,其中保存了这个类里各个虚函数的地址

C++复习笔记的更多相关文章

  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. IoC框架---通俗概述

    1 IoC理论的背景    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.  图1:软件系统中耦合的对象 如果我们 ...

  2. Server-U与IIS端口占用问题解决

    在新版的ftp软件Server-U(11.X)中,由于其默认设置中监听了80端口,经常会导致IIS不能服务不能正常启用,下面记录如何修改server-u的80端口.     打开Server-U软件, ...

  3. JavaScript要点(十七) Math 对象

    来源:JavaScript 参考手册 Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). 语法 var ...

  4. 百度语音识别REST API——通过使用Http网络请求方式获得语音识别功能

    百度语音识别通过REST API的方式给开发人员提供一个通用的HTTP接口,基于该接口,开发人员能够轻松的获取语音识别能力,本文档描写叙述了使用语音识别服务REST API的方法. 长处: 较之开发人 ...

  5. JavaScript创建Map对象(转)

    JavaScript 里面本身没有map对象,用JavaScript的Array来实现Map的数据结构. /* * MAP对象,实现MAP功能 * * 接口: * size()     获取MAP元素 ...

  6. Linux内核--usb子系统的分析

    drivers/usb/core/usb.c subsys_init(usb_init); module_exit(usb_exit); 我们 看到一个subsys_initcall,它也是一个宏,我 ...

  7. C#利用lambda在函数中创建内部函数

    有使用过JS的朋友,相信都知道function.JS中的function是可以在里面在定义一个作为内部使用的.有时为了控制作用域,或者这种小函数只在这个函数体内会使用,所以就不希望在外部在作额外的定义 ...

  8. Winform模拟post请求和get请求登录网站

    引言 最近有朋友问如何用winform模拟post请求,然后登录网站,稍微想了一下,大致就是对http报文的相关信息的封装,然后请求网站登录地址的样子.发现自己的博客中对这部分只是也没总结,就借着这股 ...

  9. MHA参数 转

    http://blog.csdn.net/wulantian/article/details/12503473 http://blog.csdn.net/wulantian/article/categ ...

  10. 使用NIO提升性能

    NIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标准. 具有以下特性: 传统Java IO,它是阻塞的,低效的.那么Java NIO和传统Java ...