首页 > 其他分享 >operator用于隐式类型转换

operator用于隐式类型转换

时间:2023-03-21 13:23:01浏览次数:48  
标签:类型转换 string point operator 隐式 构造函数

C++中的operator主要有两种作用,一是操作符重载,二是自定义对象类型的隐式转换。在上面提到的point类中,我们提到如果构造函数没有默认参数,隐式转换的时候就会编译出错,但是如果我们利用operator的第二个作用,就可以自定义隐式转换类型。

#include <iostream>
#include <string>
using namespace std;

class point {
    public:
        point(int x, int y):x(x),y(y) {
            cout << "constructor" << endl;
        }

        bool operator()(int x, int y) {
            cout << "opearator overload" << endl;
            return x>this->x && y>this->y;
        }

        operator string() {
            cout << "type convert" << endl;
            string str = "(" + x;
            str += "," + y;
            str += ")";
            return str;
        }
    private:
        int x,y;
};

int main()
{
    // part1
   point p1(5,6);
   if(p1(10,9)){
       cout << "point(10,9) is larger than  point(5,6)" << endl;
   }
   
    // part2
   string str(p1);
	cout << str;
}

运行结果如下:

 

主函数的part1调用的是operator的重载作用,我们主要探讨part2的隐式转换作用。我们往string类的构造函数中传递的point类,显然string类中必然没有以point类为参数的构造函数,但是从运行结果来看,这次构造是成功的。

 

在这个例子中,string str(p1)是将point类对象转换成string类对象,使用的是string类的隐式构造(转换),string类不存在有默认参数的构造函数,也不存在以point类为参数的构造函数,那么string类就需要去point类中去找以operator算子修饰的将point类转为string类的转换函数,并调用该函数,最终返回的string临时对象,被string类用来拷贝构造成一个新的string对象str

如果string类有默认参数的构造函数,那么string str(p1)会隐式调用该默认参数的构造函数来构造string。对于没有默认参数的构造函数情况下,类的隐式类型转换,是使用一个其他类型构造当前类的临时对象,并用此临时对象来构造当前对象,这种转换必须有其他类型的构造函数支持;而operator算子的隐式类型转换,就是使用当前类型对象生成另一个类型的对象(正好与没有默认参数构造函数情况下,类的隐式转换相反),这种转换必须有operator算子的支持。

 参考:

C++——隐式类型转换_隐式转化 c++_linengcs的博客-CSDN博客

标签:类型转换,string,point,operator,隐式,构造函数
From: https://www.cnblogs.com/xzit201802/p/17239639.html

相关文章

  • springboot使用easyExcel导出Excel表格以及LocalDateTime时间类型转换问题
    以下内容仅供学习使用1.首先引入pom.xml依赖<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId>......
  • instanceof和类型转换
    类型转换父类引用转向子类对象把子类转换为父类,向上转型把父类转换为子类,向下转型,强制转换方便方法的调用publicstaticvoidmain(String[]args){......
  • Convex Analysis and Monotone Operator Theory in Hilbert Spaces 3.1-3.2 总结材料
    拓扑空间基本概念  集合是数学中最基本的概念之一,我们最常见的集合便是\(\mathbb{R}\)。\(\mathbb{R}\)中的元素有大小关系,即\(\mathbb{R}\)上有序结构;\(\mathbb{R......
  • C: operator priority
     Go  C     ......
  • 重学c#系列—— explicit、implicit与operator[三十四]
    前言我们都知道operator可以对我们的操作符进行重写,那么explicit和implicit就是对转换的重写。正文explicit就是强制转换,然后implicit就是隐式转换。staticvoid......
  • 数据类型转换、运算符
    day02数据类型太简单,没啥写的,略注意:空串""是长度为0的字符串。空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前......
  • VHDL ERROR: found ‘0‘ definitions of operator “+“, cannot determine exact ov
    found'0'definitionsofoperator"+",cannotdetermineexactoverloadedmatchingdefinitionfor"+"“找到运算符“+”的“0”定义,无法确定“+”的精确重载匹配......
  • java类型转换方式
    java类型转换方式mapstruct并不好用,代码臃肿,性能高一点参考https://blog.csdn.net/WX5991/article/details/121936717......
  • mysql 隐式类型转换规则
    规则:1、两个参数至少有一个是NULL时,比较的结果也是NULL,例外是使用<=>对两个NULL做比较时会返回1,这两种情况都不需要做类型转换2、两个参数都是字符串,会按照字符串......
  • operator简介
    原理operator是一种kubernetes的扩展形式,利用自定义资源对象(CustomResource)来管理应用和组件,允许用户以Kubernetes的声明式API风格来管理应用及服务。CRD(Cust......