首页 > 编程语言 >C++ //练习 19.23 为你的Token类添加移动构造函数和移动赋值运算符。

C++ //练习 19.23 为你的Token类添加移动构造函数和移动赋值运算符。

时间:2024-08-24 21:25:41浏览次数:10  
标签:string sval 运算符 tok Token STR operator 移动 构造函数

C++ Primer(第5版) 练习 19.23

练习 19.23 为你的Token类添加移动构造函数和移动赋值运算符。

环境:Linux Ubuntu(云服务器)
工具:vim

 

代码块
class Token{
	public:
	Token(): tok(INT), ival(0) {}
	Token(const Token &t): tok(t.tok) { copyUnion(t); }
	Token &operator=(Token &&t) noexcept; 
	Token &operator=(const Token&);
	~Token() { if(tok == STR) sval.~string(); }
	Token &operator=(const std::string&);
	Token &operator=(char);
	Token &operator=(int);
	Token &operator=(double);

	private:
	enum {INT, CHAR, DBL, STR} tok;
	union{
		char cval;
		int ival;
		double dval;
		std::string sval;
	};
	void copyUnion(const Token&);
	void moveUnion(Token &&t); 
};

Token &Token::operator=(int i){
	if(tok == STR){
		sval.~string();
	}
	ival = i;
	tok = INT;
	return *this;
}

Token &Token::operator=(char c){
	if(tok == STR){
		sval.~string();
	}
	cval = c;
	tok = CHAR;
	return *this;
}

Token &Token::operator=(double d){
	if(tok == STR){
		sval.~string();
	}
	dval = d;
	tok = DBL;
	return *this;
}

Token &Token::operator=(const std::string &s){
	if(tok == STR){
		sval = s;
	}
	else{
		new(&sval) string(s);
	}
	tok = STR;
	return *this;
}

void Token::copyUnion(const Token &t){
	switch(t.tok){
		case Token::INT: ival = t.ival; break;
		case Token::CHAR: cval = t.cval; break;
		case Token::DBL: dval = t.dval; break;
		case Token::STR: new(&sval) string(t.sval); break;
	}
}

Token &Token::operator=(const Token &t){
	if(tok == STR && t.tok!= STR) sval.~string();
	if(tok == STR && t.tok == STR){
		sval = t.sval;
	}
	else{
		copyUnion(t);
	}
	tok = t.tok;
	return *this;
}

Token &Token::operator=(Token &&t) noexcept{
    if(this != &t) {
        if(tok == STR) sval.~string();
        moveUnion(std::move(t));
        tok = t.tok;
    }
    return *this;
}

void Token::moveUnion(Token &&t){
    switch(t.tok) {
        case INT: ival = t.ival; break;
        case CHAR: cval = t.cval; break;
        case DBL: dval = t.dval; break;
        case STR: new(&sval) std::string(std::move(t.sval)); break;
    }
    t.tok = INT;
}

标签:string,sval,运算符,tok,Token,STR,operator,移动,构造函数
From: https://blog.csdn.net/navicheung/article/details/141504993

相关文章

  • 运算符 类定义 Math类的使用 数组的使用
    1.基本的算术运算符5个:+ - * / %都是双目运算符(两个操作数),其中%要求的两个操作数必须为整数。2.自增、自减运算符++ --注意作为前缀和后缀的用法不同.3.表达式计算中的数据类型转换(1)自动类型转换:当参与运算的两个操作数类型不同时,先把低类型的数据转换为高类......
  • Python 教程(三):Python运算符合集
    Python中常用的一些运算符类型算术运算符+:加法-:减法*:乘法/:除法(结果为浮点数)%:取模(即除法余数)**:幂(指数)//:整除(结果为商的整数部分)示例代码: a=10b=3print("加法:",a+b)#输出13print("减法:",a-b)#输出7print("乘法:",a*b)#输出3......
  • Unity滚滚车轮计划 之 新输入系统控制2D角色移动动画(俯视)
            本系列的初衷是因为很多时候基础代码不得不重复又重复,所以为了更快更好地学习到新的知识,我就把已经掌握的知识造成自己的轮子吧,等用到的时候直接复制就行了叠甲:虽然不能保证全是原创,有些写法可能烂大街,但肯定是我自己学会了之后可能稍加改动,再敲上去的,知识......
  • C++ 构造函数/析构函数中调用虚函数的情况简单测试
    #include<string>#include<iostream>usingnamespacestd;namespace{classAnimal{public:Animal(){cout<<"基类调用虚函数…"<<endl;cout<<GetInfo()<<e......
  • 【C++基础】类的构造函数和析构函数
    目录构造函数(Constructor)定义种类1.默认构造函数2.带参数的构造函数3.浅拷贝构造函数4.深拷贝构造函数深拷贝和浅拷贝的区别5.移动构造函数析构函数(Destructor)构造函数与析构函数的调用时机构造函数:析构函数:构造函数和析构函数的最佳实践避免在析构函数中抛出异......
  • 运算符
    1:运算对常量和变量进行操作的过程称为运算。2:运算符对常量和变量进行操作的符号称为运算符3:操作数参与运算的数据称为操作数4:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的式子体现的是不同类型的表达式。注意事项:一个表达式最终......
  • PHP8面向对象快速入门二 构造函数 析构函数 静态变量 静态方法
    在PHP中,构造函数是一个特殊的方法,用于在创建对象时初始化对象的状态。构造函数在对象实例化时自动调用,以设置初始值或执行必要的准备工作。它可以接受参数,用于初始化对象的属性。构造函数的特点自动调用:构造函数在创建对象时自动调用。你不需要显式调用构造函数,它会在实例......
  • 131-横向移动-Kerberos攻击&SPN扫描&WinRM&WinRS&RDP
    1、RDP协议        RemoteDesktopProtocol远程桌面协议通常开放3389,Windows上面使用mstsc就可以弹出最常见的远程桌面连接方式,一般都是使用明文进行连接其实还可以使用hash进行        在内网中使用RDP协议一般是需要进行代理转发或者建立节点的端口扫......
  • FPGA开发——verilog的运算符以及相关优先级的介绍
    一、简介        在我们学习任何一门编程语言时,不可避免的都会遇见运算符和相关的运算优先级的问题,只有掌握了各个运算符的优先级关系我们才能进行更好的代码编写。在前面的时候因为我没有遇到因为优先级而导致的工程结果错误,所以没有过多注意,但是遇到之后才发现运算......
  • 位运算符-按位取反运算符补充详解
    位运算符在计算机中用于直接操作整数的二进制位的运算符。这些运算符通常用于低级编程和优化特定类型的计算任务。以下是几种常见的位运算符及其解释:按位与(&):对应位都是1时结果为1,否则为0。例如:0101&0111=0101按位或(|):只要对应位有一个是1,结果就为1。例如:0101|0111=......