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

#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~ ;
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值