啊啊啊,作为大四马上毕业的一位老狗,即将面临着找工作的压力,回头看看自己学过的知识,好多都忘了,也有好多都是当时就没有学过。为了做一些准备去面试,我就复习+学习一下相关的知识点吧。先从c++开始。let‘s go!
ps:c++相关的题目参考的牛客网的c++面试经典导读。写的根据自己掌握的不足有所侧重。一些我不熟悉的知识点我会写的比较详细。
一、static关键字的作用
1.定义全局静态变量或者函数
那这样静态的变量或函数和非静态的有什么不同呢,就是隐藏。就是说,当一个源文件里定义的全局变量如果非静态的话,其他文件就可以访问到这个变量(通过extern),而静态的变量在外部访问的话,会产生链接错误,编译不会报错。
文件extern.cpp:
#include <iostream>
int a = 5;
static int b = 5;
static void printHelloStatic()
{ std::cout << "hello";}
void printHello()
{ std::cout << "hello";}
文件main.cpp
#include <iostream>
int main()
{
// 正常执行
extern void printHello();
printHello();
// 连接错误
extern void printHelloStatic();
printHello();
extern int a;
extern int b;
std::cout << a;// 正常执行
std::cout << b;// 连接错误
}
2.定义局部静态变量
这个就是在函数内部或者成员函数内部的变量了,也储存在静态存储区,通过多次调用该函数,这个变量也只执行一次初始化的语句。
3.静态成员
普通的成员在生成对象实例时,获得相应内存空间。静态成员在类创建时就已经分配好相应的内存。静态成员是相同类之间的共有成员,可以直接通过类名::静态成员来访问。
二、c与c++的区别
设计模式上:c是面向过程的语言 c++是面向对象的语言
语法上:有封装、继承、多态的特性
c++支持范式、如类模板、函数模板
c++有许多类型安全的功能,如强制类型转换
三、c++的四种cast转换
1.const_cast
这个其实我没太搞懂,按照百科的说法,修改类型的const或volatile属性。使用该运算方法可以返回一个指向非常量的指针(或引用)指向b1,就可以通过该指针(或引用)对它的数据成员任意改变。
#include <iostream>
using namespace std;
int main()
{
const int& a = 5;
int& b = const_cast<int &>(a);
b = 10;
cout << a;// 输出为10
return 0;
}
大概就是可以改变指向常量的指针或引用的常量值吧。。
2.dymanic_cast
这个是用于基类与派生类之间的相互转换的。当派生类向父类转换,是绝对没有问题的。父类像派生类转换的话,需要父类指针本来就是指向的派生类对象,否则转换结果为空。
还要注意就是dynamic_cast在程序运行时转换,所以必须通过类的虚函数表来判断两个类的继承关系,所以基类中必须有定义的虚函数。
#include <iostream>
using namespace std;
class Base
{
public:
virtual void f() {};
};
class Child:public Base
{
public:
void f() { cout << "111"; }
};
int main()
{
Base* a = new Child();
// 成功转换
Child* c = dynamic_cast<Child*>(a);
c->f();
delete a;
// 转换失败
a = new Base();
c = dynamic_cast<Child*>(a);
c->f();// 空指针错误
delete a;
return 0;
}
3.static_cast
可以用于基类于派生类的相互转化,基类转化为派生类没有安全性检查。
基本数据类型的相互转化,也没有安全性检查
不同指针类型的转化
任意类型转化为void(并不知道有什么用)
4.reinterpret_cast
啥都可以转,包括int转指针这种的。
使用cast有啥好处:使用这些cast运算符替代c中的强制类型转换,可以更多的进行安全性检查,防止转换发生错误丢失。