对象语义:
1:对象语义就是只有一个对象,不支持拷贝复制等操作。
2:面向对象和使用对象:
1:面向对象:对象语义,是浅拷贝的实现方式,实际只有一个对象,不支持拷贝。
2:使用对象:值语义,实现了深拷贝的称之为值语义,因为实现了多个,拷贝后与原对象无关。
1:面向对象:对象语义,是浅拷贝的实现方式,实际只有一个对象,不支持拷贝。
2:使用对象:值语义,实现了深拷贝的称之为值语义,因为实现了多个,拷贝后与原对象无关。
3:原码及讲解:
//-----------------------------------------------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;}#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_
最终会报错:
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 个 ==========
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 个 ==========