临时整理的,有些可能不对。
1)如果一个类里面有const-qualifier或reference, compiler不会为它生成default copy assignment operator函数。
2) Hidden是指子类和父类有同名函数,但又没有virtual关键字。这里函数只要同名就可以了,参数并不需要match。也就是说,compiler只要在子类看到有这个函数名,即使参数不match,也不会再往父类找了。
3) delete function, default function 都是C++ 11新加的函数属性。
4) Decision of constructor happens at compile time。
5) Non-member function 不能在它后面加const。
6) macro的缺点: a) macros不会放进symbol table; b) macros 不管scope; c) macro 替换有时可能不是想要的地方。
Enum的缺点应该也包含上面的a)和b)。
7) delete p 和 free p都不会改变p的值。
8) 在line 2后放断点,x在symbol table里面是数组还是指针? 答案是一个数组。sizeof(x)=10*sizeof(int)。p是一个指向int的指针。
int main { int x[10]; //line 1 int *p; //line 2 }
9) pragma once 不portable。
10) 在copy constructor和copy assignment operator中,如果类中有一个member是数组,当数组成员不包含指针时,用memcpy是安全的,否则要用loop挨个调用copy assignment operator初始化。
11) C++中,private是对class而言。同一个class的不同object可以互相访问对方的private member。
12) 类的static成员不增加类实例的大小。
13) 通常不需要显式调用destructor。
14) static 成员在类中出现只是声明(declaration),应该还要另外definition。为什么呢? 因为类的definition都是放在头文件内,如果算definition则包含该头文件的每个.cpp文件都有一个copy。
15) 如果两个pointer刚好相等(first==last),delete ptr危险!因为对应的析构函数调用两次!
16) inline是一个request, 编译器可以选择拒绝。
17)
int *p; int const *q; //值const int *const r; //指针const p=q; //no, invalid conversion from 'const int*' to 'int *' p=r; //ok q=p; //ok q=r; //ok r=p; //no r=q ;//no
18) int const * const p = &x; 指针和值都const。典型例子是read-only register。
19) T& const r 不合法,因为引用&本身自带const属性,即一个引用不能再指向别人???
20) 引用相当于const pointer。
21) lvalue 是addressable,可以找到地址。
22) Compiler 会自行决定是否给const object 分配地址 。
23)
int &ri=3; //no int const &ri=3; //OK24)
void fun(int n) { int a[n]; ... }
这种写法C99和C++14都是支持的。但像TurboC和VC平台仅支持C89的不支持这种写法。
25) C/C++的堆上变量若未初始化,缺省值为0。栈上变量若未初始化,缺失值为未定义。
26)
struct A { ... };
C要用struct A a; C++可以直接用A a;
27) C++11定义的大括号初始化
class Test{ int a; int b; public: C(int i, int j); }; Test t{0,0}; //C++11 only,相当于 Test t(0,0); Test* pT=new Test{1,2}; //C++11 only,相当于 Test* pT=new Test{1,2}; int* a = new int[3]{ 1, 2, 0 }; //C++11 only
// C++11 container initializer vector<string> vs={ "first", "second", "third"}; map<string,string> singers ={ {"Lady Gaga", "+1 (212) 555-7890"},{"Beyonce Knowles", "+1 (212) 555-0987"}};但这种写法一般只用于POD(plain old data) 变量。
28) vector<int>(8) 会生成{0,0,0,0,0,0,0,0}这样一个临时vector。
vector<int>(1,7) 会生成{7}这样一个临时vector。
29) int *a, b; 其中a是指针,b是integer.