1.C++中的cast
//reinpreter_cast<type-id> (expression)
//type-id必须是一个指针、引用、算术类型、函数指针或者成员指针
S ss;
S* ps = &ss;
int a = reinterpret_cast<int> ( ps ); // reinterpret_cast 仅仅是复制 ps 的比特位到 a
cout << a << " " << ps << endl; //7208636 0x6dfebc
//type-id必须是一个指针、引用、算术类型、函数指针或者成员指针
S ss;
S* ps = &ss;
int a = reinterpret_cast<int> ( ps ); // reinterpret_cast 仅仅是复制 ps 的比特位到 a
cout << a << " " << ps << endl; //7208636 0x6dfebc
//const_cast<type_id> (expression) - type_id -> 指针或者引用
//type_id和expression 类型相同 - 修改对象的const/volatile - 强制取消对象的常量性
const int ci = 10;
int& bi = const_cast<int&> (ci);
cout << bi << " " << ci << endl; //10 10
cout << &bi << " " << &ci <<endl; //0x6dfeb4 0x6dfeb4 两变量地址相同
bi = 8;
cout << bi << " " << ci << endl; //8 10
cout << &bi << " " << &ci <<endl; //0x6dfeb4 0x6dfeb4
//在函数传参的时候可以使用
//type_id和expression 类型相同 - 修改对象的const/volatile - 强制取消对象的常量性
const int ci = 10;
int& bi = const_cast<int&> (ci);
cout << bi << " " << ci << endl; //10 10
cout << &bi << " " << &ci <<endl; //0x6dfeb4 0x6dfeb4 两变量地址相同
bi = 8;
cout << bi << " " << ci << endl; //8 10
cout << &bi << " " << &ci <<endl; //0x6dfeb4 0x6dfeb4
//在函数传参的时候可以使用
//static_cast < type-id > ( expression ) - 相当于大部分隐式或者显式的转换
//该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性
//dynamic_cast只用于对象的指针和引用,主要用于执行“安全的向下转型”
另外关于volatile:
volatile类似于大家所熟知的const也是一个类型修饰符
volatile是给编译器的指示来说明对它所修饰的对象不应该执行优化 - volatile的作用就是用来进行多线程编程
2.行指针声明
int a[5][10];
int (*p)[10] = a; 一个指向每行元素个数为10的指针
3.关于几个文件操作函数
4.森林如何转换为二叉树
首先一个树转换为二叉树的基本原则是:左孩子为其真孩子,其右孩子为其兄弟
森林转换为二叉树 :
首先将森林的树都转化为一棵棵二叉树
从第一棵二叉树不动,将后一棵二叉树的根节点作为前一棵二叉树的根节点的右孩子
依次至所有树进入二叉树
由此可知:将森林F转换为对应的二叉树T,F中叶结点的个数等于( T中左孩子为空的节点个数 )
因为左孩子为其真孩子,森林中的叶节点转换到二叉树中其左孩子必空
5.使用一个类对象调用虚函数时,C++采用的——静态联编
静态联编 通过对象名调用虚函数,在编译阶段就能确定调用的是哪一个类的虚函数
动态联编 通过基类指针调用,在编译阶段无法通过语句本身来确定调用哪一个类的虚函数,只有在运行时指向一个对象后,才能确定调用时哪个类的虚函数