动态内存申请,我们程序请求的动态内存由系统从内存 堆 中分配。
栈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;
}