C++中的Copy Assignment操作符赋值问题

因为遇到了这个操作符的问题,所以在这里记录一下*~*。

一、问题描述

在这里插入图片描述

二、产生原因

因为也是第一次出现这个问题,所以就到网上查了一些资料和书籍,现在倒也大概理解了这个错误出现的原因了。
有时候举个例子可能更容易理解为啥会出现这个错误,就拿一本书中的例子来说一下,如下所示:

template<class T>
	class NamedObject {
	public:

		NamedObject(std::string& nameVal, const T objectVal)
			:nameVal(nameVal),objectVal(objectVal)
		{}

		NamedObject& operator=(const NamedObject&) = default;

	private:
		std::string& nameVal;
		const T objectVal;
	};

	void main() {
		std::string newDog = "PersonPhone";
		std::string oldDog = "Person";

		NamedObject<int> p(newDog, 2);
		NamedObject<int> s(oldDog, 1);

		p = s;
	}

编译器会直接报错:

在这里插入图片描述


在这里插入图片描述

而出现这个错误的原因其实就是在调用“operator=”这个函数的时候发生了一些阻止赋值动作发生的行为,所以才导致编译器拒绝编译这行代码。上面的例子中其实就是string&和const在阻止赋值动作的发生,“让reference指向其他对象”和“改变const变量内容”本身就违反了C++的语法规范,所以才导致了这个错误发生。

三、解决方案

既然知道了问题出在哪了,只需要对症下药就行了,如下所示:

	template<class T>
	class NamedObject {
	public:

		NamedObject(std::string& nameVal,objectVal(objectVal)
		{}

		NamedObject& operator=(const NamedObject&) = default;

		void show() {
			std::cout << nameVal << "\t" << objectVal << std::endl;
		}

	private:
		std::string nameVal;
		T objectVal;
	};

	void main() {
		std::string newDog = "PersonPhone";
		std::string oldDog = "Person";

		NamedObject<int> p(newDog, 1);

		p = s;

		p.show();
		s.show();

		std::cin.get();
	}

运行效果:

在这里插入图片描述

参考资料:《Effective C++》、
博客:https://blog.csdn.net/u010511984/article/details/56025132?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...