您的位置:首页 > 编程语言 > C语言/C++

开始记录下学习之路 c++ 拷贝构造函数

2015-11-06 12:45 459 查看
#include<iostream> usingnamespacestd; classtest { public: inti; test(){cout<<"构造函数!"<<endl;} ~test(){cout<<"析构函数!"<<endl;} test(constintnum) { cout<<"重载构造函数"<<endl; cout<<num<<endl; i=num; } }; voidmain() { testt; getchar(); }<prename="code"class="cpp">大手飞过啦。小菜记录下学习笔记而已。


首先说说以上的代码吧,执行结果很明显就是调用了构造函数;</pre><prename="code"class="cpp">当如果我们把main函数的内容改为如下<prename="code"class="cpp">voidmain() { testt(100); testt1=t; cout<<t1.i<<endl; getchar(); }

此时输出结果又是如何呢?不妨编译一下跑一次试试输出结果如下

</pre><prename="code"class="cpp">重载构造函数 100 很奇怪是吗,实例了2个对象却只调用一次构造函数,这里就是拷贝构造函数了添加如下代码<prename="code"class="cpp">test(consttest&it) { i=it.i; cout<<"复制构造函数"<<endl; }然后在跑一次看看结果

</pre><prename="code"class="cpp">重载构造函数 复制构造函数 100 好了没问题了原来是在这里,当在定义一个类对象的同时去给这个对象赋值就会出现这种情况,也就是调用拷贝构造函数了。那么我们为什么要在拷贝构造函数里面添加i=it.i;呢?我们不就是想赋值一个类嘛,不改变怎么行呢,是吧。好吧,你可能会觉得我在脱裤子放屁多此一举,恩好,那么请你看如下代码会出现什么问题呢? <prename="code"class="cpp">classtest { public: int*i; test() { i=newint[10]; cout<<"构造函数!"<<endl; } ~test() { delete[]i; cout<<"析构函数!"<<endl; } voidsetNum(constintnum) { i[10]={num}; } }; voidmain() { testi; i.setNum(1); testi1=i; getchar(); }

感觉这段代码有问题吗?  好像没啥问题呀。 那好 请跑一个试试?  voidmain() { testi; i.setNum(1); testi1=i; cout<<i.i<<endl<<i1.i<<endl; getchar(); }</pre><prename="code"class="cpp">getcahr之后程序挂了吗? 哈哈, 然后我们把main函数换成这样跑一边看看是怎么回事呢.</pre><prename="code"class="cpp">构造函数! 0080A0A0 0080A0A0可以看到2个对象的一个成员变量指针指向了同一个地址这里就是拷贝构造函数的问题了。拷贝构造函数只会帮你去copy成员变量的值并不会管你是否是指针或是其他,并且你在构造函数里面的初始化工作也没有用了,指针i的空间也不会new出来的, 所以说自己的类里面有一些诸如此类的指针变量的时候,我们需要注意这么一个问题,不然死在哪里都不知道哟,QAQ~;

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: