值语义(陈硕)

值语义指的是对象的拷贝与元对象无关,就像拷贝int一样。C++的内置类型(bool/int/double/char)都是值语义,标准库里的complex<>,pair<>,vector<>,map<>等等也都是值语义,拷贝之后就与原对象脱离关系。

与值语义对应的对象语义,或者叫做引用语义,对象语义指的是面向对象意义下的对象,对象拷贝是禁止的

 

值语义与生命期

值语义一个巨大的好处是生命期管理很简单,就跟int一样,你不需要担心int的生命期,值语义的对象要么是stack object,或是直接作为其他object的成员,因此我们不需要担心他的生命周期(一个函数使用自己stack上的对象,一个成员函数使用自己的数据成员对象,相反,对象语义的object由于不能靠背,我们只能通过指正或者引用来使用它

一旦使用指针和引用来操作对象,那么就要担心所指向对象是否已被释放,这一度是C++程序bug的一大来源。此外,由于c++只能通过指针或者引用来获取多态性,那么在C++里从事基于继承和多肽的面向对象编程有其本质的困哪--资源管理

如果直接使用指针作为成员,那么如何确保指针的有效性,如何防止出现空悬指针,在释放某个对象的时候,如何确保程序中没有志向他的指针。。。

这一系列问题一度是c++面向对象编程头疼的问题,但是我们可以借助smart point把对象语义转化为值语义,从而轻松解决对象生命期。

 

什么是数据抽象

数据抽象是面向对象并列的一种编程范式,也即抽象数据类型。

支持数据抽象一直是C++语言设计目标

 

简单的来说 数据抽象是用来描述数据结构的,数据抽象就是ADT。一个ADT主要表现为他所支持的一些操作,比方说stack.push,stack.pop这些曹组应该具有明确的时间和空间复杂度,另外,一个ADT可以隐瞒其实现细节,比方说stack既可以用动态数组实现,也可以用链表实现

按照这个定义,数据抽象和基于对象很像,那么他们的区别在哪里,语义不同,adt通常是值语义,而object-based是对象语言,这两种语言,ADT class是可以拷贝的,拷贝之后的instance与原instance脱离关系

C++标准库中的数据抽象

C++ 标准库里  complex<> 、pair<>、vector<>、list<>、map<>、set<>、string、stack、queue 都是数据抽象的例子。vector 是动态数组,它的主要操作有 push_back()、size()、begin()、end() 等等,这些操作不仅含义清晰,而且计算复杂度都是常数。类似的,list 是链表,map 是有序关联数组,set 是有序集合、stack 是 FILO 栈、queue是 FIFO 队列。“动态数组”、“链表”、“有序集合”、“关联数组”、“栈”、“队列”都是定义明确(操作、复杂度)的抽象数据类型。

数据抽象和面向对象的区别

本文把data abstraction、object-based、object-Oriented视为三个编程范式,这种细致的分类或许有助于理解和区分他们之间的差别

通俗的讲,面向对象有三个特征:封装、继承、多肽;而基于对象则只有封装,没有继承和多台,即只有具体类,没有抽象接口,他们两个都是对象语义面向对象的真正核心的思想是消息传递,封装和多态只是表象

数据抽象与他们两个之间的界限在于语义,数据抽象不是对象语义,而是值语义。

数据抽象是针对数据的,这意味着ADT class应该可以拷贝,只要把数据复制一份就行了。如果一个class代表了其他的资源,那么丫就是object-based或object-Oriented,而不是数据抽象

 

数据抽象所需的语言设施

不是每个语言都支持的数据抽象

支持数据聚合

数据聚合 data aggregation,或者 value aggregates。即定义 C-style struct,把有关数据放到同一个 struct 里。

 

全局函数与重载

例如我定义了 complex,那么我可以同时定义 complex sin(const complex& x); 和 complex exp(const complex& x); 等等全局函数来实现复数的三角函数和指数运算。sin 和 exp 不是 complex 的成员,而是全局函数 double sin(double) 和 double exp(double) 的重载。这样能让 double a = sin(b); 和 complex a = sin(b); 具有相同的代码形式,而不必写成 complex a = b.sin();。

 

成员函数与private数据

数据可以声明为private,防止外界意外修改,不是每个ADT都适合把数据声明为private

 

拷贝控制

 

操作符重载

 

模板与泛型

 

posted @ 2014-10-28 19:51  liaotingpure  阅读(1315)  评论(0编辑  收藏  举报