话说,在大学刚接触C语言时,我们的老师便不断地!不断地!!不断地!!!告诉我们要把main函数分为5个部分:

1、声明+初始化    2、赋值    3、输入    4、输出      5、释放

我就非常不理解,为什么非要把『声明+初始化』以及『赋值』两步分开。

难道『初始化+赋值』一起会遭受诅咒?
明明教材就有程序是这么这样的:int i = 10; 更有甚者,直接int i, j  = 1,k = 10; 连声明加赋值,直接都搞定。
而为什么老曹总逼我们把别人写一行的代码写成10行……

//initialization
int i = 0
int j = 0;
int k = 0;

//assignment
i = 0;
j = 1;
k = 10;
究竟是为什么需要将赋值这一步单独提出来呢?难道是由于这样做才能防止某种特殊的诅咒??对的!
我今天才发现其中包含了VC6.0包括VS2008中包含着这样一个“诅咒”~
首先我们写这样一段简单的代码
class Example
{
private:
int m_data1;
int m_data2;
int * m_pdata3;public:
Example();
void setData(int given1, int given2, int given3);
};Example::Example()
{
m_data1 = 0;
m_data2 = 0;
m_pdata3 = new int;
*m_pdata3 = 0;
}void Example::setData(int given1, int given2, int given3)
{
m_data1 = given1;
m_data2 = given2;
*m_pdata3 = given3;
}int _tmain(int argc, _TCHAR* argv[])
{
Example e1;e1.setData(10, 20, 30);Example e2;e2 = e1;e2.setData(40, 50, 60);return 0;
}
执行是可以通过的。
在这里,我们先定义Example类e1;后定义了Example类e2。我们并没有重载赋值运算符=,然而编译器却找到了一种方法使得 e2 = e1 这个运算符得以实现。那么,可以这么理解,在重载赋值 = 之前,系统默认创建了一个赋值函数。在这里,我们暂且把这个赋值函数叫做:默认赋值函数。
下面我们看一下默认赋值函数的功能。
首先,在e1.setData(10, 20, 30)后,监视到e1是这样的:

当e2 = e1 赋值后,e2的监视窗口如此:
可以看到,e1,e2中包含的指针m_pdata3指向同一片存储空间。如下的操作更能证明这点:
在e2.setData(40, 50, 60),对e2内部数据进行修改时,会发现e1内部指针对应的内存也进行了改变,变成了60
由此,我们可以推断,默认赋值函数的功能如下:将赋值符右边类的成员变量的取值原封不动得赋给左边的类内同样的成员变量。
既然清楚了,赋值运算符具有默认赋值函数。
下面我们手工给Example类重载赋值函数。

Example& Example::operator=(const Example& e)
{
m_data1 = e.m_data1;
m_data2 = e.m_data2;
m_pdata3 = new int;
*m_pdata3 = *(e.m_pdata3);return *this;
}
当然,我们不希望改动e2指针内的数据,e1发生同样变化。换言之本类对象开辟的空间,归此类对象独有。因此,在重载时,开辟了空间后,将上一个空间中的值赋给新空间。
主函数不变:

int _tmain(int argc, _TCHAR* argv[])
{
Example e1;e1.setData(10, 20, 30);Example e2;e2 = e1;e2.setData(40, 50, 60);return 0;
}
当执行完毕e2.setData(40, 50, 60)后,通过监视窗口,我们会发现:

果然,e2的开辟的空间变成了60,而e1没有变化。目的实现。
好了,有了这些储备,相信你会很容易理解这个“诅咒”了:
当你把刚刚主函数的两句
Example e2;          //初始化
e2 = e1;                //赋值
中的赋值与初始化合二为一,即写成Example e2 = e1后
主函数成为这样:

int _tmain(int argc, _TCHAR* argv[])
{
Example e1;e1.setData(10, 20, 30);Example e2 = e1;e2.setData(40, 50, 60);return 0;
}
让我们看看程序执行结果:

我们会发现,e2没有独立开辟空间,而是指向了e1的空间。
原来赋值与初始化合一时,调用的 = 运算符时,执行的不是重载的 = 运算符函数,而是默认赋值函数!
这就是那个将初始化与赋值合二为一的诅咒啊!不加区分也许有一天就会造成意想不到的问题!
写到最后,正式感谢我的编程经验丰富的C语言老师老曹。听这些内行人的忠告,会走很少弯路的。

C++自带的古老诅咒相关推荐

  1. Isla Obscura 深海生物系列 NFT 上架市场平台

    在海底深处,古老的技术搅动着沉积物,带来了噩梦......体验一下  Isla Obscura 岛独特的第四季! Primordial 游戏工作室带着它的第四个作品集<深海生物>回来了.2 ...

  2. 布拉格天空飞过荆棘鸟

    ◎ 刘俊丽 编译 希斯背着旅行包独自走在查理大桥上,漫不经心地望着两岸的景色.一个月前,他青梅竹马的恋人海伦离开了他,投入一位房地产商人的怀抱.希斯受不了这个刺激,于是独自来欧洲旅游散心. 一曲忧伤的 ...

  3. JavaScript大神用代码带你揭秘吉普赛古老神秘读心术

    javascript/HTML5课题:javascript开发读心术游戏 PS:大爆料!javascript解密读心术游戏背后故事 知识点: 读心术原理算法独家揭秘,HTML5最新选择器, 原生jav ...

  4. 古老计算机的显卡,IT之家网友分享:带你看古老经典的PC硬件

    文章中的所有主板.内存条等均为IT之家网友的"私藏古董",其中有从1989年到2017年的经典PC硬件. 电脑,由起初"计算机"名称发展成现在家喻户晓的&quo ...

  5. 好久不见!~小编带给大家古老的vue搭配kityMinder使用方法

    其实kityMinder是一个很强大的思维脑图的配置,如果我们想用代码去实现脑图其实很简单.我们可以看下某度脑图和github的在线地址.封装了很多使用方法.那么小编就废话不多说,直接上代码. ①.首 ...

  6. 2019日历全年一张_带上这份2019全年活动日历,旅行打卡不迷路

    1 月 January 上海双年展 始创于1996年的上海双年展是中国最具影响力的国际当代艺术展之一.本届双年展的主题为"禹步",这一主题源于中国古代神话的神秘步伐.本届上海双年展 ...

  7. Udacity机器人软件工程师课程笔记(二十四) - 控制(其二) - PID优化,梯度下降算法,带噪声的PID控制

    7.非理想情况 (1)积分饱和 到目前为止,我们一直使用的"理想"形式的PID控制器很少用于工业中."时间常数"形式更为常见. 当前说明了理想形式的一些重大缺陷 ...

  8. 大佬带你详解Python反爬虫措施以及爬虫编写注意事项

    Python爬虫开发:反爬虫措施以及爬虫编写注意事项 反爬虫的几重措施 1.IP限制 如果是个人编写的爬虫,IP可能是固定的,那么发现某个IP请求过于频繁并且短时间内访问大量的页面,有爬虫的嫌疑,作为 ...

  9. 结合脑成像技术与人工智能,破除自杀的“诅咒”

    来源:36氪 概要:近日发表的一项研究,介绍了一种通过人工智能与脑成像技术结合的方法来预测自杀倾向的方法.在初步的试验中,准确率达到了91%. 自杀已经成为了一个公共健康领域的"诅咒&quo ...

最新文章

  1. ntu ERIC 课程笔记
  2. 统计Apache或nginx日志里访问次数最多的前十个IP
  3. myisam怎么读_耗时半年,我成功“逆袭”,拿下美团offer(刷面试题+读源码+项目准备)...
  4. 英语----情态动词(下)
  5. EL表达式---自定义函数(转)
  6. 机器学习第六回——无监督学习
  7. 基于MATLAB的车牌识别(GUI)
  8. Excel怎么实现表格数据行间随机打乱排序
  9. 如何使用Everything搜索局域网共享文件夹?
  10. C语言顺序表,合并并排序(代码注释讲解)
  11. UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\xa0‘ in position 21: illegal multibyte sequ
  12. mac 怎样切换 node 版本 , 如何安装oh-my-zsh
  13. HTTPSS证书制作笔记
  14. shell脚本-循环
  15. 三年前端开发面试经验加感悟(干货分享)
  16. 下载360图片(一)
  17. 建信金科在中国建设银行物联网平台项目的实践
  18. Dash:程序员的的好帮手
  19. XMind课堂之思维导图学习法
  20. 【飞轮储能发电】基于simulink的飞轮和蓄电池在微网中的仿真

热门文章

  1. STM32 系统定时器(SysTick)
  2. java计算机毕业设计果之芒农场销售系统(附源码、数据库)
  3. 南信大程序设计大赛题目及代码
  4. 货车大小的小行星刚与地球擦肩而过,系有史以来最近的一次
  5. 如何制作APP下载二维码?
  6. 第一次认真入门一场ctf比赛
  7. 十五、组播(Multicast)
  8. (81)Part21-阿里云VOD-01-视频点播简介
  9. 成人高考报名时间2021什么时候截止?成人高考要怎么选择专业?
  10. 手把手教你使用 cert-manager 签发免费证书