C ++类类型转换运算符重载问题

时间:2019-01-18 13:15:26

标签: c++

这些是有效的来源:

MyString.h

#pragma once

class CMyString {
    public:
        CMyString();
        CMyString(const CMyString &rhs);
        CMyString(const char* param);
        ~CMyString();

    private:
        char* m_pszData;
        int m_nLength;

    public:
        int setString(const char* pszParam);
        const char* getString() const;
        void release();
        CMyString& operator=(const CMyString &rhs);
        operator char*() const;
};

MyString.cpp

#include "MyString.h"
#include <iostream>
#include <cstring>

CMyString::CMyString() : m_pszData(NULL), m_nLength(0) {
}

CMyString::CMyString (const CMyString &rhs) : m_pszData(NULL), m_nLength(0) {
    this->setString(rhs.getString());
}

CMyString::CMyString (const char* pszParam) : m_pszData(NULL), m_nLength(0) {
    setString(pszParam);
}

CMyString::~CMyString() {
    release();
}

int CMyString::setString(const char* pszParam) {
    release();
    if(pszParam == NULL)
        return 0;
    m_nLength = strlen(pszParam);
    if(m_nLength == 0)
        return 0;
    m_pszData = new char[m_nLength + 1];
    strncpy(m_pszData, pszParam, m_nLength);

    return m_nLength;
}

const char* CMyString::getString() const {
    return m_pszData;
}

void CMyString::release() {
    if(m_pszData != NULL)
        delete[] m_pszData;

    m_pszData = NULL;
    m_nLength = 0;
}

CMyString &CMyString::operator = (const CMyString &rhs) {
    if(this != &rhs)
        this->setString(rhs.getString());

    return *this;
}

CMyString::operator char*() const { return m_pszData; }

StringCtrlSample.cpp

#include "MyString.h"
#include <iostream>
using namespace std;

void testFunc(const CMyString &strParam) {
    cout << strParam << endl;
}

int main(int argc, char *argv[]) {


    CMyString strData("Hello");
    cout << strData.getString() << endl;

    ::testFunc(strData);
    ::testFunc(CMyString("World"));

    return 0;
}

我尝试在MyString.h和MyString.cpp上使用运算符重载char *()而不使用“ const”关键字,但是在编译时出现打印错误。例如)运算符char *();

有人可以解释一下在char *()末尾添加“ const”关键字的区别吗?

2 个答案:

答案 0 :(得分:2)

在此功能中:

void testFunc(const CMyString &strParam) {
    cout << strParam << endl;
}

strParam是对const的{​​{1}}引用,因此您只能在其上调用CMystring限定的方法:

const

// Not const-qualified overload operator char*() // const-qualified overload operator char*() const 限定的方法内,您不能修改非const的属性或调用非mutable的方法,这可以确保您的对象未被“修改”(至少不应从外部角度来看。)

请注意,您可能应该从const限定的方法转换为const char*,否则可以这样做:

const

因此您的转换运算符应为:

void testFunc(const CMyString &strParam) {
    // I am modifiying the underlying char array of const variable
    static_cast<char*>(strParam)[0] = '\0';
}

答案 1 :(得分:0)

在方法的末尾添加const关键字将禁止其更改任何成员值或调用任何非const方法。 唯一的例外是可变值,可以随时对其进行修改。

class A
{
    int i1;
    mutable int i2;
public:
    void m() const
    {
        // i1 = 5 <- error
        i2 = 5 // <- ok
    }
}