实验测试1《C++ Primer》第五版——第十三章 拷贝控制
2017-12-02 21:37
381 查看
String.h
#ifndef STRING_H #define STRING_H #include <cstring> #include <algorithm> #include <cstddef> #include <iostream> #include <iostream> #include <memory> using namespace std; class String { friend String operator+(const String&, const String&); friend ostream &operator<<(std::ostream&, const String&); public: String() : sz(0), p(nullptr) { } String(const char *cp) : sz(std::strlen(cp)), p(a.allocate(sz)) { cout << "String(const char *cp)" << endl; uninitialized_copy(cp, cp + sz, p); } String(const String &s) : sz(s.sz), p(a.allocate(s.sz)) { cout << "String(const String &s)" << endl; uninitialized_copy(s.p, s.p + sz, p); } String(String &&s) : sz(s.sz), p(s.p) { cout << "String(String &&s)" << endl; s.p = nullptr; s.sz = 0; } ~String() { cout << "~String()" << endl; if (p) a.deallocate(p, sz); } String &operator=(const String &); String &operator=(String&&); String &operator=(const char*); const char *begin() { return p; } const char *begin() const { return p; } const char *end() { return p + sz; } const char *end() const { return p + sz; } size_t size() const { return sz; } void swap(String &s) { char *tmp = p; p = s.p; s.p = tmp; size_t cnt = sz; sz = s.sz; s.sz = cnt; } private: size_t sz; char *p; static allocator<char> a; }; #endif /* STRING_H */
String.cpp
#include "String.h" std::allocator<char> String::a; String &String::operator=(const String &s) { cout << "operator=(const String &s)" << endl; char *newp = a.allocate(s.sz); uninitialized_copy(s.p, s.p + s.sz, newp); if (p) a.deallocate(p, sz); p = newp; sz = s.sz; return *this; } String &String::operator=(String &&s) { cout << "operator=(String &&s)" << endl; if (p) a.deallocate(p, sz); p = s.p; sz = s.sz; s.p = nullptr; s.sz = 0; return *this; } String &String::operator=(const char *cp) { cout << "operator=(const char *cp)" << endl; if (p) a.deallocate(p, sz); p = a.allocate(sz = strlen(cp)); uninitialized_copy(cp, cp + sz, p); return *this; } ostream &operator<<(ostream &os, const String &s) { const char *p = s.begin(); while (p != s.end()) os << *p++ ; return os; } String operator+(const String &lhs, const String &rhs) { String ret; ret.sz = rhs.size() + lhs.size(); ret.p = String::a.allocate(ret.sz); uninitialized_copy(lhs.begin(), lhs.end(), ret.p); uninitialized_copy(rhs.begin(), rhs.end(), ret.p + lhs.sz); return ret; }
main.cc
#include "String.h" using namespace std; int main(int argc, char* argv[]) { allocator<String> alloc; auto const p = alloc.allocate(4); String s1("String1"); String s2 = s1; String s3 = move(s1); String s4(move(s2)); cout << "s1:" << s1 << endl; cout << "s2:" << s2 << endl; cout << "s3:" << s3 << endl; cout << "s4:" << s4 << endl; return 0; }
输出结果
String(const char *cp) String(const String &s) String(String &&s) String(String &&s) s1: s2: s3:String1 s4:String1 ~String() ~String() ~String() ~String()
相关文章推荐
- c++ primer(第五版)笔记 第十三章(2) 拷贝控制
- c++ primer(第五版)笔记 第十三章(3) 拷贝控制
- 读书笔记《C++ Primer》第五版——第十三章 拷贝控制
- c++ primer(第五版)学习笔记及习题答案代码版(第十三章)拷贝控制
- c++ primer(第五版)笔记 第十三章(1) 拷贝控制
- 《C++ Primer》读书笔记第十三章-2-拷贝控制、交换、动态内存管理类
- C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁
- c++primer(第五版) 第十三章 拷贝控制习题答案
- C++ Primer : 第十三章 : 拷贝控制之对象移动
- C++ primer第五版_拷贝控制
- 《C++ Primer》读书笔记——第十三章_拷贝控制
- C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理
- c++ primer 概念总结第十三章 拷贝控制
- C++ Primer : 第十三章 : 拷贝控制示例
- C++primer第五版笔记-第十三章拷贝控制
- 《C++primer(第五版)》学习之路-第十三章:拷贝控制
- c++primer第十三章拷贝控制小结-13
- 《C++ Primer》读书笔记 第13章:拷贝控制
- c++ primer(第五版)笔记 第十三章(4) string 类和 vector<string> 容器的简单实现
- C++ Primer 【第四版】第十三章 复制控制