牛客网刷题总结-C++面向对象
- C++类的数据成员的存储类型,不能是auto、register和extern:
原因:auto/register/extern表示的是变量的存储位置和作用域。auto变量存储在函数的堆栈空间,register存储在寄存器,extern表示这里没有新定义变量,只是扩展了一个已有全局变量的作用域。类和结构体中的变量是成员变量,其存储位置和作用域由定义对象的函数决定,不由这些对象自己决定。 - class A{
};
class B{
char ch;
int x;
};
class C{
public:
void Print(void){}
};
class D
{
public:
virtual void Print(void){}
};`下面四个类A,B,C,D,在32位机器上sizeof(A),sizeof(B),sizeof©,sizeof(D)值分别为()
类A空类型的实例虽然不包含任何信息,但是必须在内存中占一定的空间,否则无法使用这些实例,一般都是1
类B因为内存对齐所以为8,
类C里面虽然有函数,但是只需要知道函数的地址即可,而这些函数的地址只与类型相关,而
与类型的实例无关,编译器不会因为函数而在内存中多添加任何的额外信息.所以还是1
类D因为有虚函数,C++的编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的
每一个实例中添加一个指向虚函数表的指针.因为多了一个指针,所以在32位机器为4,64位机器为8
Foo b(); 声明了返回类型为Foo,参数为空的函数。因此导致b.fun()编译错误。