面向对象模型一点感想

基础知识

1.问题

首先我们用最简单的程序去探究一下我们的问题,我们都知道结构体他的大小是根据成员变量的大小进行一个操作的,这个我们在C语言中已经得到了验证,下面我们来对类的大小进行操作。

代码

#include "iostream"

using namespace std;

class C1
{
public:
	int i;
	int j;
	int k;
private:

};

class C2
{
public:
	int i;
	int j;
	int k;
	//变量和静态变量函数没有放在一块
	static int m;//存储到全局的数据区域中
public:
	//函数是存储在代码段
	int getK() const { return k; };
	void setK(int val){ k = val; };
};
int main()
{
	cout << "C1 大小 = %d" << sizeof(C1) << endl;
	cout << "C2 大小 = %d" << sizeof(C2) << endl;
	system("pause");
	return 0;
}

最后我们运行可以看到都是12,通过这个我们可以知道类的普通成员属性是定义这个类大小的。然而我们看到的C2也是12但是我们前面学习了函数也是有一定大小,静态变量也是有大小的,所以我们发现为什么没有出现了,原来我们在以前学习的内存四区就晓得,静态变量它是放在静态区,而类的成员函数他是放在代码区域,ps(这里不太懂内存四区的朋友可以去查一下相关的知识)

问题2 C++编译器的调用

上面的标题没有说完整,主要是因为文字太长,C++编辑器怎么知道我是那个类的对象在调用代码区域的成员函数。
下面就是关键的地方,C++编辑器是怎么对普通成员函数进行处理的

代码

#include "iostream"

using namespace std;

class Test
{
public:
	Test(int a, int b){
		this->a = a;
		this->b = b;
	};
	~Test(){
		cout << "我是析构函数" << endl;
	};

	int getA()
	{
		return this->a;
	}
private:
	int a;
	int b;
};


void main()
{
	Test t(1, 2);//====>t(this,1,2); ===>Test(&t,1,2)
	t.getA();//===>getA(&t);
	system("pause");
}
这里面的关键点就在定义了一个类,Test t(1,2)的时候C++编辑器在内部就给我们转换成了一个函数void test_initalize(Test* pthis,int a,int b)然后我们才能在里面使用这个方法,这样我们就确定了是那个类在调用这个方法,其实我们在看看本质还是C语言的指针作为函数的参数的应用,这个是我觉得可以用C语言替换的一些地方。

总结

1.C++类对象中的成员变量和成员函数是分开存储的,C语言中的内存四区模型他仍然是有效的!
2.C++中类的普通成员函数都是隐藏一个指向当前对象的指针this。
3.静态成员函数,成员变量属于类。
静态成员函数与普通成员函数的区别
静态成员函数不包含指向具体对象的指针。就是没有this指针。
普通成员函数包含了一个指向具体对象的指针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值