封装:
封装是将类的属性和方法有机结合在一起,通过访问限定符隐藏具体实现细节。对外公开接口来和对象进行交互。
如何计算类的大小?
类中只保存成员变量,成员函数都存在公共代码段。因为每个对象的变量是不同的,但成员函数却是相同的,如果将成员函数存在类里,将会浪费空间,所以将成员函数放在公共代码段。所以类的大小就是存储成员变量空间的大小。而计算成员变量空间的大小和计算结构体大小一样会用到内存对齐。
内存对齐的规则:
1.第一个变量在结构体偏移量为0处
2.其他变量对齐到对齐数的整数倍处
对齐数=min(编译器默认对齐参数,变量的大小)VS默认对齐参数为8
3.结构体总大小为最大对齐数的整数倍
class Student {
private:
char id;
int _age;
char* name;
double high;
public:
int fun(){}
};
sizeof(Student)=24Byte
空类(没有成员变量)的大小为1Byte(一字节不是存数据,而是占位)
class Student {
private:
public:
int fun(){}
};
class Student {};
sizeof(Student)=1Byte
this指针能否为空?
this指针存在栈区,因为this指针是参数。this指针可以为nullptr,只是不能解引用
class A
{
public:
void Print()
{
cout << "Print()" << endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->Print();
return 0;
}
程序编译运行结果是 正常运行
因为p->print();p并没有解引用,只是将p作为参数传给Print,Print(A* this)
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
return 0;
}
程序编译运行结果是 程序崩溃 因为cout<<_a<<endl;//cout<<this->_a<<endl;this指针解引用了,空指针不能解引用,所以程序崩溃