#include <iostream>
using namespace std;
class test
{
public:
int i;
test() { cout << "构造函数!"<<endl; }
~test() { cout << "析构函数!"<<endl; }
test(const int num)
{
cout << "重载构造函数 " << endl;
cout <<num << endl;
i = num;
}
};
void main()
{
test t;
getchar();
}
<pre name="code" class="cpp"> 大手飞过啦。小菜记录下学习笔记而已。
首先说说以上的代码吧, 执行结果很明显 就是 调用了构造函数 ;
</pre><pre name="code" class="cpp">当如果我们把main函数的内容改为如下
<pre name="code" class="cpp">void main()
{
test t(100);
test t1 = t;
cout << t1.i << endl;
getchar();
}
此时输出结果又是如何呢? 不妨编译一下跑一次试试 输出结果如下
</pre><pre name="code" class="cpp">重载构造函数
100
很奇怪是吗,实例了2个对象却只调用一次构造函数,这里就是拷贝构造函数了 添加如下代码
<pre name="code" class="cpp">
test(const test& it)
{
i = it.i;
cout << "复制构造函数" << endl;
}
然后在跑一次看看结果
</pre><pre name="code" class="cpp">重载构造函数
复制构造函数
100
好了 没问题了 原来是在这里 ,当在定义一个类对象的同时去给这个对象赋值就会出现这种情况,也就是调用拷贝构造函数了。
那么 我们为什么要在拷贝构造函数里面添加 i = it.i; 呢? 我们不就是想赋值一个类嘛,不改变怎么行呢,是吧。
好吧, 你可能会觉得我在脱裤子放屁多此一举, 恩好, 那么请你看如下代码会出现什么问题呢?
<pre name="code" class="cpp">class test
{
public:
int *i;
test()
{
i = new int[10];
cout << "构造函数!"<<endl;
}
~test()
{
delete[] i;
cout << "析构函数!"<<endl;
}
void setNum(const int num)
{
i[10] = { num };
}
};
void main()
{
test i;
i.setNum(1);
test i1 = i;
getchar();
}
感觉这段代码有问题吗? 好像没啥问题呀。 那好 请跑一个试试?
void main()
{
test i;
i.setNum(1);
test i1 = i;
cout << i.i << endl << i1.i << endl;
getchar();
}
</pre><pre name="code" class="cpp">getcahr之后程序挂了吗? 哈哈, 然后我们把main函数换成这样跑一边看看是怎么回事呢.
</pre><pre name="code" class="cpp">构造函数!
0080A0A0
0080A0A0
可以看到2个对象的一个成员变量指针指向了同一个地址 这里就是拷贝构造函数的问题了。
拷贝构造函数只会帮你去copy成员变量的值 并不会管你是否是指针或是其他,
并且你在构造函数里面的初始化工作也没有用了,指针i的空间也不会new出来的,
所以说自己的类里面有一些诸如此类的指针变量的时候,我们需要注意这么一个问题,
不然死在哪里都不知道哟,QAQ~ ;