c++ 类 问题


1.在C++中空的结构体和类都是占用1个字节,这个1个字节是编译器的一个特殊处理。不然大家考虑下面的程序


A a;

A b;


cout<<&a<<endl;

cout<<&b<<endl;


假设空结构体和空类不占内存,那么对象a和对象b必然有相同的地址,不同的对象有相同地址,这就是很不合理的逻辑。


因此编译器做了一个特殊处理,类和结构体至少占用一个字节,


拥有虚函数的类其它大小至少为4,因为VPTR是指针需要占用4个字节。


 
  
  1. classA
  2. {
  3. private:
  4.        int m_value;
  5.  
  6. public:
  7.         A(intvalue)
  8.         {
  9.                 m_value=value;
  10.         }
  11.        void Print1()
  12.         {
  13.                 printf("hello world");
  14.         }
  15.        void Print2()
  16.         {
  17.                 printf("%d", m_value);
  18.         }
  19. };
  20.  
  21. int main()
  22. {
  23.         A*pA=NULL;
  24.         pA->Print1();
  25.         pA->Print2();
  26.  
  27.        return 0;
  28. }

2.这个问题考察应聘者对C++对象模型的掌握,在C++中,类中定义的成员变量和成员函数是分开存储的,所有成员函数,存储在代码段,而成员变量存储在栈或者堆。

了解这个对象模型后,就可以知道,print1中没有对成员变量进行访问,这样不会访问到系统预留的0地址区域,因此不会有错,而print2访问量成员变量,根据对象模型也就是访问了0地址区域,因此段错误。


 
  
  1. classA
  2. {
  3. private:
  4.        int m_value;
  5.  
  6. public:
  7.         A(intvalue)
  8.         {
  9.                 m_value=value;
  10.         }
  11.        void Print1()
  12.         {
  13.                 printf("hello world");
  14.         }
  15.        virtual void Print2()
  16.         {
  17.                 printf("hello world");
  18.         }
  19. };
  20. int main()
  21. {
  22.         A*pA=NULL;
  23.         pA->Print1();
  24.         pA->Print2();
  25.  
  26.        return 0;
  27. }


3.在NULL地址处没有一个合法的对象,因此不会有一个合法的VPTR,因此在调用print2的时候,将会出现段错误,因为根据虚函数的原理,NULL开始的4个字节并不可能指向正在虚函数表,通过这4个字节进行函数调用只有死路一条。






转载于:https://www.cnblogs.com/weibingkitty/p/4446748.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值