首页 > 代码库 > 关注C++细节——含有本类对象指针的类的构造函数、析构函数、拷贝构造函数、赋值运算符的例子
关注C++细节——含有本类对象指针的类的构造函数、析构函数、拷贝构造函数、赋值运算符的例子
本例只是对含有本类对象指针的类的构造函数、析构函数、拷贝构造函数、复制运算符使用方法的一个简单示例,以加深对构造函数和拷贝控制成员的理解。
读C++ primer 5th 第13章后加上自己的理解,完整的写了下课后习题的代码。
第一版:
#include <string> #include <iostream> using namespace std; class TreeNode{ private: string value; TreeNode *left; TreeNode *right; public: TreeNode() : value(""), left(nullptr), right(nullptr){} ~TreeNode(){ cout << "~TreeNode()" << endl; if (left != nullptr){ delete left; //递归析构左子树 } if (right != nullptr){ delete right;//递归析构右子树 } } TreeNode(const TreeNode &tn) : value(tn.value), left(nullptr), right(nullptr){ if (tn.left != nullptr){ left = new TreeNode(*tn.left);//递归复制拷贝左子树 (其实又一次调用了以(*tn.left)作为参数的复制构造函数) } if (tn.right != nullptr){ right = new TreeNode(*tn.right);//递归复制拷贝右子树 (其实又一次调用了以(*tn.left)作为参数的复制构造函数) } } TreeNode & operator=(const TreeNode& tn){ value = http://www.mamicode.com/tn.value;>以上这一版已经能完成正常的复制构造,赋值操作以及正常的析构,并且不会造成内存泄露,但是,这里有一个问题就是不能支持自身给自身赋值,因为一旦给自己赋值,就会出现,现将自己的左右子树析构了,然后再用左右子树做参数,这就会出现未定义的行为,虽然多次运行可能都能得到正确结果,但是确实是非常危险的行为。下面是改进版,此版就支持自身赋值。ps(借用一下C++ primer中的提示:当你编写一个赋值运算符时,一个好的模式是先将右侧运算对象拷贝到一个局部临时对象中,这样销除左侧运算对象的现有成员就是安全的了,一旦左侧运算对象的资源被销毁,就只剩下将数据从临时对象拷贝到左侧运算对象的成员中了。) 说的确实经典。。。。
改进版:
#include <string> #include <iostream> using namespace std; class TreeNode{ private: string value; TreeNode *left; TreeNode *right; public: TreeNode() : value(""), left(nullptr), right(nullptr){} ~TreeNode(){ cout << "~TreeNode()" << endl; if (left != nullptr){ delete left; //递归析构左子树 } if (right != nullptr){ delete right;//递归析构右子树 } } TreeNode(const TreeNode &tn) : value(tn.value), left(nullptr), right(nullptr){ if (tn.left != nullptr){ left = new TreeNode(*tn.left);//递归复制拷贝左子树 (其实又一次调用了以(*tn.left)作为参数的复制构造函数) } if (tn.right != nullptr){ right = new TreeNode(*tn.right);//递归复制拷贝右子树 (其实又一次调用了以(*tn.left)作为参数的复制构造函数) } } TreeNode & operator=(const TreeNode& tn){ value = http://www.mamicode.com/tn.value;>不断回顾,以加深对构造函数和拷贝控制成员的理解。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。