IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]win编程实践(5)【c++】- 右值引用

    u010255642发表于 2015-11-30 21:40:26
    love 0

    右值引用形式:类型 && a= 被引用的对象。

    与左值引用&的区别在于:右值是临时变量, 可理解为右值的引用,右值初始化后临时变量消失。

    从实践角度讲,它能够完美解决C++中长久以来为人所诟病的临时对象效率问题。从语言本身讲,它健全了C++中的引用类型在左值右值方面的缺陷。从库设计者的角度讲,它给库设计者又带来了一把利器。从库使用者的角度讲,不动一兵一卒便可以获得“免费的”效率提升…

    在标准C++语言中,临时量(术语为右值,因其出现在赋值表达式的右边)可以被传给函数,但只能被接受为const &类型。这样函数便无法区分传给const &的是真实的右值还是常规变量。而且,由于类型为const &,函数也无法改变所传对象的值。C++0x将增加一种名为右值引用的新的引用类型,记作typename &&。这种类型可以被接受为非const值,从而允许改变其值。这种改变将允许某些对象创建转移语义。比如,一个std::vector,就其内部实现而言,是一个C式数组的封装。如果需要创建vector临时量或者从函数中返回vector,那就只能通过创建一个新的vector并拷贝所有存于右值中的数据来存储数据。之后这个临时的vector则会被销毁,同时删除其包含的数据。有了右值引用,一个参数为指向某个vector的右值引用的std::vector的转移构造器就能够简单地将该右值中C式数组的指针复制到新的vector,然后将该右值清空。这里没有数组拷贝,并且销毁被清空的右值也不会销毁保存数据的内存。返回vector的函数现在只需要返回一个std::vector<>&&。如果vector没有转移构造器,那么结果会像以前一样:用std::vector<> &参数调用它的拷贝构造器。如果vector确实具有转移构造器,那么转移构造器就会被调用,从而避免大量的内存分配。


    本博客所有内容是原创,如果转载请注明来源

    http://blog.csdn.net/myhaspl/


    右值引用

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
    //code:http://blog.csdn.net/myhaspl


    #include "stdafx.h"
    #include <iostream>
    using std::endl;
    using std::cout;
    using std::cin;


    class Mypoint{
    public:
    int n_x = 0;
    int n_y = 0;
    //code:http://blog.csdn.net/myhaspl
    Mypoint(int x, int y) {
    n_x = x;
    n_y = y;
    cout << n_x << "," << n_y;
    cout << "  create!" << endl;
    }
    Mypoint(const Mypoint &myp) {
    n_x = myp.n_x;
    n_y = myp.n_y;
    cout << n_x << "," << n_y;
    cout << "  拷贝构造函数调用!" << endl;
    }
    Mypoint(Mypoint &&myp) {
    n_x = myp.n_x;
    n_y = myp.n_y;
    cout << n_x << "," << n_y;
    cout << "  move拷贝构造函数调用!" << endl;
    }
    ~Mypoint() {
    cout << n_x << "," << n_y;
    cout << "  delete!" << endl;
    }
    };


    int mydistance(const Mypoint &p1, const Mypoint &p2) {
    cout << "Mypoint& distance!" << endl;
    return static_cast<int>(sqrt((p2.n_x - p1.n_x)*(p2.n_x - p1.n_x) + (p2.n_y - p1.n_y)*(p2.n_y - p1.n_y)));
    }






    int mydistance(Mypoint &&p1, Mypoint &&p2) {
    cout << "Mypoint&& distance!" << endl;
    return static_cast<int>(sqrt((p2.n_x - p1.n_x)*(p2.n_x - p1.n_x) + (p2.n_y - p1.n_y)*(p2.n_y - p1.n_y)));
    }




    int main()
    {
    int x = 10;
    int y = 100;
    char temp = ' ';
    int &xleftptr = x;
    xleftptr = 20;
    cout << xleftptr << endl;




    Mypoint myp1= Mypoint(10,20);
    Mypoint myp2 = Mypoint(100, 200);
    Mypoint myp3 = Mypoint(88, 99);
    Mypoint lp3 = myp3;
    Mypoint &lp1 = myp1;
    Mypoint &lp2 = myp2;
    //---左值引用
    cout << "左值引用result:" << mydistance(myp1, myp2) << endl;
    //---右值引用
    cout <<"右值引用result:"  << mydistance(Mypoint(110, 220), Mypoint(1100, 2200)) << endl;
    cin >> temp;
    return 0;
    }




    本博客所有内容是原创,如果转载请注明来源

    http://blog.csdn.net/myhaspl/





    20
    10,20  create!
    100,200  create!
    88,99  create!
    88,99  拷贝构造函数调用!
    Mypoint& distance!
    左值引用result:201
    1100,2200  create!
    110,220  create!
    Mypoint&& distance!
    右值引用result:2213
    110,220  delete!
    1100,2200  delete!

    本博客所有内容是原创,如果转载请注明来源

    http://blog.csdn.net/myhaspl/






沪ICP备19023445号-2号
友情链接