一个自己实现的string
2024-09-28 16:23:03
最近实现了一个string类,添加了一些c++11元素。
除了基本的构造析构函数,拷贝构造和赋值函数,另外添加移动拷贝和赋值函数。default是一个很方便的特性有木有。
//default constructor
KianString()=default; KianString(const char *c): ch_() {
ch_ = (char*)malloc(sizeof(char)*(strlen(c)+));
strncpy(ch_, c, strlen(c)+);
}; ~KianString(){
free(ch_);
} //copy constructor
KianString(const KianString &str){
ch_ = (char*)malloc(sizeof(char)*(str.size()+));
strncpy(ch_, str.ch_, str.size()+);
} //assign operator, is ok for both lvalue and rvalue!
KianString &operator=(KianString str) noexcept {
swap(*this, str);
return *this;
} //move constructor
KianString(KianString &&str) noexcept : ch_(str.ch_) {
str.ch_ = NULL;
}
赋值拷贝采用了copy and swap idiom:
inline void swap(KianString &str1, KianString &str2){
using std::swap;
swap(str1.ch, str2.ch);
} //assign operator, is ok for both lvalue and rvalue!
KianString &operator=(KianString str) noexcept {
swap(*this, str);
return *this;
}
这样做有几个好处:
1.参数是传值调用,可以同时使用左值和右值,使用右值时自动调用移动拷贝函数
2.强异常安全的,异常只会发生在参数拷贝时,如果发生异常,不会影响this。
3.值传递产生副本,所以自赋值也是正确的.
加法运算符重载:
KianString &operator+=(const KianString &str){
ch = (char*)realloc(ch, strlen(ch)+str.size()+);
strcat(ch, str.ch);
return *this;
} template<typename T>
const T operator+(const T& lhs, const T& rhs) {
return T(lhs) += rhs;
}
1. 按照《c++编程规范》第27条,实现+运算符,先要实现+=,语义一致,便于维护
2. 将operator+定义为非成员函数,能够同时接受左右参数的隐式转换, 因为operator+=是public,所以operator+不需要设成friend。
3. 将operator+定义为template。
code:
https://github.com/coderkian/kianstring
最新文章
- PHP 多维数组 Key Value的使用
- scala 学习:object 和class, trait
- OpenWRT 路由配置技巧
- Linux fdisk命令参数及用法详解---Linux磁盘分区管理命令fdisk
- Swift - 数字格式化转成字符串(保留两位小数)
- Java中的statickeyword具体解释
- 项目分享:通过使用SSH框架的公司-学员关系管理系统(CRM)
- 收藏了4年的Android 源码分享
- 基于Spring注解搭建SpringMVC项目
- 6993: Dominoes(纯bfs)
- Nginx location配置详解
- 剑指Offer_编程题_4
- WebStorm记录(3)
- JavaWeb中过滤器Filter的使用示例
- super和this关键字
- SVN服务器多个项目的权限分组管理
- 深入浅出TCP之listen
- 共享内存system v(未编译)
- JAVAWEB servlet验证登录时进行完全的非空判断防止空值登录
- iOS获取设备卸载后不变的UUID