C++ 学习小结

1、C++ OOP 只是在源代码级别,编译生成的目标文件与C语言生成的文件一致;

2、访问限制(public,protected,private)是由编译器在编译时期检查(把关);

  * private访问限制是针对类(class),同一类(class)的对象之间可以互相访问私有成员;

  * friend,声明时就需要指定,同时也是编译时期检查;

3、初始化列表 initializer vs. assignment

Student::Student(string s):name(s){} 
// initialization before constructor 

Student::Student(string s){name = s;}
//assignment inside constructor
//string must have a default constructor,as name is a instance of string

4、inline 内联函数:头文件中直接声明并定义的函数(其实整个内联函数将被看作为声明)

5、const :不可修改变量,注意仍然是变量,而非常量;

    - 常量:编译时期,编译器记录于表中的一个立即数; - 变量:分配内存

// const & pointer

char * const p; 
//指针(p)是const,p不能指向其他地址

const char *p;  
//对象(*p)是const,不能通过p指针修改对象(内存),而非p所指内存为const,称之为“它所指的变量不能通过它修改的指针”

例子:
const char *s="hello world";
char s[]="hello world";

6、指针 vs. 地址

  指针分类:1)指令指针(函数指针)

       2)数据指针:首地址+类型 ,由「首地址」标明起始位置,由「指针类型」标明空间占用字节大小、存储什么类型数据

7、C++ 引用 reference

  - 引用是这样一种语法机制:它允许用户为一个对象声明一个新名字,内部实现可以使用“const指针”;

  - reference to pointer: int* &p (p是int指针变量的别名)

  - 用途:1)避免野指针,引用声明时需要立即初始化;

       2)简写: vector<vector<double>> v;

                              double val=v[f(x)][g(x)];

                              double& val=v[f(x)][g(x)]; 使用引用后,可以通过val进行读写操作;

8、内存模型

  - C++ 三种存放对象方式:堆栈,堆,全局数据区

  - C++ 三种对象访问方式:对象,指针,引用

  - Java 内存模型比较简单,一种内存模型,一种对象访问,所有对象都存在于堆,

        Java引用类似于C++指针(外形上取消了星号*,同时也不能进行(指针)运算);

 9、多态:向上造型+动态绑定(upcasting+dynamic binding),虚函数(virtual function)

  - 【重点注意】:通过「指针」或「引用」(即子类对象赋予父类指针或引用,若赋予父类对象将是使用子类对象内容修改父类对象并产生切割)

 

  - 虚析构函数 virtual destructors ; 

  为多态基类声明虚析构函数:当derivedClass对象经由一个baseClass指针被删除,而baseClass带着一个non-virtual析构函数,实际执行时调用的是baseClass析构函数,造成对象derived成分没被销毁;

//多态基类声明虚析构函数-实例分析:

Shape *p=new Ellipse(100F,200.0F);
...
delete p; 
//若析构函数不是virtual,此时delete p 静态绑定,将调用Shape的析构,造成错误

10、static 静态

  - 全局生存期 + 局部作用域  (c语言static具有两层含义:在哪里存储 + 谁能访问)

11、C++两组重要名词: 

  - 声明与定义  

    对于一个变量,声明仅仅提供了类型,只有定义才能提供对象内存空间;

  - 初始化与赋值

      ① 拷贝构造函数:此时等号(=)不是赋值操作符

        Person p1 = p2; <=> Person p1(p2);

         ② 发生拷贝构造情景:

            函数参数为对象本身; 初始化式; 函数返回本地变量;

12、数组

  数组不是类型,而是一连串数据的打包; 函数声明 fun(int a[],int len) , a 是指针,sizeof(a)=4, 因此需要给出数组大小len;

13、I/O

  1) 创建指向恰当数据源和数据目的地的I/O流;

  2) 读和写这些流;

 

  格式之于文件,与类型之于内存对象 ,指定数据解释方式

    ASCII文本文件  前4个字节即文本前4个字符

    二进制整数文件  前4个字节即第一个整数

14、...

 

posted @ 2015-10-05 11:33  chenyizh  阅读(142)  评论(0)    收藏  举报