0%

第二章 C++基础——指针

指针是一个变量,其存储的是值的地址,而不是值本身

使用常规变量时,值是指定的量,而地址是派生量,而指针相反

OOP强调的是在运行阶段(而不是编译阶段)进行决策,提供了灵活性,对于内存管理也更加高效

初始化指针

1
2
int* ptr_a;
double* ptr_b;

初始化时必须指定所指元素类型,因为对所有指针来说其都是代表一个初始地址,但从该初始地址读多少字节则由指针类型判断

指针也是作为变量存储,只不过其内存空间存的是地址。指针p1,p2有各自的地址&p1,&p2。长度为4B(32位)或8B(64位)。p1,p2表示存储的所指向元素的地址。*p1表示指向元素的值。
image.png

指针注意事项

在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存(指向不确定)。另外,一定要在对指针提取(*)之前,将指针初始化为一个确定的、适当的地址。

Read more »

基本内置类型

算术类型

类型 含义 最小尺寸
bool 布尔 未定义
char 字符 8位
short 短整型 16位
int 整型 16位
long 长整型 32位
long long 长整型 64位
float 单精度浮点数 6位有效数字
double 双精度浮点数 10位有效数字
long double 扩展精度浮点数 10位有效数字

类型转换

  1. 当一个算术表达式中既有无符号数又有int值时,int会被转换为无符号数
  2. 当从无符号数中减去一个值时,不管这个值是不是无符号数,都必须保证结果不为负(否则为取模后值)

变量

变量声明于定义的关系

变量声明(declaration)定义了变量的类型和名字,定义(definition)在声明外还申请存储空间

如果只想声明,可在变量名前添加关键字extern

变量只能被定义一次,但是可以多次声明

Read more »

const限定符

const对象一经创建后其值不能再改变,所以const对象必须初始化

1
const int i = 1;

默认情况下,const对象仅在文件内有效。若需在不同文件使用同一const对象,则const变量不管是声明还是定义都添加extern关键字,这样只需定义一次就可以了

1
extern const int bufSize;

const的引用

用于声明引用的const都是底层const,引用本身已默认为顶层const(无法改变指向)

const型变量只能由const型引用(底层const)

不能把普通引用绑定到字面值上,需用底层const

非const型变量可以由const型引用,但不可通过引用修改被引用变量值

Read more »

当执行throw时,throw后的语句都不执行,控制权转移到与之对应的catch模块

退出catch后,catch模块中的局部变量将会销毁

当异常处理完毕后,异常对象将被销毁

1
2
3
4
5
6
7
try{
//...
}catch (exception_a){
//...
}catch (exception_b){
//...
}

捕捉catch(对于每个catch执行下述步骤)

  1. 判断是否是精确匹配
  2. 派生类向基类转换(仅引用和指针类型)
  3. (…)匹配所有

其中一个被捕捉,跳过下面的catch

重新抛出

一条catch语句通过重新抛出的稻作将异常传递给另一个catch语句

1
throw;
Read more »

static全局变量

static变量只能在当前文件访问,其他文件不能通过extern访问

static局部变量

定义时创建,程序结束时销毁,修改了生命周期,作用域不变

static类

static对象的构造在main函数前执行,析构在main函数结束后

static成员变量

存在于所有对象且保持一致,可在其他文件访问

不能在初始化列表初始化

需在类外定义,因为class内语句都是声明

Read more »

面试题汇总

C++

基础知识

C 和 CPP 区别是什么

C C++
编程范式 面向过程 面向对象
函数重载
引用

C++编译过程

预处理:展开include和define

编译:转化为汇编代码

汇编:转化为二进制机器码

链接:将目标和其需要的库链接成可执行文件

Read more »

第五章 面向对象编程(二)

引用的其他用法

引用作为成员变量

函数返回引用,可以将返回值做左值

拷贝构造

通过类的其他对象初始化当前对象(有默认拷贝构造方法,成员对成员的拷贝,可能发生对象的嵌套拷贝)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//During call by value
void roster(Person){};
Person child("Ruby");
roster(child); // call copy ctors

// During initialization, call copy ctor
Person baby_a("Fred");
Person baby_b = baby_a;
Person baby_c(baby_a); // same as above

//During function return
Person captain(){
Person player("George");
return player;
}

T::T(const T&)

建议每个类提供默认构造函数,拷贝构造函数,虚函数

其他

Read more »

模版函数(template function)为声明不是定义,在使用时根据输入类型定义

使用模版时,不会使用隐式类型转换

类模版里的每个函数都是函数模版,需要在声明前加上template

1
2
3
4
5
template <typename elemType>
class BinaryTree{
private:
BTnode<elemType> *_root;
}
Read more »

标准库类型String

读写string对象

1
2
3
string s;
cin >> s; //from empty to empty
getline(cin,s); //one line, stop by ENTER

当把string对象和字符(串)字面值混在一条语句时,必须确保加法运算符(+)两侧的运算对象至少一个是string

标准库类型vector

vector是模板而非类型

1
2
3
4
5
vector<T> v1;
vector<T> v2(v1);
vector<T> v3 = v1; //same to above
vector<T> v4{a,b,c,...};
vector<T> v5 = {a,b,c,...}; //same to above

凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素

数组

理解复杂的数组声明(P102-103)

Read more »

后置递增运算符的优先级高于解引用运算符,因此*p++等同于*(p++)

将p+1后返回p的初始值

Read more »