C++new运算(动态创建对象)

1.概念

new就是告诉计算机开辟一段新的空间,但是和一般的声明不同,new开辟的空间在堆(Heap)上,而一般声明的变量(函数内)在存放在栈上

new在堆区上创建一个对象的时候,它实际做了三件事:动态分配内存空间,调用构造函数,返回正确的指针.若创建的是简单类型的变量,那么第二步就会被省略

2.作用

C++中的new运算符用来在堆上动态分配内存,创建一个新的对象,它的主要作用可以总结如下:

  1. 动态内存分配:new运算符通过调用operator new()函数在堆上分配一块连续的内存空间,返回指向该空间的指针。

  2. 对象构造:在分配内存之后,new关键字会自动调用相应类的构造函数,对内存空间中的对象进行构造和初始化。

  3. 灵活性:使用new运算符,我们可以在程序执行的过程中动态地分配内存空间,改变内存使用情况,提高程序灵活性。

需要注意的是,使用new运算符分配的内存必须由程序员负责释放,否则会出现内存泄漏等问题。通常我们使用delete运算符来释放动态分配的内存,以避免出现内存泄漏的问题

3.new创建对象的四种形式

  • 创建默认的构造函数对象
class Person {
public:
    Person() {
        cout << "Person Constructor"<
  • 创建带有参数的构造函数对象
class Person {
public:
    Person(string name, int age) 
    {
        cout << "Person Constructor with parameters: " << name << ", " << age << endl;
    }
};

int main() {
    Person* ptr = new Person("Tom", 20);
    delete ptr;
    return 0;
}
  • 创建数组对象
class Person {
public:
    Person(string name) : m_name(name) {};
    void getInfo() 
    {
        cout << "Name: " << name_ << endl;
    }
private:
    string m_name;
};

int main() 
{
    Person* ptr = new Person[2] { {"Tom"}, {"Jerry"} };
    ptr[0].getInfo();
    ptr[1].getInfo();
    delete[] ptr;
    return 0;
}
  • 创建指针对象

class Person {
public:
    void getInfo()
    {
        cout << "I am a person!" << endl;
    }
};

int main() 
{
    Person* ptr = new Person;
    ptr->getInfo();
    delete ptr;
    return 0;
}

 4.注意:

new创建对象,没有初始化需要手动初始化

#include
using namespace std;

int main()
{
	int* ptr = new int;//new一个int类型的内存空间,并且返回空间的首地址给指针ptr
	*ptr = 10;//*运算符将10赋值给这个内存空间(即*ptr)
	cout << *ptr;
    delete ptr;//手动释放

	return 0;
}

"new()"的用法

new()分配程序员自定义的类型的一个自定大小的内存空间,并以括号中的值来初始化这个变量

#include
using namespace std;

int main()
{

	int* ptr = new int(3);
	//使用new运算符动态分配了一个int类型的内存空间,并将其赋值为3,
	//然后返回该内存空间的地址,将该地址赋值给指针变量ptr
	cout << *ptr << endl;
    delete ptr;

	return 0;
}

new开辟一维数组空间

语法:

data_type *arrary_name=new data_typr[array_size];

数据类型 *指针名(指向数组的首元素的指针)=new 数组数据类型[数组长度]

#include
using namespace std;

int main()
{
	int* arr = new int[10];
	for(int i = 0; i < 10; i++)
	{
		arr[i] = i + 1;
		cout << arr[i] << " ";
	}

	//访问数组元素,并查找最大值
	int max = arr[0];
	for (int i = 1; i < 10; i++)
	{
		if (max <= arr[i])
			max = arr[i];
	}
	cout << "max of arr is " << max << endl;

	//释放数组的内存
	delete[] arr;

	return 0;
}

补充:

静态 int array[100];   定义了数组array,并未对数组进行初始化
静态 int array[100] = {1,2};  定义并初始化了数组array
动态 int* array = new int[100];  delete []array;  分配了长度为100的数组array 
动态 int* array = new int[100]{1,2};  delete []array; 为长度为100的数组array初始化前两个元素

new开辟二维数组空间

对二维数组的理解方式很重要:把二维数组看成一个特殊的一维数组,它的元素又是一个一个的一维数组

首先,和一维数组的创建其实是一样的,假设有n个元素,那动态一维数组的创建是这样的

int* mat = new int[n];

而二维数组只是多了一步,可以理解成先创建了n个一维数组,再对这n个一维数组开辟空间。

int** mat=new int*[n];
 
for (int i = 0;i < n;i++)
		mat[i] = new int[n];

输入

1
4
0 1 1 1 
1 0 1 1 
1 1 0 1 
1 1 1 0 

#include 
using namespace std;
 
int main()
{
	int k;
	cin >> k;
	while (k--)
	{
		int n;
		cin >> n;
		int** mat=new int*[n];
		for (int i = 0;i < n;i++)
				mat[i] = new int[n];
		
		for (int i = 0;i < n;i++)
			for (int j = 0;j < n;j++)
				cin >> mat[i][j];
 
		for (int i = 0;i < n;i++)
		{
			for (int j = 0;j < n;j++)
			{
				cout << mat[i][j] <<" ";
			}
			cout << endl;
		}
 
	}
}

释放空间:

 
for (int i = 0;i < n;i++)
	delete[]mat[i];
delete[]mat;

补充:

静态 int array[10][10];  定义了数组,并未初始化
静态 int array[10][10] = { {1,1} , {2,2} };  数组初始化了array[0][0,1]及array[1][0,1]
动态 int (*array)[n] = new int[m][n]; delete []array;  // in c++11: auto array = new int[m][n]
动态 int** array = new int*[m]; for(i) array[i] = new int[n];  for(i) delete []array[i]; delete []array;    多次析构
动态 int* array = new int[m*n];  delete []array;      数组按行存储
注意这种方式不可用: int **array = new int[m][n];
 

你可能感兴趣的:(C++,c++)