码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 类 问题

时间:2015-04-22 13:00:42      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:


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个字节进行函数调用只有死路一条。






c++ 类 问题

标签:

原文地址:http://www.cnblogs.com/weibingkitty/p/4446748.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!