C++学习笔记(第三篇)

一、继承

继承使类之间有了相互关联的层级关系,从最开始的父类中可以创造出很多的派生类,避免写出很多重复的代码,使得我们可以把一系列的通用的代码放到基类中,这样我们就可以不用像写模板那样重复了。

class Entity
{
public:
	float X,Y;
	void Move(float xa,float ya)
	{
			X +=  xa;
			Y +=  ya;
	}
};

class Player : public Entity                             //继承,使得Player不仅仅是Player类型,还是Entity类型。Player类就是增加了额外功能的Entity类。
{
public:
	const char* Name;
	void PrintName( )
	{
			std::cout << Name << std::endl;
	}
};

int main()
{
		Player player;
		player.Move(5,5);
}

二、可见性

C++中我们只有三个访问修饰符:private、protected、
(1)private:类中默认可见性为private,意思是只有该类可以读取和更改这些变量。
(2)protected:意思是这个类以及它所有的派生类都可以访问这些成员。
(3)public:结构体默认可见性为public,意思是类外,类内都可以访问这些成员。

三、数组

	int example[5];					//创建在栈上,跳出这个作用域时被销毁
	int* another = new int[5];		//用new关键字创建是在堆上,会一直存活到我们把它销毁或者程序结束
									//因此如果有函数要返回新创建的数组,那么必须用new来分配,除非传入的是地址
	delete[] another;     			//因此要用delete来删除,但是delete关键词只能删除分配在对上的,经验上讲不用new就不用delete 

四、堆与栈

应用程序将整个程序加载到内存中以及分配了一大堆RAM,堆和栈是RAM中的两个区域。区别:1.通常是具有预定义大小的内存区域,也是具有默认大小的空间但是会随着使用增长和变化。2.中分配的内存会在作用域结束后自动释放,这个作用域了可以是main,可以是for循环,可以是while循环,栈存储本身就是从一个地址开始像代码一样一条条往后分配空间,释放后栈就回到它原来的位置,栈释放内存没有任何开销,不需要栈指针反向移动然后返回栈指针地址,就像电脑将游戏光盘弹出一样快捷。而是将一定数量的物理RAM分配给你,程序会维护一个空闲列表(free list)的东西,它会跟踪记录哪些内存块是空闲的以及它们的位置,当需要动态分配内存时会它会浏览列表找到块至少和你要的一样大的内存并将这块内存的指针给你,并对这块内存做登记,如果后面你需要的空间超过了这块初始分配的空间那么潜在成本是巨大的,想象一下你和公司批款。3.在分配空间中有出现cache miss的情况,相比之下分配内存一般不会出现这种问题。当数据量很多时差距就会体现出来,综上所述能用栈就别用堆,除非生存期等问题必须要用堆。

struct Vector3
{
	float x,y,z;
};

int mian()
{
	//用栈分配空间
	int value = 5;		
	int array[5];
	Vector3 vector;

	//用堆分配空间,关键是用new关键词在库中调用malloc分配空间,new分配的空间会一直存在除非用delete来释放
	int* hvalue = new int;
	*hvalue = 5;
	int harray[5] = new int[5];
	Vector3* hvector = new Vector3();
}

五、栈的生存期:

中分配的内存会在作用域结束后自动释放

int* CreateArray()
{
	int array[50];     				//这个array数组并没有存储在堆上因为没有使用new
	return arrey;					//返回一个指向栈内存的指针
}

想要使数组存储在堆上有两种方法,第一种是在堆上分配数组,第二种是将创造的数据复制给一个在栈作用域之外的变量

/***********************************************第一种方法:在堆上分配数组************************************************/
int* CreateArray()
{
	int* array = new int[50];     				//这个array数组并没有存储在堆上因为没有使用new
	return arrey;					//返回一个指向栈内存的指针
}
/*****************************第二种方法:将创造的数据复制给一个在栈作用域之外的变量*******************************/
void CreateArray(int* array)
{

}

int main()
{
	int array[50];
	CreateArray(array);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值