首页 > 编程语言 >C++——new对象

C++——new对象

时间:2024-08-18 23:27:33浏览次数:12  
标签:10 SECURE CRT 对象 namespace C++ int new

new对象与之前C的"类 对象"方式有所不同,"类 对象"方式并不会调用构造函数和析构函数,而new对象则会调用两个函数,释放该空间时用delete。

数组

申请int类型的数组

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main() {
	int* a = new int[10];
	for (int i = 0; i < 10; i++) {
		a[i] = i + 1;
	}
	for (int i = 0; i < 10; i++) {
		cout << "a[" << i << "]=" << a[i] << endl;
	}
	delete[] a;
	system("pause");
	return EXIT_SUCCESS;
}

申请char类型

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main() {
	char* a = new char[10];
	memset(a, 0, 10);
	strcpy(a, "123456789");
	cout << "a=" << a << endl;
	delete[] a;
	system("pause");
	return EXIT_SUCCESS;
}

注意:

如果new对象是数组,那么在释放空间的时候也要加上[]。否则只能释放数组中第一个元素的空间(虽然编译器在一些情况下可能不会报错)

如下面的例子

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class M {
public:
	M() {
		cout << "无参构造函数" << endl;
	}
	M(const M& t) {
		cout << "拷贝构造函数" << endl;

	}
	~M()
	{
		cout << "析构函数" << endl;
	}

};

int main() {
	M *p1 = new M[2];	
	delete p1;
	system("pause");
	return EXIT_SUCCESS;
}

此时编译器不会报错,但运行过程中会出现问题。同时我们可以看到,因为数组大小是2,所以构造函数调用了两次,而因为在释放空间的时候没有加[],析构函数只是调用了一次。所以应当加上[]。 

如果对象的类型是void*,编译器在编译的时候不知道void*指向的是那个函数,所以在删除的时候不会调用析构函数。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class M {
public:
	M() {
		cout << "无参构造函数" << endl;
	}
	M(const M& t) {
		cout << "拷贝构造函数" << endl;

	}
	~M()
	{
		cout << "析构函数" << endl;
	}

};

int main() {
	void *p1 = new M;	
	delete p1;
	system("pause");
	return EXIT_SUCCESS;
}

标签:10,SECURE,CRT,对象,namespace,C++,int,new
From: https://blog.csdn.net/immnature/article/details/141188527

相关文章

  • C++中的多线程编程和锁机制
    二、多线程、锁2.1C语言线程库pthread(POSIXthreads)2.2.1线程创建pthread_create#include<pthread.h>pthread_tthread;ThreadDataargs={1,"Hellofromparameterizedthread"};intresult=pthread_create(&thread,attr,function,args); //线程创建即......
  • 关于c++使用toml plusplus(俗称toml++)的使用(2)
    链接toml++-githubtoml++-帮助文档使用要求:c++17及以上版本toml语法-英文toml语法-中文toml读取参见官方给出的范例toml写入目标目标:数组表的写入目标文件内容如下[NET_INTERFACE]bool=falseinteger=1234567890string='thisisastring'[[f......
  • C++:新枚举与新结构
    一、枚举(一)C枚举?真整数!    考虑下面的程序#include<stdio.h>#include<stdlib.h>typedefenum{spring,summer,autumn,winter}Season;voidprintSeason(Seasonseason){ switch(season){ casespring: printf("spring"); break; case......
  • C++:从Type到Control
    一、基本数据类型     计算机的存储空间由最基本的二进制数(比特)组成,若干连续的二进制位(一般为8位)组成一个字节并被分配一个内存地址(),所以单独的比特没有地址,通常情况下CPU也不会一个比特一个比特读取数据,相反,字节被当作基本操作单位。在此前提下,一切要存储在计算机上的......
  • C++:函数
         FunctionsareC++entitiesthatassociateasequenceofstatements(afunctionbody)withanameandalistofzeroormorefunctionparameters.        函数是C++中的实体,它将一系列语句(一个函数体)与一个名称和零个或多个函数参数列表相关......
  • 关于c++使用toml plusplus(俗称toml++)的使用
    链接toml++-githubtoml++-帮助文档使用要求:c++17及以上版本toml语法-英文toml语法-中文toml读取参见官方给出的范例toml写入一个范例,一个开胃菜toml文件待生成的目标文件内容为[NET_INTERFACE]bool=falseinteger=1234567890string='thisis......
  • 【C++学习笔记 18】C++中的隐式构造函数
    举个例子#include<iostream>#include<string>usingString=std::string;classEntity{private: Stringm_Name; intm_Age;public: Entity(constString&name) :m_Name(name),m_Age(-1){} Entity(intage) :m_Name("UnKnown")......
  • Java巅峰之路---进阶篇---面向对象(一)
    static关键字介绍static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。其中,被static修饰的成员变量,叫做静态变量;被static修饰的成员方法,叫做静态方法。静态变量调用方式:类名调用(推荐)、对象调用特点:●被该类所有对象共享●不属于对象,属于类●随着类的加载......
  • C/C++内存管理
    一、目标1.C/C++内存分布2.C语言中动态内存管理方式3.C++中动态内存管理4.operatornew与operatordelete函数5.new和delete的实现原理6.常见面试题二、个人见解1.C/C++内存分布【说明】1.栈又叫堆栈--非静态局部变......
  • c++ 获取文件夹目录名字
        main.cpp#ifndefPHOTO_FILE_PROCESSOR_H#definePHOTO_FILE_PROCESSOR_H#include<iostream>#include<string>#include<vector>#include<dirent.h>#include<algorithm>#include<stdexcept>classPhotoFilePro......