【C/C++】在一个种中重载另一个类的构造函数 -构造函数是一个特殊的操作符
【C/C++】在一个类中重载另一个类的构造函数 ----构造函数是一个特殊的操作符
重载后,在需要以A为参数的地方,放上B,都会隐式调用B重载的操作符A(),来构造一个类A的对象。
假设我们有两个类A,B
class A { public: A(int n) : a(n){} void Print() {cout << a << endl;} private: int a; }; class B { public: void SetVal(int a) {b = a;} private: int b; };
需要用类B的对象去构造类A的对象时,一般可以在类A中做如下构造函数定义:
A(B);
但这个构造函数在以下情况时,是无法定义的:
1. 用B的私有成员给A赋值,且B没有定义A为友元类;
2. 对A的定义没有权限修改,只能修改B
这里,需要把A的构造函数当作一个特殊的操作符,在类B的定义中重载这个操作符。
class B { public: operator A() const { return A(b); } void SetVal(int a) {b = a;} private: int b; };
重载后,在需要以A为参数的地方,放上B,都会隐式调用B重载的操作符A(),来构造一个类A的对象。
如:
A objA(objB); vector<A> vecA; vecA.push_back(objB);
完整代码示例:
#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