C++ 如何在類的構造函數中調用已經寫好的構造函數
讓我們先看一段代碼:
#include<iostream>
using namespace std;
int main()
{
int a = 12;
cout << a << endl;
int* p = new (&a) int(15);
cout << *p << endl;
}
你可能會感慨,爲什麼要做這種摳腳操作?
確實,這種做法是很無聊的,但是我們也發現這樣做有一個特點:我們可以在已有的已經申請的內存上調用構造函數對其進行初始化。
那就算能這麼做又有什麼意義呢?
假設我們有一個寫好的構造函數A(int,int),我們現在想要重載一個構造函數A(int,int,int),但是新的構造函數除了部分操作外,其他基本和原來寫好的構造函數一致,這就出現了極大的代碼重複。代碼重複是令我們噁心的一點,但是我們又不能直接在新寫的構造函數中調原構造函數。之前那個摳腳的操作就起到作用了。
#include <iostream>
using namespace std;
class A
{
private:
int a;
public:
A(int);
A(int,int);
};
A::A(int _a)
:a(_a)
{
cout << "調用舊的構造函數" << endl;
}
A::A(int _a,int)
{
new(this) A(_a);
cout << "調用新的構造函數" << endl;
cout << a << endl;
}
int main()
{
A a(12,12);
//我們發現即調用了新的構造函數又調用了舊的構造函數
//因爲我們在新的構造函數中調用了舊的構造函數
}