首页 > 试题广场 >

c++定义一个空的类CTest,CTest没有定义任何成员变

[不定项选择题]
c++定义一个空的类CTest,CTest没有定义任何成员变量和成员函数,在32位机器上,以下结论正确的有:
  • 对该类求sizeof,结果为0。
  • 给CTest添加构造函数,再对CTest求sizeof,结果为1.
  • 给CTest添加虚函数,再对CTest求sizeof,结果为4.
  • 给CTest添加虚函数,再对CTest求sizeof,结果为5.
空类求sizeof为1,加不加构造函数对sizeof没影响,但有了虚函数,则需要有一个指针指向虚函数表,32位下,指针sizeof为4
发表于 2017-08-14 01:35:13 回复(2)
C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。

对有虚函数的类来说,必须为它的对象提供运行时类型信息(RTTIRun-Time Type Information)和关于虚函数表的信息,常见的做法是在对象中放置一个指向虚函数表的指针,此外,为了支持RTTI,许多编译器都把该类型信息放在虚函数表中。但是,是否必须采用这种实现方法,C++标准没有规定,主流编译器均采用的一种方案。 

虚函数、成员函数[包括静态与非静态]、和静态数据成员都是不占用对象的存储空间的

对象大小  =  虚函数指针  +   所有非静态数据成员大小   +   因对齐而多占的字节

例子:
#include <iostream>  
using namespace std;

class   A
{
};

class   B
{
    char   ch;
    void   func() {  }
};

class   C
{
    char   ch1;             //占用1字节  
    char   ch2;             //占用1字节  
    virtual   void   func() { }
};

class   D
{
    int   in;
    virtual   void   func() {}
};

int  main()
{
    A   a;
    B   b;
    C   c;
    D   d;
    cout << sizeof(a) << endl;//result=1  
    cout << sizeof(b) << endl;//result=1  
    cout << sizeof(c) << endl;//result=8     
    cout << sizeof(d) << endl;//result=8     
}

发表于 2018-04-07 15:57:59 回复(4)
空类sizeof为1,大小与构造函数无关;需要有一个指针指向虚函数,32位下大小是4字节。
发表于 2018-04-18 20:30:00 回复(0)
sizeof一个空类
1
2
3
class A { };
  
cout<<sizeof(A)<<endl;//1

注:class A是一个空类型,它的实例不包含任何信息,本来求sizeof应该是0。

但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。

至于占用多少内存,由编译器决定。Visual Studio 2008中每个空类型的实例占用一个byte的空间。

sizeof一个带有析构和构造函数的类
1
2
3
4
5
6
7
8
9
10
11
12
13
class B
  
{
  
public:
  
B() {}
  
 ~B() {}
  
};
  
cout<<szieof(B)<<endl;//1

注:class B在class A的基础上添加了构造函数和析构函数。

       由于构造函数和析构函数的调用与类型的实例无关(调用它们只需要知道函数地址即可),在它的实例中不需要增加任何信息。

       所以sizeof(B)和sizeof(A)一样,在Visual Studio 2008中都是1。


sizeof一个带有虚函数的类
1
2
3
4
5
6
7
8
9
10
11
12
13
class C
  
{
  
public:
  
C() {}
  
virtual ~C() {}
  
};
  
cout<<sizeof(C)<<endl;//4

注:class C在class B的基础上把析构函数标注为虚拟函数。C++的编译器一旦发现一个类型中有虚拟函数,

       就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。

       在32位的机器上,一个指针占4个字节的空间,因此sizeof(C)是4。

       C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。

       如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,

       在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的。


sizeof一个带有成员变量的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class D {
  
    char ch;
  
    void func() { }
  
};
  
class E {
  
    char ch1; //占用1字节
  
    char ch2; //占用1字节
  
    virtual void func() { }
  
};
class F {
  
    int in;
  
    virtual void func() { }
  
};
  
cout << "D的大小"<< sizeof(D) << endl;//1
cout << "E的大小" << sizeof(E) << endl;//8
cout << "F的大小" << sizeof(E) << endl;//8
注:类和结构体一样,需要考虑数据对齐和补齐规则
发表于 2020-08-11 18:59:37 回复(3)
下次多选题能不能标明多选。
发表于 2022-11-27 17:03:11 回复(0)
不管类中有无构造函数,空类的sizeof就是1,如果类中有内容了,1就失效了,siezeof的大小与内容有关了,这里加一个虚函数,就需要分配一个指针去指向该虚函数,32为机器,指针大小为4,所以sizeof为4
发表于 2019-04-04 12:08:02 回复(0)
B 这选项有误导性啊 .... 加不加都是一呀
发表于 2024-01-15 02:10:19 回复(0)
空类系统给大小为1;类中只有一个虚函数,那么就一个虚表指针,类大小就是一个虚表指针大小~
发表于 2021-03-31 17:45:57 回复(0)
空类大小为1是为了2个空对象不会使用同一个地址。
但是如果空对象是一个类的成员,它本身不会占1byte。
发表于 2020-04-23 22:22:23 回复(0)

虚函数,成员函数,静态成员变量都不占用对象的存储空间

发表于 2019-11-30 15:25:02 回复(0)
还是多选???措不及防
发表于 2019-04-04 20:02:04 回复(0)
对象大小=虚函数指针(多个虚函数也只有一个指针,指向虚函数表)+非静态数据成员的大小+对齐的字节
发表于 2019-03-09 16:21:55 回复(0)
学习了,原来空类的大小为1
发表于 2018-12-02 16:56:18 回复(0)
空类,或类中有构造函数或者析构函数这几种情况,sizeof大小为1
当类中有虚函数定义了,sizeof要加4(32位系统),因为有指针指向虚函数表,要存储这个指针
当然还要考虑内存对齐的问题
编辑于 2018-07-11 10:55:14 回复(0)
空类的sizeOf为1,应该坚信自己的选择的!
发表于 2018-04-10 21:23:16 回复(0)