引用传参:
向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
拷贝构造函数/复制构造函数
int a = b;
Line line1(10);
Line line2 = line1; // 这里也调用了拷贝构造函数
Line line2(line1);
可取地址有名字左值(lvalue)与右值(rvalue)
左值与右值的概念其实在C++0x中就有了。概括的讲,凡是能够取地址的可以称之为左值,反之称之为右值,C++中并没有对左值和右值给出明确的定义,从其解决手段来看类似上面的定义,当然我们还可以定义为:有名字的对象为左值,没有名字的对象为右值。
参考:https://www.cnblogs.com/happenlee/p/9337776.html
在C++之中的变量只有左值与右值两种:其中凡是可以取地址的变量就是左值,而没有名字的临时变量,字面量就是右值”。 正是因为这两种变量分别位于=的左右两侧,所以被命名为左值与右值。int c =a+b;a+b返回值是右值不可以取地址,&c可以,c作为变量可以存在=的左侧,而称之为左值,而a+b作为字面量或中间结果,没有办法取得地址,则称之为右值。
在C++之中,使用左值去初始化对象或为对象赋值时,会调用拷贝构造函数或赋值构造函数。而使用一个右值来初始化或赋值时,会调用移动构造函数或移动赋值运算符来移动资源,从而避免拷贝,提高效率。 而将亡值可以理解为通过移动构造其他变量内存空间的方式获取到的值。在确保其他变量不再被使用、或即将被销毁时,来延长变量值的生命期。而实际上该右值会马上被销毁,所以称之为:将亡值
int main()
{
Time test(10,25,12);
Time test2(test);
return 0;
}
int main()
{
Time test(10,25,12);
Time test2(move(test));
return 0;
}
试利用move函数将test强行转化为将亡值,来避免内存重新分配的过程。但是之后我们也无法再访问test对象的内容了,因为都在移动构造函数之中置为了空指针。
i++ // 左值
++i // 右值
i[10][]数组取值返回左值
*i指针取值操作符返回左值
“hello world”字符串字面量返回左值
可以标准库中添加的模板类is_lvalue_reference来判断表达式是否为左值,is_rvalue_reference来判断是否为右值。
cout << is_lvalue_reference<decltype(i[10])>::value << endl;
cout << is_rvalue_reference<decltype(i[10])>::value << endl;
在C++11中,标准库在<utility>中提供了一个有用的函数std::move,std::move并不能移动任何东西,它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);
那我需要怎么把unique_str传递给另外一个unique_str.
禁止拷贝和赋值(底层实现拷贝构造函数和复制构造函数 = delete),可以使用std::move()、unique_ptr.reset(...) 转移对象指针控制权。