| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 321 人关注过本帖
标题:自定义string类的两个下标函数
只看楼主 加入收藏
lyb661
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:15
帖 子:45
专家分:78
注 册:2018-12-12
结帖率:100%
  已结贴   问题点数:20  回复次数:2   
自定义string类的两个下标函数
自定义string类的两个下标函数
  作者:lyb661(20190104)

例如,有类定义:

//myString.h(头文件)
class myString
{
    public:
        myString(const char* cstring="");
        //other member function
        char operator[](int k)const;
        char& operator[](int k);
        //other member function
    protected:

    private:
        char* buffer;
        int strLength;
};


//myString.cpp(源程序文件)

char myString::operator[](int k)const
{
    if(k<0||k>=strLength)
        cerr<<"outofbound";
    return buffer[k];
}
char& myString::operator[](int k)
{
    if(k<0||k>=strLength)
        cerr<<"outofbound";
    return buffer[k];
}

//other member function definition

    如上所列,访问string类的下标定义了两个函数版本,一个是非const版本,另一个是const版本,非const版本返回引用类型。
为什么要定义两个版本呢?
    因为C风格字符串一般为const char* 类型,如果要通过下标来访问string字符串中的单个字符,编译器将保证字符串本身不被修

改;另外非const版本将用来修改字符串中的单个字符,如果不定义为引用类型则不能修改单个字符。
    至于编译器不同,编译的结果也不一样。总之两个版本各有各的用途。例如:
        void f1()
        {
        myString str1="hello";
        str1[0]='f';
         }

        void f2()
         {
            myString str2("hello world!");
            std::cout<<str2[3];
          }
          函数f1将调用非const引用版本,而f2将调用const版本,两者在程序中各司其职,不能互相代替,可以说是缺一不可的。

2019-01-04 10:28
Jonny0201
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:42
帖 子:463
专家分:2301
注 册:2016-11-7
  得分:20 
附上一段 libc++ 的实现
程序代码:
template <class _CharT, class _Traits, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
typename basic_string<_CharT, _Traits, _Allocator>::const_reference
basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const _NOEXCEPT
{
    _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
    return *(data() + __pos);
}

template <class _CharT, class _Traits, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
typename basic_string<_CharT, _Traits, _Allocator>::reference
basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) _NOEXCEPT
{
    _LIBCPP_ASSERT(__pos <= size(), "string index out of bounds");
    return *(__get_pointer() + __pos);
}


libc++ 是把 non-const 的工作交给 __get_pointer(), const 的工作交给 data(), 但是实际上可以通过 const_cast 或者 static_cast 将其中一个函数的工作委托给另外一个函数
例如
return static_cast<const_reference>((const_cast<basic_string<_CharT, _Traits, _Allocator> &>(*this))[__pos]);
2019-01-04 12:15
lyb661
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:15
帖 子:45
专家分:78
注 册:2018-12-12
  得分:0 
写一个自定义的string类,主要是为了理解C++类的底层技术,至于字符串的模板有点高大上了!
2019-01-05 15:28







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045868 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved