定义一个空类,对该类求sizeof结果为1,因为在声明该类型的实例的时候,必须知道这个类在哪存在,否则无法使用这些实例。至于一个空类占多少内存,由编译器决定,vs中每个空类型的实例占用1字节的空间。
如果在该类型中添加一个构造函数和析构函数,再对其求sizeof还是1,因为你生命一个空类本身就存在默认构造函数和析构函数。
那如果把析构函数声明为虚函数,或者定义一个虚函数,发现再求sizeof变成了4!(在32位的机器上,如果是64位则是8)
原因是C++的编译器一旦发现一个类中有虚函数,就会为该类生成一个虚函数表,并在该类的每一个示实例中添加一个指向虚函数表的指针就是vptr。
类的成员变量和成员函数是分开存储的;
只有 非静态成员变量 才属于类的对象上;
class Person{
public:
int m_A;//非静态成员变量;属于类的对象上
static int m_B;//静态成员变量,不属于类的对象上;(记得类内声明,类外初始化)。
void func(){
} //非静态成员函数;不属于类的对象上,//一份就行,//this指针。
static void func2(){
};静态成员函数,不属于类的对象上;
}
int Person::m_B=0;//类外初始化;
//使用Perosn 创建一个对象,其sizeof为4;
父类中所有非静态成员属性都会被子类继承下去,但是父类的私有属性会被编译器隐藏。子类不能访问而已,但是被继承了;
class Father(){
public :
int m_a;
private:
int m_b;
protected:
int m_c;
};
class son :public Father(){
int m_d;
};
//创建一个子类对象,其sizeof为16=4*4;
类的继承关系和内存分布混合;没看太懂;添加链接描述
扫描二维码关注公众号,回复: 13566392 查看本文章
默认权限(struct-public, class-private)
是否可用于声明模板(struct不可以, class可以)
-
进程之间通信方式
-
内联函数与宏定义的区别添加链接描述
-
new 和 malloc 区别添加链接描述
-
构造/析构函数顺序添加链接描述
-
const 关键字的作用添加链接描述
-
sizeof ,strlen 和\0
1、sizeof是一个关键字,而strlen确实一个函数。
2、sizeof求的是字节长度,而strlen求的却是实际长度。
int a=1;sizeof(a)==4而strlen(a)=1
3、sizeof求的是分配过来的长度,而strlen求的却是实际使用的长度。
比如:char a[30]="abcd";
sizeof(a)=30;而strlen(a)=4;
4、strlen求的长度是以'\0'结束的。
比如char a[30];strlen(a)的结果是不定的,而sizeof(a)=30;
char a[30]={
'a','b','c'};对于strlen来说也是不定的,而sizeof却是30.