【面试复习】c++ 基础知识
1、static
(1)对于函数定义或者代码块以外的变量修饰static ,static修改标识符的链接属性,由默认的external变为internal,作用域和存储类型不改变,表明该变量由全局的变成了文本内部的,如果变量定义在头文件内,其余任何其他文本引用他,得到的变量都只是他的副本
(2)对于源文件内函数加上static,这个函数只能被这个源文件内被使用
warning:不要再头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰。
(3)对于代码块内部变量加上static, static改变了存储类型,由自动变量变成静态变量,全局性+累加性
(4)对于类内部的静态变量和静态函数,不属于某一个具体对象,属于类本身
2、c 与 c++区别
类,对象,模板
3、c++的四种转换cast
(1)static_cast<type_id> (expression)
类似于c语言的强制转换,转换时没有类型检查,适用的转换场景:父子类指针或引用之间的转换;基础类型之间的转换;void*与其他任何类型指针之间的转换
(2)const_cast<type_id> (expression)
用于修改指针或引用的const、volatile属性
(3)dynamic_cast<type_id> (expression)
用于父子类指针或引用之间的转换,与static_cast不同的时,dynamic_cast有类型检查,如果不合格,返回空指针
(4)reinterpret_cast<type_id> (expression)
该转换会直接棒exprssion当作二进制,然后用type_id语义来解释,有时会得出想不到的值,所以很少用
4、c++四个智能指针: auto_ptr、unique_ptr、share_ptr、weak_ptr
5、野指针:未分配或者已释放
6、为何析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数 考点:虚函数 析构函数
析构函数为虚函数是为了,基类指针指向子类对象时,释放对象时,可以调用到子类析构函数,释放子类对象; 设置函数为虚函数是有代价的,类需要内部存储一个虚函数表和指向虚函数表的指针,所以不准备做基类还是不要默认虚函数了
7、函数指针
每一个函数都有一个入口地址,函数指针就是指向这个地址的指针
8、源码到可执行文件
预编译 -> 编译 -> 链接(静态,动态)