C++ operator關鍵字詳解


C++中的operator主要有兩個作用,一是操作符的重載,一是自定義對象類型的隱式轉換。
類型轉換操作符(type conversion operator)是一種特殊的類成員函數,它定義將類類型值轉變為其他類型值的轉換。
轉換操作符在類定義體內聲明,在保留字 operator 之后跟着轉換的目標類型。

函數原型 
T1::operator T2() [const];   //T1的成員函數,"(T2)a"類型轉換
說明:
1. 轉換函數必須是成員函數,不能指定返回類型,並且形參表必須為空;返回值是隱含的,返回值是與轉換的類型相同的,即為上面原型中的T2;

2. T2表示內置類型名(built-in type)、類類型名(class type)或由類型別名(typedef)定義的名字;
對任何可作為函數返回類型的類型(除了 void 之外)都可以定義轉換函數,一般而言,不允許轉換為數組或函數類型,
轉換為指針類型(數據和函數指針)以及引用類型是可以的;

3. 轉換函數一般不應該改變被轉換的對象,因此轉換操作符通常應定義為 const 成員;

4. 支持繼承,可以為虛函數;

5. 只要存在轉換,編譯器將在可以使用內置轉換的地方自動調用它;
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>    /* linux環境下,sprintf需要該頭文件 */

using namespace std;

struct STData
{
    int data;
    int size;
};

class CTet
{
public:
    CTet(int age, string name,int data) :_age(age), _name(name) 
    {
        _data.data = data;
        _data.size = 10;
    }
public:
    operator char *() const;

    operator int() const
    {
        return _age;
    }

    operator struct STData() const
    {
        return _data;
    }

    operator const struct STData *() const
    {
        return &_data;
    }
private:
    int _age;
    string _name;
    STData _data;
};

//operator的隱式類型轉化
CTet::operator char *() const
{
    //注意①:轉化為指針的時候需要注意內存泄漏問題
    static char buf[100] = { 0 };
    sprintf(buf, "age[%d]:name[%s]", _age, _name.c_str());
    printf("buf = %p\n", buf);
    return buf;
}

void show_data(const STData *data)
{
    printf("data[%d] and size[%d] .\n", data->data, data->size);
}

void test()
{
    CTet a(10,"tom",22);
    /*
    可以直接將tmp對象轉換成char *,這里實際上是編譯器內部完成了以下轉化
    char *b = a.operator char *();
    */
    char *b = a;
    //b的地址就是static char buf的地址
    printf("b = %p\n", b);

    /*
    注意②:operator的隱式類型轉化的對象不能賦值給可變參數
    printf原型:int printf(const char *format, ...);
    */
    //printf("data is %s\n", a);  --無法編譯通過

    printf("[b] data is %s\n", b); 

    CTet *tmp = new CTet(3, "jack", 5);
    //show_data(tmp);   --報錯:無法將參數 1 從“CTet *”轉換為“const STData *”

    /*
    注意③:operator的隱式類型轉化只能用於棧變量,不可用於new出來的指針類型
    */

}

int main()
{
    test();
    getchar();
    return 0;
}

 


免責聲明!

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



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