++操作符重载

  • ++操作符分为前置++后置++,比如: ++a;  a++;
  • ++操作符可以进行全局函数成员函数重载
  • 重载前置++操作符不需要参数
  • 重载后置++操作符需要一个int类型的占位参数
  • 前置++操作符的返回值为*this
  • 后置++操作符的返回值为临时对象

例如:

class Test
{
int mValue;
public:
Test(int i)
{
mValue = i;
}
int value()
{
return mValue;
} Test& operator ++() //前置++
{
      ++mValue;
      return *this;
} Test operator ++(int)      //后置++
{
      Test ret(mValue);       ++mValue;   //改变实际对象的内容       return ret;  //返回临时对象
} };

隐式转换之explicit关键字

当我们在使用两个不同类型的数值运算时,编译器便会执行隐式转换,会将两者类型转为相同

转换规则如下所示:

比如:

int a= -;
double b = i; //将i隐式转换为double类型, b=-2000

隐式转换的隐患

隐式转换有时会因为类型不同,得到的结果大有不同,也是常见bug之一.

参考以下示例:

unsigned int a= ;

int b= -;

cout<<a+b<<endl;                     //将b隐式转换为unsigned int类型

运行打印:


答案并非是-1000。

同样,我们使用构造函数时,也经常使用隐式转换

参考以下示例:

class  Test{
public:
Test(unsigned int i)
{
cout<<"unsigned i= "<<i<<endl;
}
}; int main()
{
Test t1=-; //将-2 隐式转换为unsigned int 型
return ;
}

运行打印:

unsigned i= 

首先编译器通过-2来找只有一个参数的构造函数,发现它的参数是unsigned int,所以便将-2隐式转换为unsigned int,从而造成结果不同.

如何解决隐式转换

在构造函数声明的时候加上explicit关键字,便能使该函数只能进行显示转换,使用方法如下:

class  Test{
public:
explicit Test(unsigned int i)
{
cout<<"unsigned i= "<<i<<endl;
}
};

添加后,再次编译Test t1=-2;时,就会报错了.

若添加explicit后,还想继续使用隐式转换,可以通过下面3钟方法使用隐式转换:

Test t1=(Test)-;                   //C方式强制转换,不推荐
Test t1=static_cast<Test>(-); //C++方式强制转换
Test t1(-); //手工调用构造函数

类型转换函数

在C++类中可以定义类型转换函数

  • 类型转换函数用于将类对象转换为其它类型,比如int
  • 方法是通过operator关键字重载其它类型,返回类型不需要填

参考以下示例:

class  Test{
int mValue;
public:
Test(int i=)
{
mValue=i;
} operator int()
{
return mValue;
}
}; int main()
{
Test t();
int i=t; //等价于: i=t.operator int();
cout<<i<<endl; //i=1000
}

同样,也能支持类与类之间转换

不过类型转换函数可能会与构造函数冲突,比如:

class  Test;          

class Value{
public:
Value()
{ }
Value(Test &t) //Value类的构造函数
{ }
}; class Test{ int mValue; public:
Test(int i=)
{
mValue=i;
} operator Value() //Test类的类型转换函数
{
Value ret;
return ret;
}
}; int main()
{
Test t();
Value Val=t; //该行出错
}

编译出错,编译器不知道用哪个方式去初始化val对象,因为Value Val=t可以等价于:

Value Val(t);                               //执行Value类的构造函数 初始化
Value Val=t.operator Value (); //执行Test类的类型转换函数

解决方法

Value(Test &t)构造函数,前面加上explicit关键字.

注意:在工程中,一般都是通过 to Type()成员函数来代替类的类型转换函数,比如QT的Qstring类: 有toInt()、toDouble()等成员函数来实现类型转换

 

21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数的更多相关文章

  1. 【校招面试 之 C/C++】第18题 C++ 中的隐式转换以及explicit关键字

    1.什么是隐式转换: 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了 ...

  2. C++中的隐式转换和explicit

    隐式转换 c++中的数据类型转换分为隐式转换和显示转换: 显示转换即使用static_cast等方法进行转换,相关内容请参考 <C++数据类型转换>: 隐式转换则是编译器完成的,如,boo ...

  3. 显示转换explicit和隐式转换implicit

    用户自定义的显示转换和隐式转换 显式转换implicit关键字告诉编译器,在源代码中不必做显示的转型就可以产生调用转换操作符方法的代码. 隐式转换implicit关键字告诉编译器只有当源代码中指定了显 ...

  4. C#中的类型转换-自定义隐式转换和显式转换

    目录 前言 基础知识 示例代码 实际应用 问题 答案 报错 用户定义的转换必须是转换成封闭类型,或者从封闭类型转换 参考 其他 应用和设计 读音 参考 前言 有时我们会遇到这么一种情况:在json数据 ...

  5. 【转】SQL SERVER标量表达式的隐式转换

    在SQL Server中的数据类型中,存在着优先级的问题.标量表达示的返回结果类型也会根据操作数的类型而定,如1 +'1'=2.而不是'11',因些Int型的优先级比VARCHAR型的优先级要高.所以 ...

  6. Scala隐式转换和隐式参数

    隐式转换 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法.通过这些功能, ...

  7. Scala基础:闭包、柯里化、隐式转换和隐式参数

    闭包,和js中的闭包一样,返回值依赖于声明在函数外部的一个或多个变量,那么这个函数就是闭包函数. val i: Int = 20 //函数func的方法体中使用了在func外部定义的变量 那func就 ...

  8. 大数据学习day17------第三阶段-----scala05------1.Akka RPC通信案例改造和部署在多台机器上 2. 柯里化方法 3. 隐式转换 4 scala的泛型

    1.Akka RPC通信案例改造和部署在多台机器上  1.1 Akka RPC通信案例的改造(主要是把一些参数不写是) Master package com._51doit.akka.rpc impo ...

  9. C# 转换符的重载 显示、隐式转换

    class Complex { //保存转换的值 Int32 v; public Complex(Int32 x) { v = x; } public Int32 ToInt32() { return ...

随机推荐

  1. unix时间戳转换成标准时间(c#)

    //---unix时间戳转换成标准时间(c#)---//     /*     string timeStamp = "1144821796";     DateTime dtSt ...

  2. SQL Server 2008 R2 添加登录账户配置权限

    一.新建登录名1. 在登录名右侧的文本框中输入新建的管理员账号名称:2. 一对单选按钮组中,选择Sql Server 身份验证,并输入登录密码:3. 勾选强制实施密码策略复选框:(密码策略一般是指加强 ...

  3. javascript中的内存管理和垃圾回收

    前面的话 不管什么程序语言,内存生命周期基本是一致的:首先,分配需要的内存:然后,使用分配到的内存:最后,释放其内存.而对于第三个步骤,何时释放内存及释放哪些变量的内存,则需要使用垃圾回收机制.本文将 ...

  4. Ajax跨域解决实例

    HTML 在本例中我们跨域http://www.sucaihuo.com/jquery/demo/43/jsonp.php?callback=.你也可以试试其他域名.下面表单中,我们提交后的结果反馈到 ...

  5. ASP.NET Core 2.0: 二. 开发环境

    macOS:Install Visual Studio for Mac 系统要求: macOS 10.12 Sierra 及更高版本 其他要求: 可能会要求安装xcode或android相关环境, 详 ...

  6. tomcat查看端口被占用

    1. tomcat有安装版和压缩版 安装版的没有关闭命令 压缩版的命令如下: tomcat关闭:catalina stop/shutdown 开启:catalina start   2. 在tomca ...

  7. 【CF245H】Queries for Number of Palindromes(回文树)

    [CF245H]Queries for Number of Palindromes(回文树) 题面 洛谷 题解 回文树,很类似原来一道后缀自动机的题目 后缀自动机那道题 看到\(n\)的范围很小,但是 ...

  8. [HNOI2010]BUS 公交线路

    题面 Bzoj Sol 状压很显然 重点在于转移:题目就相当与每\(p\)长度的车站必须有且仅有\(k\)个被经过 那么转移时状压的二进制一定要有\(k\)个一 且两个相邻转移的状态之间必须满足:设为 ...

  9. [ZJOI2007]时态同步

    题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...

  10. 剑指offer(15)反转链表

    题目描述 输入一个链表,反转链表后,输出链表的所有元素. 题目分析 至少需要三个指针pPre(指向前一个结点).pCurrent(指向当前的结点,在代码中就是pHead).pPnext(指向后一个结点 ...