C++动态内存分配

动态内存申请,我们程序请求的动态内存由系统从内存 堆 中分配。

    栈Stack:就是有编译器申请并释放

    堆Heap:就是有程序员申请并释放

动态申请内存

c++的动态内存申请是以类型为单位进行内存分配的,而c是以字节malloc(sizeof())分配。

C++使用new,一般分为两个步骤:

  • operator new 分配内存空间,这里使用malloc()函数
  • placement new 调用构造函数,初始化开辟的空间
  • 释放使用 delete 指针
// 表示动态分配一个类,并使用类的构造函数
Box *ptr = new Box();

// 表示动态分配一个int ,初始化为 1
int *ptrint = new int(1);

// 表示动态分配一个数组,数组大小为10
int *ptrarray = new int [10];

C直接使用malloc()函数,释放使用 free(指针)

单纯的malloc函数只能开辟空间,无法初始化,而new 不仅可以开辟还能初始化

 

C++类

#include <iostream>
using namespace std;

class Box
{
private:
	/* data */

public:
	Box(int x);// 类的构造函数
	~Box();// 类的析构函数——删除函数
	// 友元函数声明,友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。
	friend void frientfunc(Box box);//类的友元函数,并不是类的成员函数,定义在类声明的内部,
	// 友元类声明
	friend class fribox;// 可以访问类的私有有成员,或者受保护成员
	// 拷贝构造函数,使用当前类 之前创建的对象 来初始化新的对象,需要使用当前类的引用对象
	Box(const Box &obj); // obj引用对象是用于初始化另一个对象的。

	double length = 1;
	double width; 
	// 直接在类中定义函数方法,类方法使用类的成员时直接使用就好
	double VOL(void){
		return length * width;
	}
	Box* VOL1();


};

// ********类的构造方法********
// 创建类时自动执行
Box::Box(int x)
{
	cout<< "Creat Class BOX"<< endl;
}

// ********类的析构方法********
// 程序结束时执行,释放类的存储空间
Box::~Box()
{
	cout<< "Delete Class BOX"<< endl;
}

// 友元函数定义,访问类内部定义的成员,类的对象外部传入参数,不可用
void frientfunc(Box box){
	cout << "这是类的友元函数,它不是类的成员函数,\t" << box.length <<  endl;
}

// ****************************************拷贝构造函数****************************
// ****************拷贝构造函数通常用于:*******************************************
// ****************1.通过使用另一个同类型的对象来初始化新创建的对象。*****************
// ****************2.复制对象把它作为参数传递给函数。********************************
// ****************3.复制对象,并从函数返回这个对象**********************************

// 如果在类中没有定义拷贝构造函数,编译器会自行定义一个。
// 如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。
Box::Box(const Box &obj){
	cout << "Copy+Creat Function"<< endl;
}

// this指针是所有类的成员函数的默认参数,所有类的成员函数都可以使用this指针来代表当前类
// 使用类的解析符::定义函数
Box* Box::VOL1(){
	cout<< "类的地址是:\t"<< this <<endl;
	return this;
}


int main(){
	double area = 0.0;
	// 直接调用类的构造方法,等于创建类
	Box box1(10);
	

	// 动态内存申请,我们程序请求的动态内存由系统从内存 堆 中分配
	// 栈Stack:就是有编译器申请并释放
	// 堆Heap:就是有程序员申请并释放
	// 动态申请内存,c++的动态内存申请是以类型为单位进行内存分配的,而c是以字节malloc(sizeof())分配
	// C++使用new,一般分为两个步骤:
	// 1. operator new 分配内存空间,这里使用malloc()函数
	// 2. placement new 调用构造函数,初始化开辟的空间,释放使用 delete 指针
	// C直接使用malloc()函数,释放使用free(指针)
	// 单纯的malloc函数只能开辟空间,无法初始化,而new 不仅可以开辟还能初始化

	Box *ptr = new Box(10);
	int *ptrint = new int(1);
	int *ptrarray = new int [10];

	// 赋值时只针对当前对象成员变量,但是类内部的成员变量值未修改,友元函数直接访问类内部的成员
	box1.length = 10;
	box1.width = 20;
	// 调用类的成员函数
	area = box1.VOL();
	cout << "使用new开辟的类的内存地址是:"<< ptr <<endl;
	ptr = box1.VOL1();
	cout << "使用this指针,获得内存地址是:"<< ptr << endl;


	// 调用类的友元函数
	frientfunc(box1);

	cout << area << endl;
	cout << *ptrint <<endl;
	// 释放申请到的内存空间
	delete []ptrarray;
	delete ptr;
	delete ptrint;
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值