当前位置:编程学习 > C/C++ >>

[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语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,