C++11右值引用自写测试例子
2015-04-16 13:36
369 查看
#include<iostream> #include<string.h> #include<vector> /* *C++ 11增加一个新的引用(reference)类型称作右值引用(R-value reference), *标记为typename &&。他们能够以non-const值的方式传入,允许对象去改动他们 *而右值引用又是为了实现转移语义,避免内存的拷贝 */ #define null 0 //! 左值 void PrintVal(int& i) { std::cout<<"Left ref:"<<i<<std::endl; } //! 右值 void PrintVal(int&& i) { std::cout<<"Right ref:"<<i<<std::endl; } //! 右值引用实现转移语义 class MyString { public: MyString(const char* str) { if (str == null) { data_ = new char[1]; *data_ = '\0'; } data_ = new char[strlen(str)+1]; strcpy(data_, str); } MyString(const MyString& myString) { std::cout<<"Left val ref:"<<myString.data_<<std::endl; data_ = new char[strlen(myString.data_)]; strcpy(data_, myString.data_); } MyString(MyString&& myString) { std::cout<<"Right val ref:"<<myString.data_<<std::endl; data_ = myString.data_; myString.data_ = null; } const char* c_str() { return data_; } ~MyString() { if (null != data_) { delete[] data_; data_ = null; } } private: char* data_; }; int main(int argc, char const *argv[]) { int val = 6; /* 左值右值引用函数重载 */ PrintVal(val); PrintVal(5); /* 通过右值引用实现转移语义 */ MyString str("str"); MyString str1(str); //! 左值 MyString str2(MyString("str2")); //! 应该是被编译器优化掉了 std::vector<MyString> v; v.push_back(MyString("vec")); //! 这样不会被优化直接调用了右值引用函数,实现了转移语义 MyString str3(std::move(str)); //! 使用std::move强行右值 return 0; }
运行结果:
Left ref:6
Right ref:5
Left val ref:str
Right val ref:vec
Right val ref:str
请按任意键继续. . .
相关文章推荐
- C++11 右值引用简化代码的例子
- C++11的右值引用
- C++11右值引用和std::move语句实例解析(推荐)
- C++ 的新标准 C++11:右值引用与转移语义
- 【C++11新概念】:右值引用
- C++11 中的右值引用与转移语义
- C++11右值引用:移动语义和完美转发
- c++11之左值引用和右值引用
- C++11右值引用和std::move语句实例解析
- C++11 右值引用左值引用详解
- C++11新特性:右值引用和转移构造函数
- C++11:深入右值引用,move语义和完美转发
- C++11中的右值引用及move语义编程
- C++11中的右值引用及move语义编程
- C++11 右值引用和转移语义
- C++11 标准新特性: 右值引用与转移语义
- 深入浅出C++11(3) -- 右值引用和move语义
- [C++11]左值、右值、左值引用、右值引用小结
- 【转】C++11 标准新特性: 右值引用与转移语义
- c++11 右值引用