对象语义的一种实现方法

对象语义:

1:对象语义就是只有一个对象,不支持拷贝复制等操作。
2:面向对象和使用对象:
    1:面向对象:对象语义,是浅拷贝的实现方式,实际只有一个对象,不支持拷贝。
    2:使用对象:值语义,实现了深拷贝的称之为值语义,因为实现了多个,拷贝后与原对象无关。
3:原码及讲解:
//-----------------------------------------------Text.h---------------------------------------------------
#ifndef TEXT_H_
#define TEXT_H_
namespace PoEdu
{
	class NonCopyable
	{
	protected:
		NonCopyable(){}
//		NonCopyable(const NonCopyable&other) = delete;//此处为了验证delete的方法是不可以重载的
	private:
		NonCopyable& operator=(NonCopyable&other) = delete;//在派生类自己没有实现这两个方法的时候,就不会默认生成了。
		NonCopyable(const NonCopyable&other) = delete;//这里只需要将两个方法放在private里面就可以,可以写上=delete但是布恩那个写成=default
	};//派生类没写这两个方法,就会默认调用基类的,但是调用不了,所以实现了对象语义。
	class Text :private NonCopyable
	{
	public:
		Text(){}
		~Text(){}
		//如果这里写过了op=和拷贝构造,那么即使继承于NonCopyable也无法实现对象语义。
		/*Text(const Text&other)override//如果拷贝构造没在private里面且=delete,这里写上override就是错的,delete的方法是不可以重载的。
		{
		}
		Text& operator=(Text&other)
		{
			return *this;
		}*/
	};
}
#endif//!TEXT_H_
//-----------------------------------------------main.cpp---------------------------------------------------#include <iostream>#include "Text.h"int main(){using namespace PoEdu;Text t;Text tt(t);//将会调基类的用拷贝构造函数,调用不到Text t1;t1 = t;//将会调用基类的赋值函数,但是调用不到return 0;}


最终会报错:
1>------ 已启动生成: 项目: ObjectMeanDemo, 配置: Debug Win32 ------
1> main.cpp
1>f:\electric\po\c++项目课\objectmeandemo\objectmeandemo\text.h(26): error C2248: “PoEdu::NonCopyable::NonCopyable”: 无法访问 private 成员(在“PoEdu::NonCopyable”类中声明)
1> f:\electric\po\c++项目课\objectmeandemo\objectmeandemo\text.h(11) : 参见“PoEdu::NonCopyable::NonCopyable”的声明
1> f:\electric\po\c++项目课\objectmeandemo\objectmeandemo\text.h(6) : 参见“PoEdu::NonCopyable”的声明
1> 此诊断出现在编译器生成的函数“PoEdu::Text::Text(const PoEdu::Text &)”中
1>f:\electric\po\c++项目课\objectmeandemo\objectmeandemo\text.h(26): error C2248: “PoEdu::NonCopyable::operator =”: 无法访问 private 成员(在“PoEdu::NonCopyable”类中声明)
1> f:\electric\po\c++项目课\objectmeandemo\objectmeandemo\text.h(10) : 参见“PoEdu::NonCopyable::operator =”的声明
1> f:\electric\po\c++项目课\objectmeandemo\objectmeandemo\text.h(6) : 参见“PoEdu::NonCopyable”的声明
1> 此诊断出现在编译器生成的函数“PoEdu::Text &PoEdu::Text::operator =(PoEdu::Text &)”中
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值