区分C++中的&和&&

 更新时间:2020年09月10日 11:49:46   作者:tlanyan  
这篇文章主要介绍了如何区分C++的&和&&,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下

c++的&和&&是两个常用且容易让人混淆迷惑的运算符,其中&符号有三种用途,&&有两种。本文对这两个运算符的用途做简要总结。

&的用途

第一种用途:位运算中的“与”(AND)。位运算十分高效,数据分片时常会用到,例如网络数据报头、IP地址段、UTF-8编码等。

第二种用途:取地址。这个功能在C中比较常见,比如取函数地址、变量地址。用法示例:

int b = 10;
int *a = &b; // a指针指向b的存储地址

// 声明函数
int add(int a, int b) {return a + b}
// 声明函数指针类型
int (*functionPtr)(int, int);
// 声明和初始化指针, &取函数的地址
functionPtr addPtr = &add;

第三种用途:引用。这个功能是C++的补充,常用在函数传参(C中一般用指针)、临时变量引用等。用法示例:

// 声明v1和v2两个参数引用传递
template <typename T>
T product(const std::vector<T>& v1, const std::vector<T>& v2) {...}

std::vector<std::vector<int> > vecs(10);
// 引用取出数组里的值,避免复制
auto& vec = vecs[0];

可以看到,三种用法都很基础,使用上很简单。

&&的用途

第一种用途:“与”(AND)逻辑运算符。做条件判断时,&&常用来连接多个条件。

第二种用途:右值引用,这个功能自C++11起才可用。移动语义是C++11新增的重要功能,其重点是对右值的操作。右值可以看作程序运行中的临时结果,右值引用可以避免复制提高效率。&&用法示例:

#include <iostream>
struct Foo {
 ~Foo() {std::cout << "destruction" << std::endl;}
};

Foo FooFactory() {
 return Foo();
}

int main() {
 std::cout << "before copy constructor..." << std::endl;
 Foo foo1 = FooFactory();
 std::cout << "after copy constructor..." << std::endl << std::endl;
 // 引用右值,避免生成新对象
 Foo&& foo2 = FooFactory();
 std::cout << "life time ends!" << std::endl << std::endl;

 return 0;
}

clang编译器(加-fno-elide-constructors选项)编译上述代码, 运行结果如下:

before copy constructor...
destruction
destruction
after copy constructor...

destruction
life time ends!

destruction
destruction

从输出结果看,第二种写法少了一次destruction输出。这意味着通过右值引用(&&),foo2直接引用FooFactory返回的对象,避免了对象复制。

注意: 由于“复制省略(Copy elision)”优化技术,一些编译器输出可能与上述不同。例如g++编译器会略过临时对象复制以优化性能。g++ 4.8.5编译程序输出结果如下:

before copy constructor...
after copy constructor...

life time ends!

destruction
destruction

clang编译的结果对比,省去了三次临时对象的生成、析构。

参考

https://stackoverflow.com/questions/13099603/c11-move-constructor-not-called-default-constructor-preferred

以上就是区分C++的&和&&的详细内容,更多关于C++ &和&&的资料请关注脚本之家其它相关文章!

相关文章

  • C语言编程银行ATM存取款系统实现源码

    C语言编程银行ATM存取款系统实现源码

    这篇文章主要为大家介绍了C语言编程银行ATM存取款系统实现的源码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • C++解析Json的方法详解【jsoncpp】

    C++解析Json的方法详解【jsoncpp】

    这篇文章主要介绍了C++解析Json的方法,结合实例形式分析了C++操作json格式数据的相关实现技巧与注意事项,需要的朋友可以参考下
    2017-06-06
  • C语言实现登录注册和忘记密码功能

    C语言实现登录注册和忘记密码功能

    这篇文章主要为大家详细介绍了C语言实现登录、注册和忘记密码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++ 将文件数据一次性加载进内存实例代码

    C++ 将文件数据一次性加载进内存实例代码

    这篇文章主要介绍了C++ 将文件数据一次性加载进内存实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • VS2022新建项目时没有ASP.NET Web应用程序(.NET Framework)

    VS2022新建项目时没有ASP.NET Web应用程序(.NET Framework)

    本文主要介绍了VS2022新建项目时没有ASP.NET Web应用程序的解决,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • C++ CopyFile,MoveFile用法案例详解

    C++ CopyFile,MoveFile用法案例详解

    这篇文章主要介绍了C++ CopyFile,MoveFile用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 关于C语言 const 和 define 区别

    关于C语言 const 和 define 区别

    这篇文章主要介绍了关于C语言 const 和 define 区别 的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09
  • C++ decltype用法举例说明

    C++ decltype用法举例说明

    decltype是C++11添加的一个新的关键字,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式的值,今天通过本文给大家介绍C++ decltype用法,通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-07-07
  • C++中的extern声明变量详解

    C++中的extern声明变量详解

    这篇文章主要介绍了C++中的extern声明变量详解,本文讲解了声明和定义、extern声明全局变量、extern声明函数等内容,需要的朋友可以参考下
    2015-03-03
  • C++ const关键字的实例用法

    C++ const关键字的实例用法

    在本篇文章里小编给大家整理的是一篇关于C++ const关键字的实例用法,需要的朋友们可以学习下。
    2020-02-02

最新评论