1. 程式人生 > >C++建構函式複用問題

C++建構函式複用問題

在定義C++的建構函式時,如果有N個建構函式,每一個都寫一遍程式碼是很繁瑣的。C++中有沒有和Java中一樣的呼叫機制,簡化構造方法的定義呢?
像這樣:

#define _CRT_SECURE_NO_WARNINGS
#include"MyString.h"
#include<iostream>

MyString::MyString(const MyString & constArr)
{
    MyString(constArr.m_charArray); 

}
MyString::MyString(const char* constCharP) :m_charArray(NULL)
{
    if
(constCharP) { this->m_charArray = new char[strlen(constCharP) + 1]; strcpy(this->m_charArray, constCharP); } }

請教助教,曰不行。
MyString(constArr.m_charArray); 建立了一個匿名物件和copy 建構函式沒有一點關係。
這是正確的!你可以測試一下,在copy建構函式中,定義一個MyString變數標誌(變數是記憶體塊的別名嘛!)建立的物件。記錄其地址。和copy建構函式返回的物件的地址,的確不是同一個。
看書,曰可以!
就是要將呼叫的函式放到引數列表上。如下:

MyString::MyString(const MyString & constArr) :MyString(constArr.m_charArray){}

這裡我進行了一點歸納,引數列表進行了初始化,也就是實現了物件從無到有的過程,函式體僅僅對其進行了修改。

下面貼出完整程式碼,感興趣的同學,可以測試一下:

//MyString.h
#ifndef MY_STRING_H_
#define MY_STRING_H_
#include<cstdio>
class MyString
{
public:
    MyString(const MyString & constArr);
    MyString::MyString(const
char* constCharP); void printMyStr() { printf("%s", m_charArray); } private: char* m_charArray; }; #endif // !MY_STRING_H_
//MyString.cpp
#define _CRT_SECURE_NO_WARNINGS
#include"MyString.h"
#include<iostream>
MyString::MyString(const MyString & constArr) :MyString(constArr.m_charArray)


//MyString::MyString(const MyString & constArr)
{
    MyString annoyMyStr = MyString(constArr.m_charArray); //null;
    printf("%p", annoyMyStr);
    /*if (constArr.m_charArray) {
    this->m_charArray = new char[strlen(constArr.m_charArray) + 1];
    strcpy(this->m_charArray, constArr.m_charArray);
    }*/
}
MyString::MyString(const char* constCharP) :m_charArray(NULL)
{
    if (constCharP) {
        this->m_charArray = new char[strlen(constCharP) + 1];
        strcpy(this->m_charArray, constCharP);
    }
}
//Source.cpp
#define _CRT_SECURE_NO_WARNINGS
#include"MyString.h"
#include<iostream>
#include<numeric>
using namespace std;



int main()
{
    char* testItem = "hello";
    MyString firstStr(testItem);

    MyString secondStr(firstStr);
    //printf("\n%p", secondStr);
    firstStr.printMyStr();
    cout << endl;
    secondStr.printMyStr();


    std::system("pause");
    return EXIT_SUCCESS;
}