1. 程式人生 > >C++ operator關鍵字詳解

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; }