面向对象表达式(2)

来源:互联网 发布:java培训后好找工作吗 编辑:程序博客网 时间:2024/05/22 12:46

首先分清值语义与对象语义


class A

{

public:

A(){}

~A(){}

}

A并不是值语义  因为默认的拷贝构造函数是浅拷贝  

A a1;

A a2(a1)    //a1与a2之间还存在着资源共享

值语义是指对象的拷贝与原对象无关。拷贝之后就与原对象脱离关系,彼此独立互不影响。比如说int,C++中的内置类型都是值语义,我们前面学过的三个标准库类型string,vector,map也是值语义


一个类实现了深拷贝之后才算是值语义


对象语义指的是面向对象意义下的对象
对象拷贝是禁止的(Noncopyable)。
一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享底层资源,对任何一个的改变都将改变另一个


基于对象编程    值语义

面向对象编程    对象语义


值语义对象生命期容易控制
对象语义对象生命不容易控制(通过智能指针来解决)。智能指针实际上是将对象语义转化为值语义
值语义与对象语义是分析模型决定的,语言的语法技巧用来匹配模型。


值语义对象生命期容易控制
对象语义对象生命不容易控制(通过智能指针来解决)。智能指针实际上是将对象语义转化为值语义
值语义与对象语义是分析模型决定的,语言的语法技巧用来匹配模型。


值语义对象通常以类对象的方式来是用

对象语义对象通常以指针或者引用方式来使用


 常见的智能指针:

auto_ptr       所有权独占,不能共享,但是可以转移

shared_ptr  所有权共享, 内部维护一个引用计数,+1,-1  当引用次数为0时进行删除

weak_ptr   弱指针  它要与shared_ptr配合使用   循环引用  &a = b;或者 &a = b  &b =  a

scoped_ptr  与auto_ptr类似 不能共享,但是也不可以转移


智能指针都用到  RAII记法  资源获取即初始化


值语义对象的析构是确定的。


值语义与对象语义是分析模型决定的,语言的语法技巧用来匹配模型。(通过语法技巧来进行区分)

分析上一节

Node n1;

Node n2(n1);

是浅拷贝   当n1销毁的时候  会去释放它的子代   当n2销毁的时候 也会去释放它的子代

深拷贝是没有任何意义的

让它为对象语义 禁止拷贝

class Noncopyable
{
protected:
Noncopyable() {}
~Noncopyable() {}
private:
Noncopyable(const Noncopyable&);
const Noncopyable& operator=(const Noncopyable&);
};

class Node : private Noncopyable
{
public:
virtual double Calc() const = 0;
virtual ~Node() {}
};

用private继承  

实现继承 而不是接口继承


表达式解析有两种:

1、逆波兰表示法  采用栈来实现

2、如果采用树表示,就是用递归下降法,是用编译原理来构造一个表达式树


表达式解析:

1、expression := 
a、term '+' expression
b、term '-' expression
c、term

2、term :=
a、factor '*' term
b、factor '/' term
c、factor

3、factor :=
a、number
b、identifier
c、'-' factor
d、'(' expression ')'


String buf

Scanner只负责扫描

Parser(分析)  负责构建一棵树










0 0