C++ 学习(右值引用, std::move)
2015-12-31 14:24
411 查看
参考:
http://www.cnblogs.com/lebronjames/p/3614773.html
http://www.cnblogs.com/lebronjames/p/3614773.html
1.std::move执行一个无条件的转化到右值。它本身并不移动任何东西; 2.std::forward把其参数转换为右值,仅仅在那个参数被绑定到一个右值时; 3.std::move和std::forward在运行时(runtime)都不做任何事。 #include <iostream> #include <stdio.h> #include <algorithm> #include <stdlib.h> #include <ext/memory> #include <vector> #include <set> #include <string.h> using namespace std; class Quote{ public: string ISBN; double price; Quote() = default; Quote(const string &book, const double p):ISBN(book), price(p){}; virtual Quote* clone() const & { return new Quote(*this); } virtual Quote* clone()&& { return new Quote(std::move(*this)); } public: string isbn() const; virtual double net_price(size_t n) const{ return n * price; } }; class Bulk_quote: public Quote{ private: size_t min_qty = 0; double discount = 0.9; Bulk_quote() = default; Bulk_quote(const string &book, double p, size_t qty, double disc): Quote(book, p), min_qty(qty), discount(disc){}; public : double net_price(size_t cnt) const { if(cnt >= min_qty) return cnt*(1-discount)*price; else return cnt * price; } Bulk_quote *clone() const &{return new Bulk_quote(*this);}; Bulk_quote *clone() const &&{return new Bulk_quote(std::move(*this));}; }; double print_total(ostream &os, const Quote &item, size_t n){ double ret = item.net_price(n); os<<"ISBN :"<<item.isbn() << " # sold: "<<n<<" total due: "<<ret<<endl; return ret; } class Basket{ public : void add_item(const shared_ptr<Quote> &sale){ items.insert(sale); } void add_item(const Quote &sale){ items.insert(shared_ptr<Quote> (sale.clone())); } void add_item(const Quote && sale){ items.insert(shared_ptr<Quote>(std::move(sale).clone())); } double total_receipt(ostream & os) const{ double sum = 0.0; for(auto iter = items.cbegin(); iter != items.cend(); iter = items.upper_bound(*iter)){ sum += print_total(os, **iter, items.count(*iter)); } os<<"Total Sale: "<<sum <<endl; return sum; } private: static bool compare(const shared_ptr<Quote> &lhs, const shared_ptr<Quote> &rhs){ return lhs->isbn() < rhs->isbn(); } std::multiset<shared_ptr<Quote>, decltype(compare)*>items; }; int main() { }
相关文章推荐
- C/C++ 多种方式进行大小写字母转换
- 如何成为一个优秀的高级C++程序员
- C++11中的std::bind
- 大牛建议——C++学习建议
- C++继承、虚继承、虚函数类的大小问题
- 一.C语言:关键字、标识符和注释
- C++ 高性能无锁日志系统
- c++中的继承
- C语言多维数组的声明,引用。---当数组索引值超出数组元素个数会怎么样?
- C++ 学习 (容器与继承)
- 传递闭包计算warshall算法C语言实现
- C语言两数组合并
- C++ function overriding
- Bag of Words cpp实现(stable version 0.01)
- C++面试一
- [转载] Memory Layout of C programs
- 面向对象分析与设计(C++)课堂笔记
- 将Faster RCNN的python demo改成C++ demo
- C++字符串格式化(FormatString)
- PCL库和C++2011兼容问题