c++ new string数组问题
来源:互联网 发布:淘宝店怎么上架商品 编辑:程序博客网 时间:2024/06/08 07:05
今天考虑一个问题:
string *p = new string[5];
p[0] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
p[2] = "bb";
new操作时是需要知道类型的大小的。但new string[5]时怎么知道string的大小的呢? 感觉很奇怪。
经过思考,认为原因如下:
1. new string[5]会调用string的默认构造函数。所以会有5个空字符串被创建。
2. string 的=操作会重新new char[], 更新原来的string内部的char*。
另外,string的实现参考:
#include <iostream>#include <string.h>using namespace std;class MyString{char* m_str;int m_nLength;void _InitString();public://1. 默认构造函数MyString();// 2. 带参构造函数MyString( unsigned int length, const char& ch );MyString(const char* str);MyString( const char* str, unsigned int length );MyString( const MyString& str, unsigned int index, unsigned int length );// 3. 拷贝构造函数MyString( const MyString& s );//4.析构函数~MyString();// 5. 追加字符串函数MyString& append( const MyString& _str );MyString& append( const char* str );MyString& append( const MyString& str, unsigned int index, unsigned int len );MyString& append( const char* str, unsigned int num );MyString& append( unsigned int num, char ch );/*// 6. 赋值函数MyString& assign( const MyString& str );MyString& assign( const char* str );MyString& assign( const char* str, unsigned int num );MyString& assign( const MyString& str, unsigned int index, unsigned int len );// // 7. 返回字符串指针函数const char* c_str() const;// 8. 字符串比较函数int MyString::compare( const MyString& str );int compare( const char* str );int compare( unsigned int index, unsigned int length, const MyString& str );// 9. 拷贝函数unsigned int copy( char* str, unsigned int num, unsigned int index );// 10. 查找函数unsigned int find( const MyString& str, unsigned int index );unsigned int find( const char* str, unsigned int index );unsigned int find( char ch, unsigned int index );// 11. 替换函数void replace(const char* findString, const char* replaceString);// 12. 返回子串MyString substr( unsigned int index, unsigned int num );// // 13. 交换字符串函数void swap(MyString& from );// 14. 其他函数void clear();unsigned int length() const;unsigned int size() const;// 15. 重载运算符// 1). 比较运算friend bool operator==(const MyString& c1, const MyString& c2);friend bool operator!=(const MyString& c1, const MyString& c2);// // 2). 追加运算friend MyString operator+(const MyString& s1, const MyString& s2 );friend MyString operator+(const char* s, const MyString& s2 );// 3). 输入输出运算friend ostream& operator<<( ostream& os, const MyString& s );friend istream& operator>>( istream& is, MyString& s );// // 4). 赋值运算MyString& operator=( const MyString& s );MyString& operator=( const char* s );char& operator[]( unsigned int index );*///显示结果void Show(){cout<<m_str<<endl;}};MyString::MyString(){m_str=new char[1];m_str[0]=0;int m_nLength=0;}MyString::~MyString(){delete []m_str;m_str=NULL;}MyString::MyString( unsigned int length, const char& ch ){m_nLength=length;m_str=new char[m_nLength+1];for (int i=0;i<m_nLength;++i){m_str[i]=ch;}m_str[m_nLength]=0;}MyString::MyString(const char* str){if (NULL==str){m_str=new char[1];m_str[0]=0;int m_nLength=0;}else{m_str=new char[strlen(str)+1];strcpy(m_str,str); m_nLength=strlen(str);}}MyString::MyString( const char* str, unsigned int length ){if (NULL==str){m_str=new char[1];m_str[0]=0;int m_nLength=0;}else{m_nLength=length;m_str=new char[m_nLength+1];strncpy(m_str,str,m_nLength);m_str[m_nLength]=0;}}MyString::MyString( const MyString& str, unsigned int index, unsigned int length ){m_nLength=length;m_str=new char[m_nLength+1];strncpy(m_str,str.m_str+index,m_nLength);m_str[m_nLength]=0;}MyString::MyString( const MyString& s ){m_str= new char[strlen(s.m_str)+1];strcpy(m_str,s.m_str);}/*MyString::MyString& append( const MyString& _str ){}*/MyString& MyString::append( const char* str ){if (NULL==str){m_str=new char[1];m_str[0]=0;}else{strcat(m_str,str);}return *m_str;}MyString& MyString::append( const MyString& _str ){char*p=new char[strlen(m_str)+strlen(_str.m_str)+1];strcpy(p,m_str);strcat(p,_str.m_str); p[strlen(m_str)+strlen(_str.m_str)]=0;delete []m_str;m_str=p;return *this;}MyString& MyString::append( const char* str ){char*p=new char[strlen(m_str)+strlen(str)+1];strcpy(p,m_str);strcat(p,str);p[strlen(m_str)+strlen(str)]=0;delete []m_str;m_str=p ;return *this;}MyString& MyString::append( const MyString& str, unsigned int index, unsigned int len ){char*p=new char[strlen(m_str)+strlen(str.m_str)-index+1];strcpy(p,m_str);strncat(p,str.m_str+index,len);p[strlen(m_str)+strlen(str.m_str)-index]=0;delete []m_str;m_str=p;return *this;}MyString& MyString::append( const char* str, unsigned int num ){char*p=new char[num+1];strncpy(p,str,num); p[num]=0;delete []m_str;m_str=p;return*this;}MyString& MyString::append( unsigned int num, char ch ){char*p=new char[num+1];for(int i=0;i<num;++i){p[i]=ch;}p[num]=0;delete []m_str;m_str=p;return *this;}MyString& MyString::assign( const MyString& str ){<span style="color:#FF0000;">char*p=new char[strlen(str.m_str)+1];strcpy(p,str.m_str); p[strlen(str.m_str)]=0;delete []m_str;m_str=p;return *this;</span>}MyString& MyString::assign( const char* str ){char*p=new char[strlen(str)+1];strcpy(p,str);p[strlen(str)]=0;delete []m_str;m_str=p;return *this;}MyString& MyString::assign( const char* str, unsigned int num ){char*p=new char[num+1];strncpy(p,str,num);p[num]=0;delete []m_str;m_str=p;return *this;}MyString& MyString::assign( const MyString& str, unsigned int index, unsigned int len ){char*p=new char[len+1];strncpy(p,str.m_str+index,len);p[len]=0;delete []m_str;m_str=p;return *this;}
0 0
- c++ new string数组问题
- String c = new String("xyz")会创建几个String对象的问题
- C++new数组
- String s=new String("xyz")及String s="a"+"b"+"c"+"d";创建几个String对象的问题
- new List<Map<String,String>> 问题
- string 管理 char 数组, 摆脱new delete
- new创建多维数组问题
- String 数组初始化问题
- java String的经典问题(new String() ,String )
- Java String的经典问题(new String() ,String )
- java String的经典问题(new String() ,String )
- java String的经典问题(new String() ,String )
- c.toString() 和 String s = new String(c) 区别
- java String赋值问题,nul,new String()函数赋值问题
- new ImageIcon(String filename)的路径问题
- new string("xiaolixi")的参数问题
- C/C++ new 一个二维数组
- 【C++】使用new新建动态二维数组
- 鄙人的网易博客整理(研究生一年级)- 关于vim学习曲线
- Cisco交换机初始化配置
- Django官方教程(一)
- OpenGL深入探索——点光源中的法向量计算
- php 运行环境搭建
- c++ new string数组问题
- SICP 习题2.19 重写count-change 过程
- iOS 使用NSTimer写出Button获取验证码倒计时的效果
- Bootstrap导航栏
- Linux抓包工具tcpdump详解
- 使用PlayCanvas制作一个简单的小游戏(一)
- Spring配置文件中<context:include-filter>和<context:exclude-filter>
- Ejabberd安装配置(一)
- Sublime text3常用插件