unused
int a = 123;
如果从未使用, 则编译时 会有waring: [-Wunused-variable]
如果此时写: a;
, 编译时, 还是会提示: waring: 这句话, 没有任何的影响
一个做法是: (void)a;
, 这句话, 虽然本质上, 也没有任何影响a的值, 仍然是123
. 但是, 确实是 做了一次将123 强转成 void
的动作!
带有const成员的 copy
当一个类里 有const成员时, 他的operator=
赋值符 就不会自动生成.
因为, const无法改变.
无参构造
每个类,最好都要有 “无参构造”!
因为很多容器的 “默认初始化” 在填补元素时,使用的 “无参构造”
无参构造2
ST t();
这种写法是错的, ST * t = new ST();
这虽然是对的。
在调用“无参构造”时,最好要写成: ST t;
和 ST * t = new ST;
构造函数的 初始化列表
class SON : FA{
Obj1 * o1;
Obj2 * o2;
SON() :
FA(),
o1( new Obj1 ),
o2( new Obj2 )
{}
注意这里的顺序,很重要!!! 必须是:FA -> o1 -> o2
的顺序!!!
- 1,先是 “父类”的初始化
- 2,然后 “成员变量”的初始化,而且,必须按照“你类的 定义顺序”!!
这里也可以知道,你类的成员定义的顺序,就是初始化的顺序
引入头文件
当前文件,需要引用:#include "A.h"
这个头文件,那就在 “当前文件” 引入(不管当前文件 是h、还是cpp)
比如:
B.cpp:
#include "B.h"
... // 这个逻辑,需要借助"A.h"
此时,就把#include "A.h"
,放到当前B.cpp
里!!! 不要放到B.h
里!!!
道理很简单。因为只有 当前B.cpp
有这个需求!!
二重指针
int * p
,p 是 指向 int 的指针。
int * * p
,p 是 指向 int * 的指针。
需求: 让ptr动态申请N * M
的数组
int * * ptr;
ptr = new int * [N];
FOR(i, 0, N-1, 1) ptr[i] = new int[M];
ptr {比如,N=2, M=5}:
0 1 2 3 4
5 6 7 8 9
这10个元素,并不是连续的内存!!! 但{0-4}是连续的,{5-9}是连续的。