C++一些常见问题

关于赋值的疑问

1、编译器为每个类默认重载了赋值操作符;
2、默认的赋值操作符仅完成了浅拷贝;
3、当需要进行深拷贝时必须重载赋值操作符;
4、赋值操作符与拷贝构造函数有相同的存在意义。

实例分析:

#include <stdio.h>
#include <iostream>
#include <cstring>


using namespace std;


class Test
{	
	int* m_pointer;
public:
	Test()
	{
		m_pointer = NULL;
	}
	Test(int i)
	{
		m_pointer = new int(i);
	}
	void print()
	{
		cout << "m_pointer = " << hex << m_pointer << endl;
	}
	~Test()
	{
		delete m_pointer;
	}
	

};


int main()
{
	Test t1 = 1;
	Test t2 = t1;
	
	t1.print();
	t2.print();
	
    return 0;
}

在这里插入图片描述
同一片空间被释放了两次,所以就在运行时出错;

实例分析2;

#include <stdio.h>
#include <iostream>
#include <cstring>


using namespace std;


class Test
{	
	int* m_pointer;
public:
	Test()
	{
		m_pointer = NULL;
	}
	
	Test(const Test& obj)
	{
		m_pointer = new int(*obj.m_pointer);
	}
	
	Test(int i)
	{
		m_pointer = new int(i);
	}
	
	Test& operator = (const Test& obj)
	{
		if(&obj != this)
		{
			delete m_pointer;
			
		    m_pointer = new int(*obj.m_pointer);
		}
		
		return *this;
	}
	
	void print()
	{
		cout << "m_pointer = " << hex << m_pointer << endl;
	}
	~Test()
	{
		delete m_pointer;
	}
	

};
int main()
{
	Test t1 = 1;
	
	Test t2;
	
	t2 = t1;
	
	t1.print();
	t2.print();
	
    return 0;
}

在这里插入图片描述
进行了重载拷贝构造函数和赋值操作函数;所以在编译运行时没有发生错误;(并且此时两对象的地址是不同的)

一般性原则

1、 重载复制操作符,必然需要实现深拷贝!!!

小结

1、在需要进行深拷贝的时候必须重载赋值操作符;
2、赋值操作符和拷贝构造函数有同等重要的意义;
3、string类通过一个数据空间保存字符数据;
4、string类通过一个成员变量保存当前字符串的长度;
5、C++开关时尽量避开C语言中惯用的编程思想。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值