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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值