C++11:右值引用和转移赋值
1、左值與右值的區別:
左值:能別賦值的值;能取到地址的值,用&能取到地址,具有持久性;
右值:臨時變量;不能用&取到地址;只是字面常量值
2、右值引用
一般用的是左值引用,用&標識
右值引用通過&&獲得,只能綁定到將要銷毀的對象
如下例子:在代碼里面進行了標識:
?
class MemoryBlock {
public:
????//構造器
????explicit MemoryBlock(int length) : length_(length), data_(new int[length]()) {
????}
?
????virtual ~MemoryBlock() {
????????if (data_) {
????????????delete[] data_;
????????????data_ = nullptr;
????????}
????}
????//拷貝構造,左值引用
????MemoryBlock(const MemoryBlock &src) : length_(src.length_), data_(new int[src.length_]()){
????????std::copy(src.data_, src.data_+length_, data_);
????}
?
?????//普通的賦值,左值引用
????MemoryBlock& operator=(const MemoryBlock &src) {
????????if (this != &src) {
????????????delete[] data_;
?
????????????length_ = src.length_;
????????????data_ = new int[length_]();
????????????std::copy(src.data_, src.data_+length_, data_);
????????}
????????return *this;
????}
?
????//移動構造器,右值引用
????MemoryBlock(MemoryBlock&&?src) : length_(src.length_),data_(src.data_)?noexcept??{
????????src.length_ = 0;
????????src.data_ = nullptr;
????}
?
????//移動賦值
????MemoryBlock& operator=(MemoryBlock &&src)?noexcept??{
????????if (this != &src) {
????????????delete[] data_;
?
????????????length_ = src.length_;
????????????data_ = src.data_;
?
????????????//將傳入的參數設置為空?釋放傳入的數據
????????????src.length_ = 0;
????????????src.data_ = nullptr;
????????}
????????return *this;
????}
?
private:
????int length_;
????int *data_;
};
?
MemoryBlock f() {
????return MemoryBlock(50);
}
?
int main()
{
????std::cout << "11111111" << std::endl;
????MemoryBlock a = f(); ???// 調用構造器
????MemoryBlock b = a; ?????//拷貝構造
????MemoryBlock c = std::move(a);// 移動構造器,移動語義
????a = f(); ???// 調用移動賦值運算符,移動語義
????b = a; ?????// 調用賦值運算符
????c = std::move(a); // 調用移動賦值運算符,移動語義
?
????return 0;
}
????//移動構造器
????MemoryBlock(MemoryBlock&& src) : length_(src.length_),data_(src.data_) ?noexcept?{
????????src.length_ = 0;
????????src.data_ = nullptr;
????}
總結:移動構造、移動賦值僅僅是將原來存在的資源移動到其他的位置。因此其自身的資源將會被釋放。
總結
以上是生活随笔為你收集整理的C++11:右值引用和转移赋值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于java(springboot)餐厅
- 下一篇: python实战项目(Django技术点