C/C++ 一些知识点总结

临时整理的,有些可能不对。

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; //OK
24) 
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.

猜你喜欢

转载自blog.csdn.net/roufoo/article/details/79431170