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






郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。