zoukankan      html  css  js  c++  java
  • [C++] 重载运算符与类型转换(2)——函数调用运算符和类型转换运算符

    1、这两个应该是C++中比较高级的用法了。

    一、函数调用运算符
     
    1、重载函数调用运算符(),必须是成员函数,一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或者类型上有所区别。
     
    2、定义了调用运算符的类的对象称作函数对象;函数对象常常作为泛型算法的实参。
     
    3、lambda表达式就是一个匿名的函数对象。lambda表达式产生的类不含有默认构造函数、赋值运算符及默认析构函数;它是否含有默认的拷贝/移动构造函数则通常要视捕获的数据成员类型而定。
     
    4、标准库定义的函数对象
     
    5、C++语言中几种可调用对象:函数、函数指针、lambda表达式、bind创建的对象、重载了函数调用符的类。
     
    二、类型转换运算符
     
    1、类型转换运算符可以对类类型进行类型转换,转换构造函数类型转换运算符共同定义了类类型转换。(转换构造函数就是接受参数类型A的构造函数,一般参数数目为1个,这就定义了从A到类类型的转换)
     
    2、类型转换运算符是类的一种特殊的成员函数,它负责将一个类类型的值转换成其他类型,形式如下:
    operator type() const;
    1)type类型要能够作为函数的返回类型,不允许转换成数组或函数类型。
    2)类型转换运算符既没有显式的返回类型,也没有形参,而且必须定义为类的成员函数,一般不改变对象的内容,所以被定义成const的。
    3)类型转换运算符是隐式执行的,无法给这些函数传递实参。
    4)定义向bool类型转换的现象比较普遍。比如IO类型就定义了向bool类型的显示转换。
     
    3、显式类型转换explicit
    explicit operator int() const { return val;}

    1)显式转换会屏蔽隐式转化,要进行显式的请求:static_cast<>()
    2)有一个例外,当表达式被用作条件时,会进行自动转化

    whie(cin>>val){}
    在这个例子中,首先执行输入操作,然后返回cin,cin就被隐式的转换为了bool类型。
    3)operator bool一般被定义为explicit的。
     
    4、避免二义性转换
  • 相关阅读:
    oracle11G静默安装步骤
    [INS06101] IP address of localhost could not be determined
    linux tar命令使用详解
    centos 安装 Adobe Flash Player
    yum出错:Error: failure: repodata/filelists.xml.gz from googlechrome: [Errno 256] No more mirrors to try.
    sysbench安装与使用
    /usr/libexec/gconfsanitycheck2 退出状态256
    sh脚本异常:/bin/sh^M:bad interpreter: No such file or directory
    Oracle11gR2 for Linux 静默安装
    error while loading shared libraries: xxx.so.0:cannot open shared object file: No such file or directory
  • 原文地址:https://www.cnblogs.com/zhizhiyu/p/10177594.html
Copyright © 2011-2022 走看看