您的位置:首页 > 其它

对象语义的一种实现方法

2017-02-26 00:09 246 查看

对象语义:

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 个 ==========
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面向对象