模拟string类

#include<iostream>
#include<string>
using namespace std;
class mystring
{
public:
 char *str;
public:
mystring(const char*s=" ")
:str(new char [strlen(s)+1])
{
strcpy(str,s);
}
mystring (const mystring &s)
:str(new char[strlen(s.str)+1])
{
 
strcpy(str,s.str);
}
mystring operator=(const mystring &s)
{
delete [] s.str;
  if(this!=&s)
 if(str!=NULL)
{


 strcpy(str,s.str);
}


}
/*ostream& operator <<(ostream& output,mystring &s)
{
    output<<s._s;
    return output;
}*/
 friend ostream & operator <<(ostream&,mystring &s);
    //friend istream & operator >>(istream&,String &str);
~mystring()
{
if(str)
{
delete [] str;
str=NULL;
}
}
};
ostream& operator <<(ostream& output,mystring &s)
{
    output<<s.str;
    return output;
}
int main()
{
mystring obj="hello";

mystring p2;
mystring p3(obj);
p2=obj;


cout<<obj<<endl;
return 0;
}


在初始化类的成员的时候有两种方法,一种使我们比较常用的在函数体内进行赋值操作,另一种方式则是使用初始化列表。

   在我这个小程序中采用了初始化列表的方式,对于我们常见的int、float类型两种方式差别不大,但是对于类进行初始化的时候,我们最好采用我这个程序中所选中的初始化列表的方式,在选用初始化列表的方式时会比那些在类内定义的减少了一次调用构造函数的过程。

const加与不加问题
a.传递过来的参数在函数内不可以改变
b.参数指针所指内容为常量不可变
c.参数指针本身为常量不可变
d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:
在我的程序中加入了const主要原因是所列举的d选项,const的分类的用途还有很多种在文章结尾我将附上我所找到的const讲解博客



ps:由于刚刚开通博客,使用还不是很熟练,如果有任何问题欢迎大家联系我邮箱。

http://blog.csdn.net/Eric_Jo/article/details/4138548       const详细讲解

http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html    c++初始化列表详细讲解






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的模拟string的封装示例: ```cpp #include <iostream> #include <cstring> class myString { private: char* str; int len; public: myString(const char* s = "") { len = std::strlen(s); str = new char[len + 1]; std::strcpy(str, s); } myString(const myString& other) { len = other.len; str = new char[len + 1]; std::strcpy(str, other.str); } ~myString() { delete[] str; } myString& operator=(const myString& other) { if (this != &other) { delete[] str; len = other.len; str = new char[len + 1]; std::strcpy(str, other.str); } return *this; } myString operator+(const myString& other) const { char* temp = new char[len + other.len + 1]; std::strcpy(temp, str); std::strcat(temp, other.str); myString result(temp); delete[] temp; return result; } bool operator==(const myString& other) const { return std::strcmp(str, other.str) == 0; } friend std::ostream& operator<<(std::ostream& os, const myString& s) { os << s.str; return os; } friend std::istream& operator>>(std::istream& is, myString& s) { char temp[1024]; is >> temp; s = myString(temp); return is; } }; int main() { myString s1("hello"); myString s2("world"); myString s3 = s1 + s2; std::cout << s3 << std::endl; std::cout << (s1 == s2) << std::endl; std::cout << (s1 == myString("hello")) << std::endl; std::cin >> s1; std::cout << s1 << std::endl; return 0; } ``` 在这个示例中,我们使用了一个char指针来存储字符串的内容,并使用了一个整数来存储字符串的长度。在构造函数中,我们使用了标准库函数strlen和strcpy来初始化字符串。在析构函数中,我们释放了分配的内存。在赋值运算符中,我们首先检查是否是自我赋值,然后释放当前分配的内存并复制新的字符串。在加法运算符中,我们创建了一个新的字符数组来存储两个字符串的连接,然后使用构造函数创建一个新的字符串对象并返回。在相等运算符中,我们使用标准库函数strcmp来比较两个字符串是否相等。最后,在流运算符中,我们使用标准库函数cin和cout来读取和输出字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值