假設我們有兩個類A,B
[cpp]
class A
{
public:
A(int n) : a(n){}
void Print() {cout << a << endl;}
private:
int a;
};
class B
{ www.2cto.com
public:
void SetVal(int a) {b = a;}
private:
int b;
};
需要用類B的對象去構造類A的對象時,一般可以在類A中做如下構造函數定義:
[cpp]
A(B);
但這個構造函數在以下情況時,是無法定義的:
1. 用B的私有成員給A賦值,且B沒有定義A為友元類;
2. 對A的定義沒有權限修改,只能修改B
這裡,需要把A的構造函數當作一個特殊的操作符,在類B的定義中重載這個操作符。
[cpp]
class B
{
public:
operator A() const
{
return A(b);
}
void SetVal(int a) {b = a;}
private:
int b;
};
重載後,在需要以A為參數的地方,放上B,都會隱式調用B重載的操作符A(),來構造一個類A的對象。
如:
[cpp]
A objA(objB);
vector<A> vecA;
vecA.push_back(objB);
完整代碼示例:
[cpp]
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class A
{
public:
A(int n) : a(n){}
void Print() {cout << a << endl;}
private:
int a;
};
class B
{
public:
operator A() const
{
return A(b);
}
void SetVal(int a) {b = a;}
private:
int b;
};
int main()
{
B objB;
objB.SetVal(5);
A objA(objB);
objA.Print();
objB.SetVal(10);
vector<A> vecA;
vecA.push_back(objB);
vecA[0].Print();
return 0;
}
輸出結果:
5
10