面向对象基础知识(一)

本文介绍了封装的概念,类的大小计算方法(包括考虑内存对齐),以及this指针的使用及其空指针处理。通过实例说明了如何避免空指针解引用导致的程序崩溃。
摘要由CSDN通过智能技术生成

封装:

封装是将类的属性和方法有机结合在一起,通过访问限定符隐藏具体实现细节。对外公开接口来和对象进行交互。

如何计算类的大小?

类中只保存成员变量,成员函数都存在公共代码段。因为每个对象的变量是不同的,但成员函数却是相同的,如果将成员函数存在类里,将会浪费空间,所以将成员函数放在公共代码段。所以类的大小就是存储成员变量空间的大小。而计算成员变量空间的大小和计算结构体大小一样会用到内存对齐。

内存对齐的规则:

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指针解引用了,空指针不能解引用,所以程序崩溃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yyycqupt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值