好多东西都忘了,现在重新复习一遍,把遇到的要点都记录下来。随时更新。
# 指针
- 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. 数据库连接池 c3p0 demo 代码和分析

    import java.sql.Connection; import java.sql.SQLException; import java.beans.PropertyVetoException; i ...

  2. 快速界面:QML。

    PyQt, QML,Qt Quick. QML: QML可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C++代码进行方便的交互,使用起来非常方便. 功能性不能,此篇博 ...

  3. Hibernate+Struts2完成修改数据功能

    先看修改之前的数据: 下面是具体代码 view层: 顺着链接,继续: 继续: 继续 控制层和逻辑层: action: //修改 public String updateperson() { Strin ...

  4. OSX apache vhost 配置多站点时403错误解决方法

    到 /etc/apache2/httpd.conf 这个文件修改下面的路径就好了 DocumentRoot "/Users/wujinhang/workspace/"<Dir ...

  5. Java浮点值拒绝服务漏洞危害分析

    By 空虚浪子心 http://www.inbreak.net/ JAVA出了漏洞,CVE-2010-4476,会导致拒绝服务攻击.大家能从公告上,看到这样一段代码,挺长的.意思是只有开发人员写出这样 ...

  6. Android中Webview使用javascript调用事先定义好的Java函数

    1. 首先定义好一个类,专们用于给javascript调用 public class JavaScriptInterface { // share your news public void shar ...

  7. Codeforces Round #306 (Div. 2) C. Divisibility by Eight 暴力

    C. Divisibility by Eight Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/ ...

  8. C#综合揭秘——细说多线程

    一.线程的定义  1. 1 进程.应用程序域与线程的关系 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法访问另一个进程 ...

  9. or1200下raw-os学习(任务篇)

    这次就来说说基于上一节介绍的系统框图去建立我们所需要的任务,顺便学习Raw-OS提供的API,根据上节的分析,对于Slave Board有如下设计: Slave Board有三个任务,分别负责测试阻抗 ...

  10. 点击次数(thinkphp)

    protected function addHit($tbName, $id) { //定义变量:作为一个查询条件 $where = array( 'deleted' => 0, 'hidden ...