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、...