内存四区--搞清楚你写的代码是写在哪个地方的

内存分为四个区域:代码区,全局区,堆区,栈区

1.全局区

全局区存放的是 全局变量
静态变量 ,即static关键字,后面会讲解静态成员变量
常量,常量又可分为字符串常量,const修饰的全局变量(全局常量)
在程序结束后系统释放。

2.栈区

由编译器自动分配释放,开辟的数据由编译器自动释放
堆区存放的是 局部变量,形参
注意,不要返回局部变量的地址,因为栈区的数据在函数执行完后就会自动释放

#include<iostream>
using namespace std;
int* func();
int* func()
{
	int a = 10;
	return &a;
}
int main()
{
	int* ptr = func();
	cout << *ptr << endl;   //这一次能正确打印是因为编译器做了保留
	cout << *ptr << endl;   //之后就不再保留了
	return 0;
}

运行后发现两次输出的值不一样
在这里插入图片描述

3.堆区

由程序员分配释放,若不释放,程序结束之后由操作系统回收。
在c++中主要利用new在堆区开辟内存,是四个区域中最大的。

4.代码区

存放函数体的二进制代码

静态成员变量

1.所有对象共享同一份数据,静态变量是跟全局变量一样存放在全局区,所以是共享使用的
2.在编译阶段分配内存,即在程序还没有运行之前就已经分配好了。
3.类内声明,类外初始化

#include<iostream>
#include<string.h>
using namespace std;

class person
{
public:
	int getB( )
	{
		return m_B;
	}
	static int m_A;  //类内声明
private:
	static int m_B; //静态变量也是有访问权限的;
};
int person::m_A = 10;//类外初始化,::是为了说明实在person的作用域下,而不让它成为全局变量
int person::m_B = 10;

int main()
{
	person p1;
	cout << p1.m_A << endl;
	person p2;
	p2.m_A = 520;    //通过对象访问,或者 person::m_A通过类名来访问
	cout << p1.m_A << endl;    //p1.m_A的值会发生改变,是因为静态变量是所有对象共享的
	cout << p2.getB() << endl;  //要获取私人权限的静态变量B,需要通过函数接口
}

静态成员函数

静态成员函数特点:
1 程序共享一个函数 ,这个跟静态成员变量是一个意思
2 静态成员函数只能访问静态成员变量

#include<iostream>
#include<string.h>
using namespace std;

class Person
{

public:

	static void func()
	{
		cout << "func调用" << endl;
		m_A = 100;
		//m_B = 100; //错误,不可以访问非静态成员变量,因为这个函数是共享的,但非静态成员变量在每个对象里的值都不一样,调用的时候不知道调用哪一个m_B;
	}

	static int m_A; //静态成员变量
	int m_B; // 
private:

	//静态成员函数也是有访问权限的
	static void func2()
	{
		cout << "func2调用" << endl;
	}
};
int Person::m_A = 10;


void test01()
{
	//静态成员变量两种访问方式

	//1、通过对象
	Person p1;
	p1.func();

	//2、通过类名
	Person::func();  


	//Person::func2(); //私有权限访问不到
}

int main() {

	test01();

	system("pause");

	return 0;
}

成员变量和成员函数分开存储

在C++中,类内的成员变量和成员函数分开存储

只有非静态成员变量才属于类的对象上

静态成员变量和成员函数都不属于类的对象上,很容易理解,在定义类的函数时,每个对象调用时运行过程都是一样的,只不过传的参数不同。

#include<iostream>
#include<string.h>
using namespace std;

class Person
{
}; 
class People
{
	int m_a;
};
class pear
{
	int m_b;
	void printf()
	{
		cout << "this a function!" << endl;
	}
};
class pig
{
	static int m_c;
};
int pig::m_c = 5;  //类外初始化
class pag
{
	static int m_c;
	static void print()
	{
		m_c = 10;
	}
};
int pag::m_c = 5;  //类外初始化
int main()
{
	Person p1;
	cout << sizeof(p1) << endl;    //空对象也占有一个字节
	People p2;
	cout << sizeof(p2) << endl;    //一个非静态变量的大小,四个字节
	pear p3;
	cout << sizeof(p3) << endl;    //函数不占用对象空间,四个字节
	pig p4;
	cout << sizeof(p4) << endl;    //静态成员变量也不占对象空间
	pag p5;
	cout << sizeof(p5) << endl;    //静态成员函数也不占对象空间,就非静态成员变量占了对象空间

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值