13.6.1
2017-02-10 16:50
316 查看
13.45
左值引用一般绑定在左值上
右值引用引用对象将被销毁,对象没有其他用户
13.46
13.47
13.48
左值引用一般绑定在左值上
右值引用引用对象将被销毁,对象没有其他用户
13.46
int f(); vector<int> vi(100); int&& r1 = f(); int& r2 = vi[0]; int& r3 = r1; int&& r4 = vi[0] * f();
13.47
#include <memory> class String { public: String() : String("") { } String(const char *); String(const String&); String& operator=(const String&); ~String(); const char *c_str() const { return elements; } size_t size() const { return end - elements; } size_t length() const { return end - elements - 1; } private: std::pair<char*, char*> alloc_n_copy(const char*, const char*); void range_initializer(const char*, const char*); void free(); private: char *elements; char *end; std::allocator<char> alloc; };
#include <algorithm> #include <iostream> std::pair<char*, char*> String::alloc_n_copy(const char *b, const char *e) { auto str = alloc.allocate(e - b); return{ str, std::uninitialized_copy(b, e, str) }; } void String::range_initializer(const char *first, const char *last) { auto newstr = alloc_n_copy(first, last); elements = newstr.first; end = newstr.second; } String::String(const char *s) { char *sl = const_cast<char*>(s); while (*sl) ++sl; range_initializer(s, ++sl); } String::String(const String& rhs) { range_initializer(rhs.elements, rhs.end); std::cout << "copy constructor" << std::endl; } void String::free() { if (elements) { std::for_each(elements, end, [this](char &c){ alloc.destroy(&c); }); alloc.deallocate(elements, end - elements); } } String::~String() { free(); } String& String::operator = (const String &rhs) { auto newstr = alloc_n_copy(rhs.elements, rhs.end); free(); elements = newstr.first; end = newstr.second; std::cout << "copy-assignment" << std::endl; return *this; }
13.48
#include <vector> #include <iostream> // Test reference to http://coolshell.cn/articles/10478.html void foo(String x) { std::cout << x.c_str() << std::endl; } void bar(const String& x) { std::cout << x.c_str() << std::endl; } String baz() { String ret("world"); return ret; } int main() { char text[] = "world"; String s0; String s1("hello"); String s2(s0); String s3 = s1; String s4(text); s2 = s1; foo(s1); bar(s1); foo("temporary"); bar("temporary"); String s5 = baz(); std::vector<String> svec; svec.reserve(8); svec.push_back(s0); svec.push_back(s1); svec.push_back(s2); svec.push_back(s3); svec.push_back(s4); svec.push_back(s5); svec.push_back(baz()); svec.push_back("good job"); for (const auto &s : svec) { std::cout << s.c_str() << std::endl; } }
相关文章推荐
- mongo学习
- Android Wear 之 WearableListView
- UVA 11082 Matrix Decompressing(最大流)
- HALCON学习一(Halcon函数)
- ELASTIC 5.2部署并收集nginx日志
- JS和${}的一些问题
- linux下将c++编译成so,调用该so文件
- MySql多行数据合并成一行,将字段中的值拼接在一起
- react native安装过程遇到的问题
- 国外程序员整理的Java资源大全
- ES6常用新特性总结
- 为什么老板利用激励提升在客户现场工作员工的生产力,反而可能降低对客户的价值?
- JAVA--基本数据类型
- VS平台简单的使用C++调用Python3.5的方法
- Java基础13-总结StringBuffer,StringBuilder,数组高级,Arrays,Integer,Character
- 关于恢复万象OL的C盘系统后,重装万象OL后MSDE服务不能启动的解决
- 生成动态报表的Java项目打成.jar包文件运行时出错
- Java基础13-总结StringBuffer,StringBuilder,数组高级,Arrays,Integer,Character
- hadoop v1 和 v2 比较
- 排序算法之直接插入排序