网站建设竞争性磋商文件,做英语教具的网站,网站建设 麻烦吗,wordpress修改博客界面我的码云
我的string码云
分析总结
1.项目结构 所有的类和函数需要在namespace中实现#xff0c;要和string高度对应 private:char* _str;//字符串size_t _size;//有效长度size_t _capacity;//总空间#xff0c;包括\0const static size_t npos-1;2.定义变量 1 所…我的码云
我的string码云
分析总结
1.项目结构 所有的类和函数需要在namespace中实现要和string高度对应 private:char* _str;//字符串size_t _size;//有效长度size_t _capacity;//总空间包括\0const static size_t npos-1;2.定义变量 1 所有的变量和函数要放到class中而且要规定private类型 2 其中有一个是特殊的,const static size_t npos-1;这是需要特别记忆size_t npos赋值为-1表示无符号整形的最大值 对于长度和总空间一定不会是小于0的我们依旧设为无符号整形 3.调试代码区域 因为这是在namespace中实现的我们调试代码可以需要加上using namespace或者直接在namespace中写一个调试函数 4.构造函数 string():_str(new char[sizeof(char)*4]),_size(0),_capacity(4){_str[0] \0;}在对象初始化的时候我们首选初始化列表进行初始化(效率更高),并且我们在初始化列表中为了防止别人随便改变变量定义的顺序导致初始化列表错乱我们会选择在函数中进行初始化。(初始化列表的初始化顺序并不是根据列表中数据出现的顺序决定的而是由定义的顺序决定的 string(){_size 0;_capacity 4;_str new char[_capacity];_str[0] \0;}在初始话的时候还要注意变量的值要选取合适并且要注意字符串的结尾不论是有没有字符串都应该为\0 拷贝构造和析构函数
string(const string other)
{_size other._size;_capacity other._capacity;_str new char[sizeof(char) * _capacity];strcpy(_str, other._str);
}~string()
{delete[] _str;
}代码中char数组需要设为动态的空间要进行深拷贝防止浅拷贝带来的问题 在拷贝构造中要注意加const防止传来的是匿名对象匿名对象有常性需要const修饰才行对于重载也是需要加const 重载运算符
类内friend ostream operator(ostream out, string str);friend istream operator(istream in, string str);类外ostream operator(ostream out, string str){cout str.c_str();return out;}istream operator(istream in, string str){cin str._str;return in;}等我回来再叙述iostream 因为这个是和 必须要在类外实现并且要调用类中private成员变量我们必须使用friend标识符 我在调用的c_str()函数也就是说我们的可以不用再类内声明成friend 也就是说只有在需要调用类中的变量的时候才需要写成friend 迭代器
简单介绍
1.using namespace 的情况下 string::iterator itstr.begin();2.没有使用using namespace 的定义形式 bit::string::iterator tem;既要指明namespace又要指明class 实现 iterator是一个类型他定义了itit接收了begin()的返回值it要对char数组进行访问而且要能通过it自增进行连续的访问那么it就应该是指针类型char*同时又要写成iterator的形式就需要进行typedef typedef char* iterator;//必须要将这个定义放出来不然类外就无法使用声明iterator begin(){return _str;}iterator end(){return _str _size 1;}在写end函数的时候一定要清楚end指向的是整个数组结尾的下一个位置 typedef char* iterator;这个定义一定要放到public中不能放到private中因为在外面进行定义迭代器的时候需要访问到iterator这个类型 作用域操作符可以对类内public静态成员变量和函数进行访问以及上面这种类型进行访问 reserve和resize void resize(size_t n, char c \0){delete[] _str;_str new char[sizeof(char) * (n 1)];_size n;_capacity n 1;for (int i 0; i n; i)_str[i] c;_str[n] \0;}void reserve(size_t all){int flag 0;while (all _capacity)_capacity * 2, flag 1;if (flag){char* tem _str;_str new char[_capacity];strcpy(_str, tem);}}reserve如果是缩小的话不影响空间不影响数据 resize如果是缩小的话影响空间影响数据 substr string substr(size_t start0, size_t nnpos) const{string ans;//临时变量不能返回引用if (start _size) return ans;for (int i start; i start n i _size; i)ans.push_back(_str[i]);return ans;}在使用substr的时候string ans是临时变量不能返回引用虽然string内部的数组是动态开辟的但是函数结束的时候就会自动调用析构函数释放空间