这些是有效的来源:
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”关键字的区别吗?
答案 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
}
}