栈的应用---编译器左右符号的语法匹配

(一)

一个继承体系的声明:

class Date {...};
class Customer {
public:
	...
private:
	string name;
	Date lastTransaction;
};

class PriorityCustomer : public Customer {
public:
	PriorityCustomer(const PriorityCustomer& rhs);
	PriorityCustomer& operator=(const PriorityCustomer& rhs);
private:
	int priority;
};

任何时候只要我们承担起“为derived class撰写copying函数”的重责大任,必须很小心的也复制其base class成分。但是那些成分往往是private,所以我们无法直接访问它们,所以我们应该让derived class的copying函数调用相应的base class函数:

PriorityCustomer::PriorityCustomer(const PriorityCustomer &rhs) : Customer(rhs), priority(rhs.priority)
{
}

PriorityCustomer& PriorityCustomer::operator =(const PriorityCustomer &rhs)
{
	Customer::operator=(rhs);
	priority = rhs.priority;
	return *this;
}

结论:当我们编写一个copying函数,请确保(1)复制所有local成员变量!(2)调用所有base classes内的适当的copying函数。

(二)这两个函数都不可以互相调用!

我们不该令copy assignment操作符调用copy构造函数。这不合理,因为这就像试图构造一个已经存在的对象。

我们也不该令copy构造函数调用copy assignment操作符。因为构造函数是用来初始化的,而copy assignment操作符只作用于已经初始化的对象身上。对一个尚未初始化好的对象进行赋值!无聊的一笔啊!

如果真的很想避免代码重复,那么在这两个函数之间只有一种办法!

建立一个新的成员函数给两者调用,这个函数往往是在private中,并且往往命名为:init。

请记住:

(1)copying函数应该确保复制“对象内的所有成员变量”及“所有base classes成分”。

(2)不要尝试以某个copying函数实现另外一个copying函数。应该将共同机能放进第三个函数中,并由两个copying函数共同调用。

栈的应用---编译器左右符号的语法匹配,布布扣,bubuko.com

时间: 2024-10-13 02:17:50

栈的应用---编译器左右符号的语法匹配的相关文章

栈的应用---编译器的符号匹配

算法 1   从第一个字符开始扫描 2   当遇见普通字符时候忽略,遇见做字符压入栈. 3    当遇见右符号时候从栈中弹出栈顶符号 匹配成功,继续读入下一字符 匹配失败,立即停止并报错 成功:所有字符扫描完毕,且栈为空 失败:匹配失败或者所有字符扫描完毕但栈不是空的. 伪代码: int scanner(const char* code) { 创建栈: int i = 0; while( code[i] != '\0' ) { if( 左符号) { 进栈: } if( 右符号 ) { 将右符号读

shell 脚本-符号-基础语法

为了便于识别  建议 以.sh 结尾 shell脚本 可以放上所有的命令行的指令(源于bash) shell脚本 是 解释型语言      c/c++ 是编译型语言 下面用到的 shell代码sh_1.sh #!/bin/bash cd ../ ls pwd 解释型脚本的执行过程: script.sh 是文本文件,根本没有代码段和 _start  函数 , exec 怎么执行. 解释: Shell会fork 一个子进程并调用 exec执行 ./script.sh这个程序,exec 系统调用应该把

shell脚本--(符号和语法)

shell脚本 shell脚本:一直都在用,但是没有系统的学习过,只是在linux命令行模式敲一些简单的常用的指令,现在系统的学习一番. 一.创建shell脚本,一般以.sh结尾(linux下后缀只是种显示,没有任何具体含义)文件创建后需要chmod 0755 name 给它加上权限,之后就可以用./运行了 进入文件需要在最顶部加上shell脚本解释器,这个文件中的所有命令都会被bash拿到去解释.下面会说到shell的工作模式. 二.shell的工作模式: 我是这样理解的当我们在脚本中写这样一

栈的的语法匹配实现

1.#include <stdio.h>#include <malloc.h>#include "LinkList.h" typedef struct _tag_LinkList{    LinkListNode header;    int length;} TLinkList; LinkList* LinkList_Create() // O(1){    TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkLis

shell基础之符号与语法

        shell脚本现在已经成为了一种非常普遍的脚本语言,之所以如此广泛的被应用,毋庸置疑它是有它的独到之处的.shell脚本语言和其他的语言比如说c/c++有何不同呢?c/c++等语言属于编译型语言,也就是说程序每次执行前都要经过编译生成可执行的二进制文件方可:而shell属于解释型语言,它必须依赖解释器来逐行解释命令,现在我们所熟知并常用的解释器为bash解释器.所以以后学习使用一门解释型语言的时候,必不可少的是首先得下载一个解释器.下面就来看一个简单的shell脚本: #! /b

对openjdk的javac编译器扩展了一个语法糖

我的扩展功能描述如下: 在java的现有语法中加入var来声明变量,并且可以根据初始化数据来自动类型推导. 举两个例子: 例一: 如下JAVA代码(注意这里的var是新语法): import java.util.*; public class TestHello { private var i = new ArrayList<List<?>>(); } 在用我修改的编译器编译之后,再用反编译工具反编译之后会看到如下形式的代码: import java.util.ArrayList;

栈的应用——逆序输出和括号匹配

1逆序输出 在栈所擅长解决的典型问题中,有一类具有以下特征:首先,虽有明确的算法,但其解答却以线性序列的形式给出:其次无论递归还是迭代实现,该序列都是依逆序计算书吃的.最后,输入和输出规模的不确定,难以实现确定盛放输出数据的容器大小.因其特有的“后进先出”特性及其在容量方面的自适应性,可使用栈来解决此类问题. 进制转换: 任给十进制整数n,将其转换为λ进制的表示形式. void convert(stack<char>& S,_int64 n,int base){//十进制正整数n到ba

nginx-location语法匹配优先级

原文地址:https://www.cnblogs.com/flashfish/p/11660701.html

浅谈栈和队列

### 栈 栈模型 栈(stack)是限制对元素的插入(push)和删除(pop)只能在一个位置上进行的表,该位置是表的末端,叫做栈的栈顶(top). 栈的基本操作只有两种,压入栈(push)和弹出栈顶(pop),且只能作用于栈顶.(只有栈顶元素是可访问的 你可以把栈结构理解成一个底部封闭,顶部打开的桶.最先进去的元素一定是最后才能取出,最晚进去的元素一定是最先取出. 因此栈又叫做LIFO(后进先出,Last In First Out)表. 栈的优势 栈的操作是常数时间的,而且是以非常快的常数时