【和春笋一起学C++】(五十)在构造函数中使用new时的注意事项

  1. 在构造函数中使用new初始化指针成员后,应在析构函数中使用delete;
  2. new和delete必须相互兼容,new对应于delete,new \[\]对应于delete \[\];
  3. 如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号\[\],要么都不带,因为只有一个析构函数,因此所有的构造函数都必须与它兼容。另外,可以在一个构造函数中使用new初始化指针(可以带中括号,也可以不带),在另外一个构造函数中将指针初始化为空(NULL或0),因为delete可以用于空指针;

NULL还是0:空指针可以用0或NULL来表示,在许多头文件中,NULL是一个被定义为0的符号常量。C程序员通常使用NULL而不是0,因为这样易知它是一个指针值(就像使用"\0"而不是0来表示空字符串一样)。不过C++传统上更喜欢用简单的0,而不是等价的NULL。

  1. 在构造函数中使用new的一些情形:

(1)《C++中string类的简介》文章中MyClassString类的复制构造函数:

cpp 复制代码
MyClassString::MyClassString(const MyClassString& st)
{
	len = st.len;
	str = new char[len + 1];
	strcpy(str, st.str);
}

通过深度复制将一个对象初始化为另一个对象。此时,复制构造函数应分配足够的空间来存储复制的数据,而不仅仅是数据的地址。

(2)《C++中string类的简介》文章中MyClassString类的赋值操作符重载函数,也需要通过深度复制将一个对象的数据复制给另一个对象。

cpp 复制代码
MyClassString& MyClassString::operator=(const MyClassString& s)
{
	if (this == &s)
	{
		return *this;
	}
	delete[]str;
	len = s.len;
	str = new char[len + 1];
	strcpy(str,s.str);
	return *this;
}
相关推荐
1000世界小札6 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121978 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
fpcc9 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
ShineWinsu13 小时前
对于C++:C++20中线程、初始化、Lambda与内存视图等特性的解析
c++·c++20
张张的快乐时光呀!14 小时前
记录使用 MFC 打开文件对话框读取一张图片并做简单的灰度转换算法简单学习过程
c++·mfc
东华万里15 小时前
第41篇 C++类与对象核心知识梳理:从底层原理到面试实战
开发语言·c++·大学生专区
qq_5896660516 小时前
C语言、C++与C#的区别详解
c语言·c++·c#
万法若空16 小时前
排列组合恒等式
c++·算法
老洋葱Mr_Onion17 小时前
【C++】CSP-J初赛模拟卷七错题整理(作者自用)
c++·算法·深度优先
电商API_1800790524718 小时前
速卖通商品采集API技术文章
java·开发语言·c++·api·跨境电商·商品详情