首先分清值语义与对象语义
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(分析) 负责构建一棵树