C+笔记七十六:类中私有属性的访问

项目开发过程中,经常会有这么一个场景,我需要直接使用MyString类的指向字符串的指针,但这个指针变量是一个私有属性,不能直接访问,因此我们需要通过一个public属性的函数将其暴露出来。

还是上几个笔记的程序,继续进行补充,比如我定义一个MyString类对象s4并进行初始化,然后我想修改对象的私有属性m_p所指的空间。

我可以通过一个public属性的函数返回对象的私有属性。

public:

intgetLen()

{

returnm_len;

}

完整程序:

MyString.h

#pragmaonce

usingnamespacestd;

classMyString

{

//重载左操作符友元函数

friendostream&operator

public:

//无参构造函数,定义一个空串

MyString(void);

//有参构造函数

MyString(constchar*p);

//拷贝构造函数

MyString(constMyString& s);

//析构函数

~MyString(void);

public:

//等号操作符重载函数 s4=s2;

MyString&operator=(constMyString& str);

//等号操作符重载函数 s4="ab";

MyString&operator=(constchar* str);

//重载[]操作符

char&operator[](intindex);

//重载双等号操作符

booloperator==(MyString& str);

booloperator==(char*p);

//重载不等号操作符

boolMyString::operator!=(MyString& str);

boolMyString::operator!=(char* p);

//重载大于操作符

intoperator>(constchar*p);

intoperator>(constMyString& str);

//重载小于操作符

intoperator

intoperator

public:

intgetLen()

{

returnm_len;

}

char* getp()

{

returnm_p;

}

private:

intm_len;//储存字符串的长度

char*m_p;//指向字符串所在内存的首地址

};

MyString.cpp

#define_CRT_SECURE_NO_WARNINGS

#include

#include"MyString.h"

//无参构造函数,定义一个空串

MyString::MyString(void)

{

m_len=0;

m_p=newchar[m_len+1];

strcpy(m_p,"");

}

//有参构造函数

MyString::MyString(constchar*p)

{

if(NULL==p)

{

m_len=0;

m_p=newchar[m_len+1];

strcpy(m_p,p);

}

else

{

m_len=strlen(p);

m_p=newchar[m_len+1];

strcpy(m_p,p);

}

}

//拷贝构造函数

MyString::MyString(constMyString& s)

{

m_len=s.m_len;

m_p=newchar[m_len+1];

strcpy(m_p,s.m_p);

}

//析构函数

MyString::~MyString(void)

{

if(m_p!=NULL)

{

delete[]m_p;

m_p=NULL;

m_len=0;

}

}

//重载等号操作符,考虑链式编程

//s4=s2

//s4.operator=(s2)

//MyString& operator=(const MyString& str)

//s4的指针已经分配内存空间了,因此需要先把旧的释放掉

MyString& MyString::operator=(constMyString& str)

{

//(1)把旧的内存释放掉

if(m_p!=NULL)

{

delete[]m_p;

m_len=0;

}

//(2)根据str分配内存,str是类的对象,至少是空串

m_len=str.m_len;

m_p=newchar[m_len+1];

strcpy(m_p,str.m_p);

return*this;

}

//重载等号操作符,考虑链式编程

//s4="ab"

//s4.operator=("ab")

//MyString& operator=(const char* str)

//s4的指针已经分配内存空间了,因此需要先把旧的释放掉

MyString& MyString::operator=(constchar* str)

{

//(1)把旧的内存释放掉

if(m_p!=NULL)

{

delete[]m_p;

m_len=0;

}

//(2)根据str分配内存

if(NULL==str)

{

m_len=0;

m_p=newchar[m_len+1];

strcpy(m_p,"");

}

else

{

m_len=strlen(str);

m_p=newchar[m_len+1];

strcpy(m_p,str);

}

return*this;//支持链式编程,返回引用

}

//重载数组小标[]操作符

//s4[i]

//s4.operator[](int i)

//char& operator[](int i)

char& MyString::operator[](intindex)

{

returnm_p[index];//可以作为左值,返回引用

}

//重载双等号操作符

//s3==s4

//s3.operator==(s4)

//bool operator==(MyString& str)

boolMyString::operator==(MyString& str)

{

if(m_len!=str.m_len)

{

returnfalse;

}

return!strcmp(this->m_p,str.m_p);

}

//重载双等号操作符

//s3=="abcd"

//s3.operator==("abcd")

//bool operator==(char *p)

boolMyString::operator==(char*p)

{

if(NULL==p)

{

if(0==m_len)

{

returntrue;

}

returnfalse;

}

else

{

if(m_len==strlen(p))

{

//strcmp比较字符串是否相等,相等返回0

return!strcmp(m_p,p);

}

else

{

returnfalse;

}

}

}

//重载不等号操作符

//s3!=s4

//s3.operator!=(s4)

//bool operator!=(MyString& str)

boolMyString::operator!=(MyString& str)

{

return!(*this==str);

}

//重载不等号操作符

//s3!="abcd"

//s3.operator!=("abcd")

//bool operator!=(char* p)

boolMyString::operator!=(char* p)

{

return!(*this==p);

}

//重载大于操作符

//s3>"abcd"

intMyString::operator>(constchar*p)

{

returnstrcmp(p,this->m_p);

}

//重载大于操作符

intMyString::operator>(constMyString& str)

{

returnstrcmp(str.m_p,this->m_p);

}

//重载小于操作符

//s3

intMyString::operator

{

returnstrcmp(this->m_p,p);

}

//重载小于操作符

intMyString::operator

{

returnstrcmp(this->m_p,str.m_p);

}

//cout

//operator

//只能用全局函数

ostream&operator

{

cout

returnout;

}

Test.cpp

#include

#include"MyString.h"

usingnamespacestd;

intmain()

{

//类定义对象时才调用构造函数

MyString s1;//调用无参构造函数

MyString s2("abcd");//调用有参构造函数

MyString s3=s2;//调用拷贝构造函数深拷贝

MyString s4="abcdefg";//调用有参构造函数

strcpy(s4.getp(),"gfedc");

cout

cout

system("pause");

return0;

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180811A0RZWJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券