| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 431 人关注过本帖
标题:创建一个简单的String类,运行异常
只看楼主 加入收藏
cwl168
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2012-12-14
结帖率:8.33%
收藏
已结贴  问题点数:10 回复次数:1 
创建一个简单的String类,运行异常
#include <iostream>
using namespace std;

class String
{
public:
    String();
    String(const char *const ch);//创建自适应字符串长度的字符串大小。
    int getlen()const{return len;}//求字符串长度。
    char *getstr()const{return str;}//不改变返回的字符串。
    char &operator[](unsigned short int length);//限制字符串超出界限。
    char operator[](unsigned short int length)const;//此函数式为const函数服务的。如果没有这个函数,那么在调用复制构造函数String::String(const String&rs)
    //编译时就为出错的,因为复制构造函数参数声明的是const String&rs;
    //由于是字符传递的,所以的值传递。
    String(const String &rs);//复制构造函数,这样可以完成给字符串赋值初始化。
    String &operator =(const String &s);//重载=,使对象可以直接被赋值为字符串。
private:
    unsigned short int len;//字符串的长度。
    char *str;//指向字符串的。
};

String::String()
{
    cout<<"无参数构造函数执行中...."<<endl;
    len=0;
    str=new char[1];
    str[0]='\0';
}
String::String(const char *const ch)
{
    cout<<"带一个参数的构造函数...."<<endl;
    len=strlen(ch);

    str=new char(len+1);//字符串长度加1,是为了把最后一个字符放字符串的结束标志。
    for(int i=0;i<len;i++)
    {
        str[i]=ch[i];
        
    }
    str[len]='\0';
   
}

char &String::operator[](unsigned short int length)
{
    cout<<"operator[]执行...";
    if(length>len)
        return str[len-1];//当length大于len时,返回最后一个可见字符,即最后一个字符。由于用的是引用返回所以可以对其最后一个可见字符进行修改。
    else
        return str[length];
}
char String::operator[](unsigned short int length)const
{
    if(length>len)
        return str[len-1];//当length大于len时,返回最后一个可见字符,即最后一个字符。由于用的是引用返回所以可以对其最后一个可见字符进行修改。
    else
        return str[length];
}

String::String(const String &rs)
{
    cout<<"复制构造函数执行中...."<<endl;
    len=rs.getlen();
    str=new char[len+1];
    for(int i=0;i<len;i++)
    {
        str[i]=rs[i];//虽然rs是一个对象但是由于我们已经对[]进行重载了,所以可以直接用rs[];
    }
    str[len]='\0';
}

String& String::operator=(const String &h)
{
    cout<<"operator=执行中...."<<endl;
    if(this==&h)//this指针指向的是=左边的对象,
    {
        return *this;
    }
       delete []str;
    len=h.getlen();
   
    str=new char[len+1];
   
    for(int i=0;i<len;i++)
    {
        str[i]=h[i];//由于[]已经重载过了,所以可以直接用,如果没有重载则不可以直接用,需要s.getstr();来实现
    }
    str[len]='\0';
    return *this;
}

int main()
{
/*
    String s;
    cout<<s.getlen()<<endl;
    String s1("study");
    cout<<s1.getstr()<<endl;
    char *temp="help me";
    String s2(temp);
    cout<<s2.getlen()<<endl<<s2.getstr()<<endl;
    cin>>s2[99];
    cout<<s2.getlen()<<endl<<s2.getstr()<<endl;
    cout<<s2[99]<<endl;

    String s3=s2;

    cout<<"s3:"<<s3.getstr()<<endl;

  */
    String s4("hello world"),s5("help me");
        
    s4=s5;
   
    String s6;
    s4=s5=s6;
    cout<<s4.getstr()<<endl;
    cout<<s5.getstr()<<endl;
    cout<<s6.getstr()<<endl;
   
    return 0;
}
搜索更多相关主题的帖子: namespace include public return 
2013-04-11 10:05
zhuxiaoneng
Rank: 4
等 级:业余侠客
威 望:2
帖 子:51
专家分:215
注 册:2013-4-10
收藏
得分:10 
String::String(const char *const ch)
{
    cout<<"带一个参数的构造函数...."<<endl;
    len=strlen(ch);

    str=new char(len+1);//字符串长度加1,是为了把最后一个字符放字符串的结束标志。
    for(int i=0;i<len;i++)
    {
        str[i]=ch[i];
        
    }
    str[len]='\0';
   
}
中str=new char(len+1);//字符串长度加1,是为了把最后一个字符放字符串的结束标志。
应该为:
str=new char[len+1];
2013-04-11 10:52
快速回复:创建一个简单的String类,运行异常
数据加载中...
 
   



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

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