【和春笋一起学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;
}
相关推荐
Hua-Jay18 小时前
OpenCV联合C++/Qt 学习笔记(二十四)----差值法检测移动物体、稠密光流法跟踪移动物体及稀疏光流法跟踪移动物体
c++·笔记·qt·opencv·学习·计算机视觉
郭老二18 小时前
【C++】RPC:远程程序调用
c++·rpc
承渊政道18 小时前
【贪心算法】(经典实战应用解析(六):整数替换、俄罗斯套娃信封问题、可被三整除的最⼤和、距离相等的条形码、重构字符串)
c++·算法·leetcode·贪心算法·排序算法·动态规划·哈希算法
宠..18 小时前
VS Code SSH 远程连接 Ubuntu 并实现快速运行(C/C++示例)
java·运维·c语言·开发语言·c++·ubuntu·ssh
闻缺陷则喜何志丹18 小时前
【图论 树 启发式合并】P7165 [COCI2020-2021#1] Papričice|普及+
c++·算法·启发式算法·图论··洛谷
alexwang21118 小时前
AT_abc458_d [ABC458D] Chalkboard Median题解
c++·算法·题解·atcoder
故事和你9118 小时前
洛谷-【图论2-4】连通性问题1
开发语言·数据结构·c++·算法·动态规划·图论
我先去打把游戏先19 小时前
Ubuntu虚拟机(服务器版本)Git安装教程(附常用命令)——从零开始掌握版本控制
服务器·c语言·c++·git·嵌入式硬件·物联网·ubuntu
艾莉丝努力练剑19 小时前
【Linux网络】Linux 网络编程:HTTP(四)从手写服务器到生产级 Nginx 与 cpp-httplib 实战
linux·运维·服务器·网络·c++·nginx·http
咩咦19 小时前
C++学习笔记21:日期类加减天数
c++·学习笔记·运算符重载·日期类·operator+·operator+=