程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [C/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.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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved