Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中空类的行为+;_C++ - Fatal编程技术网

C++ c+中空类的行为+;

C++ c+中空类的行为+;,c++,C++,我编写了这个小程序: #include <iostream> using namespace std; class a{ }; int main () { a *obj=new a(); cout<<sizeof(obj)<<endl; cout<<sizeof(*obj)<<endl; delete obj; } 我可以理解它使用4个字节来存储对象的地址。 但我不明白的是1字节。 由于它是一个空类,我对1字节(对象大小)的用途

我编写了这个小程序:

#include <iostream>

using namespace std;

class a{
};

int main ()
{
a *obj=new a();
cout<<sizeof(obj)<<endl;
cout<<sizeof(*obj)<<endl;
delete obj;
}
我可以理解它使用4个字节来存储对象的地址。 但我不明白的是1字节。 由于它是一个空类,我对1字节(对象大小)的用途产生了疑问

我的第二个问题是会调用默认构造函数吗?
如果是的话,它会做什么?

字节是存在的,因为对象的大小不能在C++中< <代码> 0 >代码>。这是一个伪字节。设想一个
a
数组-如果
a
的大小为
0
,则所有对象都位于同一地址


理论上,调用一个空的默认构造函数。实际上,它被优化了,因为它没有可观察的行为。

首先
sizeof
打印32位系统中32位指针的大小。第二个
sizeof
打印出
a
内容的大小,该内容与1字节对齐,因为不同的对象必须在不同的地址中创建

但是,即使使用非虚拟方法,您也可以拥有零大小的类:

class A
{
    A()
    {
       cout << "Hi" << endl;
    }
    char unused[];
    // Note: Putting at least a virtual method increases the size to 4 bytes.
};
输出:

0x22ff00

0x22ff00


每个对象必须有一个不同的地址,所以C++中的对象的最小大小为1。p> 默认构造函数不执行任何操作

1字节(对象大小)的用途是什么

<>在C++中,所有不同的对象必须有不同的地址。为了实现这一点,所有对象至少与最小的可寻址单元(即一个字节)一样大

我的第二个问题是会调用默认构造函数吗

从技术上讲,是的。如果您没有声明自己的默认构造函数,那么如果需要,将隐式生成一个构造函数。隐式构造函数将默认构造所有成员和基本子对象。然而

如果是,它基本上会做什么


由于类没有需要初始化的成员或子对象,隐含的构造函数是微不足道的:它不做任何事情。

从这里学到:第二个问题在给定的所谓的重复链接中还没有答案。@萨瑟克OK请考虑我的评论我的帮助,这个链接可能是第二部分,“Sarthi和我不是投票人,但我投票了。我不知道零数组是怎么回事。”暗示相同的地址。你可以在不同的地址有空对象…@事实上,我从来没有说过空数组…@lucian..关于第二个可能是正确的,但是第一个可能是错误的..我想是错误的。顺便说一句,我没有投反对票:)这只是我的猜测,别担心…我可能也错了。链接说是因为你从来没有提到过的地址。@sarathi“如果a的大小为0,则所有对象都将位于同一地址。”part?此答案与所问的问题无关。@sarathi无关?为什么?是否有否决票的原因?我相当肯定我的答案是正确的,尽管它可能掩盖了一些无关紧要的细节,如空基类。
class A
{
    A()
    {
       cout << "Hi" << endl;
    }
    char unused[];
    // Note: Putting at least a virtual method increases the size to 4 bytes.
};
cout << sizeof(A) << endl; // Prints out 0
A a1;
A a2;

cout << &a1 << endl;
cout << &a2 << endl;