C++20练习代码
一.类的定义练习类的基本操作1.1String类定义完成了String类的基本操作的定义并进行检验。其中有些注意点1.显示类型转换static_cast();2.NRVO:具名返回值优化编译器会直接消除掉 result 这个局部变量的存在感直接在外部调用者接收返回值的地方构造对象。零拷贝零额外的析构效率极高。 这在 C17 中甚至被写入了语言标准强制 RVO保证一定不会发生拷贝。3.strlenchar*、strcpy(char*,char*)//赋值第二个字符串到第一个字符串中、strcmp(char*,char*)//一一比较两个字符串的每个字符的ASCII码strcat(char*,char*)//追加第二个字符串到第一个字符串后面。4.stong_ordering::(less\greater\equal)重载函数时使用非常标准。5.new,delete;new[],delete[];malloc,free成对使用绝不可混搭。6.noexcept 指明函数绝不会返回报错7.std::move()用作移动语义#define _CRT_SECURE_NO_WARNINGS #includecstring #includeiostream #includecompare class String { public: //默认构造函数 String() { size 0; ch new char[1]; ch[0] 0; } //赋值构造函数 String(const char* c) { if (c) { size static_castint(std::strlen(c)); ch new char[size1]; std::strcpy(ch, c); } else { size 0; ch new char[1]; ch[0] \0; } } String(const String c)//拷贝构造函数 { size c.size; ch new char[size 1]; std::strcpy(ch, c.ch); } //移动构造函数 String(Strings)noexcept//告诉编译器这个过程绝不会抛出异常 { ch s.ch; size s.size; std::cout 调用了移动构造\n; s.ch nullptr; s.size 0; } ~String() { delete[] ch;//析构数组 } //拷贝赋值运算符 String operator(const String s) { if (this ! s) {//两阶段解析机制但这里是两个指针在进行比较。 delete[] ch; size s.size; std::strcpy(ch, s.ch); } return *this; } //移动赋值运算符 String operator(String s) noexcept { if (this ! s) { delete[]ch; ch s.ch; size s.size; std::cout 调用了移动构造\n; s.ch nullptr; s.size 0; } return *this; } String operator(const char* s) { if (s) { delete[] ch; size static_castint(std::strlen(s)); ch new char[size 1]; std::strcpy(ch, s); } return *this; } //重载 String operator(const char* c) { String result;//默认构造函数 if (c) { result.size this-size static_castint(std::strlen(c)); delete[] result.ch; result.ch new char[result.size 1]; std::strcpy(result.ch, this-ch); std::strcat(result.ch, c);//追加 } else { result *this; } return result;//NRVO(具名返回值优化编译器会直接消除掉 result 这个局部变量的存在感直接在外部调用者接收返回值的地方构造对象。零拷贝零额外的析构效率极高。 这在 C17 中甚至被写入了语言标准强制 RVO保证一定不会发生拷贝。) } //重载两个String类相加 String operator(const String s)const { String result; result.size size s.size; delete[] result.ch; result.ch new char[result.size 1]; std::strcpy(result.ch, ch); std::strcat(result.ch, s.ch); return result; } //实现将一个String类与一个C风格字符串相加 std::strong_ordering operator(const String S) const { int cmp std::strcmp(this-ch, S.ch);//将字符一个个比较 if (cmp 0) { return std::strong_ordering::less; } if (cmp 0) { return std::strong_ordering::greater; } return std::strong_ordering::equal; } bool operator(const String S) const { return std::strcmp(this-ch, S.ch) 0; } //返回底层C风格字符串 const char* c_str()const { return ch; } //返回字符串长度 int length()const { return size; } private: int size; char* ch; }; int main() { String s1; String s2{ Hello }; String s3{ s2 }; s1 World; String s4 s2 C; String s5 { Good }; String s6 { morning }; String s7 s5 s6; String s8{ keepworking }; String s9 std::move(s8);//移动构造 String s10{ realword }; s8 std::move(s10); std::cout s2: s2.c_str() std::endl; std::cout s1: s1.c_str() std::endl; std::cout s4: s4.c_str() std::endl; std::cout s7: s7.c_str() std::endl; std::cout s9: s9.c_str() std::endl; std::cout s8: s8.c_str() std::endl; if ((s2 s1) std::strong_ordering::less) { std::cout s2.c_str() is less than s1.c_str() std::endl; } return 0; }1.2.Vector类二.类的继承及多态练习三.模板练习3.1类模板3.2模板函数3.3模板对象lambda3.4模板变量3.5别名3.6编译时if(if constexpr)四.类型转换练习五.错误处理练习六.
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2584936.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!