C++ 类类型转换函数explicit 关键字

标准数据之间会进行  隐式类型安全转换。

  转换规则:

  

隐式类型转换的问题:  

#include <iostream>
#include <string>

using namespace std;

int main()
{
    short s = ‘a‘;
    unsigned int ui = 1000;
    int i = -2000;
    double d = i;

    cout <<"d = "<<d<<endl;//输出d = -2000
    cout <<"ui= "<<ui<<endl;//输出 ui = 1000
    cout <<"ui+i = "<<ui+i<<endl;//等价于 unsigned int ui +(unsigned int)i = ?

}
 cout <<"ui+i = "<<ui+i<<endl;//等价于 unsigned int ui +(unsigned int)i = ?

根据:-2000 + 1000 应该等于-1000,但是这里编译器帮我们做了隐式类型转换将  int 类型的变量 i 隐式类型转换为 unsigned int i 然后进行 i 与 ui 相加。所以出现了问题。

普通类型与类类型进行强制类型转换。  

  使用转换构造函数。

#include <iostream>
#include <string>

using namespace std;

/*
使用普通类型强制转换为 类类型。
转换构造函数:
    -有仅有一个参数
    -参数是基本类型
    -参数是其它类型
    使用explicit 关键字。
*/
class Test
{
    int mvalue;
    public:
        int getValue()
            {
                return mvalue;
            }
        Test ()
            {
                mvalue = 0;
            }
     explicit Test(int i)//转换构造函数
            {
                mvalue = i;
            }
};

int main()
{
    Test t;

    cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 0
//    t = 5;//这里等价于   t= Test(5);
//    Test tt= Test(5);
    t = static_cast<Test>(5);
    cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 5
    t = Test(10);
    cout << "t.getValue() = " <<t.getValue() <<endl;//输出t.getValue() = 10
    return 0;
}

运行结果:

t.getValue() = 0
t.getValue() = 5

t.getValue() = 10
 

  在实际工程中使用explicit 关键字杜绝编译器的转换尝试。

  转换构造函数被explicit 修饰只能进行显示转换

转换方式:

  static_cast<className>(value);

  className(value);例如:t= Test(5);

将类类型转换为普通类型:

  C++ 中可以定义类型转换函数,用作将类转换为其它类型。

  语法规则:

    operator Type()

      {

        Type ret ;

        ........

        return ret;

       }

#include <iostream>
#include <string>

using namespace std;

/*
将类类型转换为普通类型:

*/
class Test
{
    int mvalue;
    public:
        int getValue()
            {
                return mvalue;
            }
        Test ()
            {
                mvalue = 0;
            }
       Test(int i)
            {
                mvalue = i;
            }
       operator int()
           {
               return mvalue;
           }
};

int main()
{
    Test t(100);
    int i = t;
    cout << "i = "<< i<<endl;//输出i = 100
    return 0;
}

  

类类型互相转换:

  定义类型转换函数

#include <iostream>
#include <string>

using namespace std;

/*
类类型互相转换

*/

class Test;
class value
{
    int mvalue;
    public:
        int getValue()
            {
                return  mvalue;
            }
        value(int i)
            {

                mvalue= i;
            }
        explicit value(Test & t)
            {

            }
};
class Test
{
    int mvalue;
    public:
        int getValue()
            {
                return mvalue;
            }
        Test ()
            {
                mvalue = 0;
            }
       Test(int i)
            {
                mvalue = i;
            }
       operator int()//类型转换函数
           {
               return mvalue;
           }
       value tovalue ()//类型转换函数      ,工程中以Type toType() 的公有成员函数代替。
           {
//               value ret(this->getValue());
        value ret(mvalue); 

            cout << "operator value ()"<<endl;
            return ret;
           }
};

int main()
{
    Test t(100);
    int i = t;
    cout << "i = "<< i<<endl;

    value tt  = t.tovalue();
    cout << tt.getValue()<<endl;
    return 0;
}

类型转换函数:

  -无法抑制隐式的类型转换函数调用。

  -类型转换函数可能与转换构造函数冲突。

  -工程中以Type toType() 的公有成员函数代替。

原文地址:https://www.cnblogs.com/hjxzjp/p/11768674.html

时间: 2024-10-10 17:58:08

C++ 类类型转换函数explicit 关键字的相关文章

【C++】隐式类型转换和 explicit关键字

来自:黄邦勇帅 1. 当类中带有一个参数的构造函数时,将执形对象的隐式转换,比如有类 A,有一个带有一个参数的构造函数A(int i){}则当出现语句A m=1;就会调用带有一个参数的构造函数来创建对象m,也就是将语句转换为A m(1)的形式. 2. 如果有一个函数,比如 void f(A j){}这个函数需要一个类A 的对象作为参数,但是当调用语句为f(2)时,同样能调用这个函数,这时函数的形 参A j 被解释为,A j=2 即会隐式调用带有一个参数的构造函数来创建一个对象j. 但是有一种形式

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

++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 前置++操作符的返回值为*this 后置++操作符的返回值为临时对象 例如: 转换规则如下所示: 比如: 隐式转换的隐患 隐式转换有时会因为类型不同,得到的结果大有不同,也是常见bug之一. 参考以下示例: 运行打印: 答案并非是-1000. 同样,我们使用构造函数时,也经常使用隐式转换 参考以下示

C++ Primer 学习笔记_18_类与数据抽象(4)_构造函数、析构函数、explicit关键字、赋值与初始化、类成员的显式初始化

引言: 构造函数确保每个对象在创建时自动调用,以确保每个对象的数据成员都有合适的初始值. 一.构造函数.默认构造函数 1.构造函数 --构造函数是特殊的成员函数 --构造函数是为了保证对象的每个数据成员都被正确初始化 --函数名和类名完全相同 --不能定义构造函数的类型(返回类型),也不能使用void --通常情况下构造函数应声明为公有函数,一般被隐式地调用. --构造函数被声明为私有有特殊的用途,比如单例模式. (1).构造函数可以被重载 一般而言,不同的构造函数允许用户指定不同的方式来初始化

在复数类中自定义类型转换函数实现复数和非复数之间的运算

实现复数+double型数据,并且打印运算后实部上的数据 #include <iostream> using namespace std; class Complex { public: Complex( )//定义默认构造函数初始化复数 { real=0; imag=0; } //使用初始化表初始化复数 Complex(double r, double i):real(r),imag(i){} //定义自定义类型转换函数 operator double() { return real; }

隐式类类型转换

<C++ Primer>中提到: “可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换.” 这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的. 那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换. 下面通过代码来看一看: #include "stdafx.h" #include <string>

C++中 explicit 关键字

阅读了 effective c++中关于初始化部分知识,其中提到了explicit关键字 explicit作用: 防止构造函数执行隐式类型转换 要明白它的作用,首先要了解隐式转换: 我们来构造一个隐式调用 方法:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 例如: <span style="font-size:18px;">class B{ public: B(int x); void dosomething(B bobject); }</

C++中explicit关键字的作用

转自:http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 例如: class things{ public: things(const std::string&name =""): m_name(name),height(0),weight(

C++隐式类类型转换

C++可以定义如何将其他类型的对象隐式转换为我们的类类型或将我们的类类型的对象隐式转换为其他类型.为了定义到类类型的隐式转换,需要定义合适的构造函数. 说明:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 下面先看一个例子:http://blog.csdn.net/vagrxie/article/details/1586340 1 #include <string> 2 #include <iostream> 3 using namespace std;

Effective c++(笔记) 之 类与函数的设计声明中常遇到的问题

1.当我们开始去敲代码的时候,想过这个问题么?怎么去设计一个类? 或者对于程序员来说,写代码真的就如同搬砖一样,每天都干的事情,但是我们是否曾想过,在c++的代码中怎么样去设计一个类?我觉得这个问题可比我们"搬砖"重要的多,大家说不是么? 这个答案在本博客中会细细道来,当我们设计一个类时,其实会出现很多问题,例如:我们是否应该在类中编写copy constructor 和assignment运算符(这个上篇博客中已说明),另外,我们是让编写的函数成为类的成员函数还是友元还是非成员函数,