牛客网刷题总结—Day3

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
    //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
    //在函数传参的时候可以使用

    //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.关于几个文件操作函数

  int fseek( FILE* stream, long offset, int fromwhere );  
  fseek将文件位置指针重定位到fromwhere(SEEK_SET文件头0,SEEK_CUR文件当前位置1,SEEK_END文件末尾2)开始偏移offset个字节的位置;返回成功0,失败-1;
  
  long ftell(FILE* stream);
  返回文件位置指针当前位置相对于文件首的偏移字节数;
  
  
4.森林如何转换为二叉树
  
  首先一个树转换为二叉树的基本原则是:左孩子为其真孩子,其右孩子为其兄弟
  
  森林转换为二叉树   :
              首先将森林的树都转化为一棵棵二叉树
              从第一棵二叉树不动,将后一棵二叉树的根节点作为前一棵二叉树的根节点的右孩子
              依次至所有树进入二叉树
 
 
由此可知:将森林F转换为对应的二叉树T,F中叶结点的个数等于( T中左孩子为空的节点个数 )
     因为左孩子为其真孩子,森林中的叶节点转换到二叉树中其左孩子必空
 
 
5.使用一个类对象调用虚函数时,C++采用的——静态联编
 
  静态联编 通过对象名调用虚函数,在编译阶段就能确定调用的是哪一个类的虚函数
  
  动态联编 通过基类指针调用,在编译阶段无法通过语句本身来确定调用哪一个类的虚函数,只有在运行时指向一个对象后,才能确定调用时哪个类的虚函数
 
 
 

猜你喜欢

转载自www.cnblogs.com/exhina/p/12388856.html