C++中的類型轉換函數


1,轉換構造函數可以將普通的基礎類型轉換為當前的類類型,也有能力將其它類類 型的對象轉換為當前的類類型;

 

2,問題:

    1,類類型是否能夠類型轉換到普通類型?

       1,可以的;

   

3,類型轉換函數:

    1,C++ 類中可以定義類型轉換函數;

    2,類型轉換函數用於將類對象轉換為其他類型;

       1,不管什么類型都可以;

    3,語法規則:

        1,代碼示例:

1 operator Type ()  // operator 表示定義類型轉換函數,Type 表示返回值,沒有參數;
2 {    // 函數體表示普通的函數體內容;
3     Type ret;
4                
5     // ...
6                
7     return ret;
8 }

    4,類型轉換函數初探編程實驗:

       1,main.cpp 文件:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Test
 7 {
 8     int mValue;
 9 public:
10     Test(int i = 0)
11     {
12         mValue = i;
13     }
14     int value()
15     {
16         return mValue;
17     }
18     operator int ()  // 類型轉換函數;
19     {
20         return mValue;
21     }
22 };
23 
24 int main()
25 {   
26     Test t(100);
27     int i = t;  // ==> int i = t.operator int(); 隱式調用類型轉換成員函數;這里實質是隱式類型轉換;
28     
29     cout << "t.value() = " << t.value() << endl;
30     cout << "i = " << i << endl;
31     
32     return 0;
33 }

      

4,類型轉換函數:

    1,與轉換構造函數具有同等的地位;

    2,使得編譯器有能力將對象轉化為其它類型;

    3,編譯器能夠隱式的使用類型轉換函數;

    4,編譯器會盡力嘗試讓源碼通過編譯:

 

       1,這里實質是隱式類型轉換;

 

5,類類型之間的相互轉換:

    1,類型轉換函數 VS 轉換構造函數

    2,類類型之間的轉換編程實驗:

         1,main.cpp 文件:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Test;
 7 
 8 class Value
 9 {
10 public:
11     Value()
12     {
13     }
14     explicit Value(Test& t)
15     {
16     }
17 };
18 
19 class Test
20 {
21     int mValue;
22 public:
23     Test(int i = 0)
24     {
25         mValue = i;
26     }
27     int value()
28     {
29         return mValue;
30     }
31     operator Value()
32     {
33         Value ret;
34         cout << "operator Value()" << endl;
35         return ret;
36     }
37     /*
38     工程上通過以下方式;
39     Value toValue()
40     {
41         Value ret;
42         
43         return ret;
44     }
45     */
46 };
47 
48 int main()
49 {   
50     Test t(100);
51     Value v = t;  // ==> t.operator value();
52     // Value v = t.toValue();  // 工程上針對類型轉換函數來杜絕隱式類型轉換的用法;
53     
54     return 0;
55 }

    2,編譯輸出:

         1,當 Value 類構造函數不加 explicit 修飾時:

           error: conversion from ‘Test’ to ‘Value’ is ambiguous

           note: candidates are: Test::operator Value()

           note:                 Value::Value(Test&)

         2,當 Value 類構造函數加 explicit 修飾時:

             1,編譯通過;

    3,轉換構造函數和類型轉換函數是互逆的,但是當遇到類類型之間的轉換時,它們之間是有沖突的,編譯器不知道如何選擇,應該在轉換構造函數之前加 explicit 修飾;

    3,無法抑制隱式的類型轉換函數調用;

    4,類型轉換函數可能與轉換構造函數沖突;

         1,可通過 explicit 修飾轉換構造函數解決;

    5,工程中以 Type toType() 的公有成員代替類型轉換函數;

         1,工程中一般不定義類型轉換函數;

         2,抑制類型轉換函數調用;

         3,Qt 中的示例:

 1 #include <QDebug>
 2 #include <QString>
 3 
 4 int main()
 5 {
 6     QString str = "";
 7     int i = 0;
 8     double d = 0;
 9     short s = 0;
10 
11     str = "-255";
12 
13     /* 以下進行了類類型到基礎類型之間的轉換 */
14     i = str.toInt();
15     d = str.toDouble();
16     s = str.toShort();
17 
18     qDebug() << "i = " << i << endl;
19     qDebug() << "d = " << d << endl;
20     qDebug() << "s = " << s << endl;
21 
22     return 0;
23 }

 

5,小結:

    1,C++ 類中可以定義類型轉換函數;

    2,類型轉換函數用於將類對象轉換為其它類型;

    3,類型轉換函數與轉換構造函數具有同等的地位;

    4,工程中以 Type toType() 的公有成員代替類型轉換函數;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM