面经

一、类型转换运算符
  class Base{..}-->class A : public Base{...};
  dynamic_cast:将基类类型的指针或引用转换为同一继承层次中其他类型的引用或指针;dynamic_cast操作符其实执行两个动作,首先检查转换是否有效,如果无效则进行错误处理,如果有效,进行转换
      Base *bs = new A; A *a = dynamic_case<A*>(bs);//一般将基类转为派生类指针用(一般情况不允许基类指针或引用转为派生类指针或引用)
      A a; Base &bs = &a; A &a1 = dynamic_case<A &>(bs);//引用转换形式
  const_cast: 常量转化为非常量,const B *b1 = new B();-->B *b2 = const_cast<B*>(b1);
     (1)常量指针被转化成非常量指针,并且仍然指向原来的对象;
      (2)常量引用被转换成非常量引用,并且仍然指向原来的对象;
      (3)常量对象被转换成非常量对象。
  static_cast:用法:static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
     (1)用于类层次结构中基类和子类之间指针或引用的转换。
       进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
       进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
     (1)用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
     (1)把空指针转换成目标类型的空指针。
     (1)把任何类型的表达式转换成void类型。
     注意:static_cast不能转换掉exdivssion的const、volitale、或者__unaligned属性。
  reinterpret_cast:reinterpret_cast (exdivssion)它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针
     (1)int n=9; -->double d=reinterpret_cast (n);

   访问类的私有成员:C++类外直接访问私有成员

   C++类外面如何访问私有成员变量?只要有该对象的指针就可以访问。
 例子如下,要访问A对象的私有成员m_int,和m_double怎么办?只要操作A* a即可,
class A
{
public:
    A(int a, double d)
    {
        m_int = a;
        m_double = d;
    }
private:
    int m_int;
    double m_double;
};

int main()
{
    A* a = new A(1, 2);
   cout << "a is:"<<a << endl;//输出对象a存放的首地址
   int* pa = reinterpret_cast<int*>(a);//用reinterpret_cast将对象指针转成int*,通过该指针就可以访问成员m_int
    cout << pa << endl;

   cout << *pa << endl;

   double* dp = reinterpret_cast<double*>(pa+2);//+2是因为内存对齐,int和double都是8个字节
    cout << *dp << endl;
    return 0;
}
由此可见,指针是非常危险的,可以越过类的私有权限访问成员。

还有一种更简便的方法,构造一个和A完全一样的类,把私有成员声明为公有,然后用reinterpret_cast将A类型对象指针转化成之前构造的类的对象指针,通过该指针访问这些public成员即可。


二、int *Num = new int[-1];                                // error C2148: 数组的总大小不得超过 0x7fffffff 字节


三、关于指向空的对象指针可以访问类的不包含成员变量的成员函数的原因 

        http://blog.csdn.NET/starlee/article/details/2062586

        #include <iostream>  
       using namespace std;  
  
       class A {   
         int a;  
         int b;  
         public:  
         void print(){  
           cout << "abcd";  
         }  
         void print_a(){  
           cout << a << endl;  
         }  
       };  
         
       int main(void) {  
         A *a = NULL;  
         a->print(); //可以运行  
         a->print_a();//出现段错误  
         return 0;  
       } 

        c++中,每个对象都拥有一份独立的成员变量空间。而对于成员函数,并不是每个对象都拥有一份成员函数体而是所有的对象共用一份成员函数,程序编译之后,成员函数的地址就已经确定。成员函数的非虚函数由调用该函数的对象类型或者指针类型决定调用基类还是子类的函数块,然后直接进行调用,如果该函数用到了对象的成员变量,那么当遇到该变量时,将该变量自动转换为this->变量。

        这是整个调用过程。

        对于上述问题,指向空的对象指针,是可以调用该类的非静态且不包含成员变量的函数(不需要this指针)。然而当遇到成员变量后,调用该对象的this指针,为空,会出现段错误。

      (** 对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。 当程序被编译之后,此成员函数地址即已确定。而成员函数之所以能把属于此类的各个对象的数据区别开, 就是靠这个this指针。函数体内所有对类数据成员的访问, 都会被转化为this->数据成员的方式。
    而一个对象的this指针并不是对象本身的一部分,不会影响sizeof(“对象”)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。)


四、C++中不能声明为虚函数的有哪些函数   

       http://www.cnblogs.com/NeilZhang/p/5427872.html













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值