[C/C++]在一个类中重载另一个类的构造函数 ----构造函数是一个特殊的操作符
假设我们有两个类A,B
[cpp]
class A
{
public:
A(int n) : a(n){}
void Print() {cout << a << endl;}
private:
int a;
};
class B
{ www.zzzyk.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
补充:软件开发 , C语言 ,