C++11新特性② | 左值、左值引用、右值与右值引用
目录
1、引言
2、值类别及相关概念
3、左值、右值
4、左值引用、右值引用
5、移动语义
5.1、为什么需要移动语义
5.2、移动语义定义
5.3、转移构造函数
5.4、转移赋值函数
6、标准库函数 std::move
7、完美转发 std::forward
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)
https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)
https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)
https://blog.csdn.net/chenlycly/category_11931267.html C++11新特性很重要,作为C++开发人员很有必要去学习,不仅笔试面试时会涉及到,开源代码中会大规模的使用。以很多视频会议及直播软件都在使用的开源WebRTC项目为例,WebRTC代码中大篇幅地使用了C++11及以上的新特性,要读懂其源码,必须要了解这些C++的新特性。所以,接下来一段时间我将结合工作实践,给大家详细讲解一下C++11的新特性,以供借鉴或参考。
1、引言
C++11引入了对象移动的概念,是一种移动而非拷贝对象的能力,移动对象可以有效地提高程序的性能。
为了支持移动操作,C++11引入了一种新的引用类型 - 右值引用(rvalue references)。所谓右值引用,是必须要绑定到右值的引用,通过&&操作符获得右值引用。今天就来详细讲讲左值、左值引用、右值、右值引用相关的内容。
2、值类别及相关概念
在C++11中,值类别主要分为左值、左值引用、右值与右值引用。左值引用是绑定到左值的应用,右值引用则是绑定到右值的引用。当右值引用T&&出现在模板函数的参数中,T是模板类型,T&&则是万能引用。万能引用可以接收左值参数,也可以接收右值参数。然后在推导函数参数类型时,可能会发生引用折叠。还会涉及到标准库函数std::move和std::forward。
3、左值、右值
在C语言中,我们常常会提起左值(lvalue)、右值(rvalue)这样的称呼。一个最为典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则称为“右值”。如:
int b = 1;
int c = 2;
int a = a + b;
在这个赋值表达式中,a就是一个左值,而b + c则是一个右值。
不过C++中还有一个被广泛认同的说法,那就是可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。那么这个加法赋值表达式中,&a是允许的操作,但&(b + c)这样的操作则不会通过编译。因此a是一个左值,(b + c)是一个右值。相对于左值,右值表示字面常量、表达式、函数的非引用返回值等。
这里总结一下,什么是左值:
1)能被赋值(充分非必要条件),左值不一定能被赋值,比如const变量,智能在初始化时赋初值,后续不能赋值
2)能取址(充分非必要条件),左值不一定能取址,比如C语言中的register变量:register int i= 3,C++11已经取消了对register的支持,编译时会忽略。再比如C语言中的位域变量是不能取址的:
struct St{ int m:3;} St st; st.m = 3; 指定int型成员m占3个字节。
3)可以初始化左值引用(必要不充分条件),左值可以初始化左值引用,比如:int m = 3; int& n = m;,右值不能初始化左值引用,比如:const int& m = 3; 因为3是右值,不能初始化左值引用,所以编译会报错。
4)字面量属于纯右值,比如1,2,3等立即数就属于字面量,注意,常量字符串“xyz”是左值,可以对该字符串进行取址,即&"xyz"。
5)将亡值可以偷其中的资源。函数的返回值,则是纯右值,返回右值引用,比如std::move函数。
4、左值引用、右值引用
左值引用是对一个左值进行引用的类型,右值引用则是对一个右值进行引用的类型。左值引用和右值引用都是属于引用类型。无论是声明一个左值引用还是右值引用,都必须立即进行初始化。而其原因可以理解为是引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名。
左值引用是具名变量值的别名,而右值引用则是不具名(匿名)变量的别名。
左值引用示例:
int &a = 2; // 左值引用绑定到右值,编译失败, err
int b = 2; // 非常量左值
const int &c = b; // 常量左值引用绑定到非常量左值,编译通过, ok
const int d = 2; // 常量左值
const int &e = c; // 常量左值引用绑定到常量左值,编译通过, ok
const int &b = 2; // 常量左值引用绑定到右值,编程通过, ok
“const 类型 &”为 “万能”的引用类型,它可以接受非常量左值、常量左值、右值对其进行初始化;
右值引用,使用&&表示:
int && r1 = 22;
int x = 5;
int y = 8;
int && r2 = x + y;
T && a = ReturnRvalue();
通常情况下,右值引用是不能够绑定到任何的左值的:
int c;
int && d = c; //err
下面看一个测试示例:
void process_value(int & i) //参数为左值引用
{cout << "LValue processed: " << i << endl;
}void process_value(int && i) //参数为右值引用
{cout << "RValue processed: " << i << endl;
}int main()
{int a = 0;process_value(a); //LValue processed: 0process_value(1); //RValue processed: 1return 0;
}
5、移动语义
5.1、为什么需要移动语义
右值引用是用来支持转移语义的。转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。
转移语义是和拷贝语义相对的,可以类比文件的剪切与拷贝,当我们将文件从一个目录拷贝到另一个目录时,速度比剪切慢很多。通过转移语义,临时对象中的资源能够转移其它的对象里。
5.2、移动语义定义
在现有的 C++ 机制中,我们可以定义拷贝构造函数和赋值函数。要实现转移语义,需要定义转移构造函数,还可以定义转移赋值操作符。对于右值的拷贝和赋值会调用转移构造函数和转移赋值操作符。
如果转移构造函数和转移拷贝操作符没有定义,那么就遵循现有的机制,拷贝构造函数和赋值操作符会被调用。普通的函数和操作符也可以利用右值引用操作符实现转移语义。
5.3、转移构造函数
先来看个转移构造函数的实例:
class MyString
{
public:MyString(const char *tmp = "abc"){//普通构造函数len = strlen(tmp); //长度str = new char[len+1]; //堆区申请空间strcpy(str, tmp); //拷贝内容cout << "普通构造函数 str = " << str << endl;}MyString(const MyString &tmp){//拷贝构造函数len = tmp.len;str = new char[len + 1];strcpy(str, tmp.str);cout << "拷贝构造函数 tmp.str = " << tmp.str << endl;}//移动构造函数//参数是非const的右值引用MyString(MyString && t){str = t.str; //拷贝地址,没有重新申请内存len = t.len;//原来指针置空t.str = NULL;cout << "移动构造函数" << endl;}MyString &operator= (const MyString &tmp){//赋值运算符重载函数if(&tmp == this){return *this;}//先释放原来的内存len = 0;delete []str;//重新申请内容len = tmp.len;str = new char[len + 1];strcpy(str, tmp.str);cout << "赋值运算符重载函数 tmp.str = " << tmp.str << endl;return *this;}~MyString(){//析构函数cout << "析构函数: ";if(str != NULL){cout << "已操作delete, str = " << str;delete []str;str = NULL;len = 0;}cout << endl;}private:char *str = NULL;int len = 0;
};MyString func() //返回普通对象,不是引用
{MyString obj("mike");return obj;
}int main()
{MyString &&tmp = func(); //右值引用接收return 0;
}
和拷贝构造函数类似,有几点需要注意:
1)参数(右值)的符号必须是右值引用符号,即“&&”。
2)参数(右值)不可以是常量,因为我们需要修改右值。
3)参数(右值)的资源链接和标记必须修改,否则,右值的析构函数就会释放资源,转移到新对象的资源也就无效了。
有了右值引用和转移语义,我们在设计和实现类时,对于需要动态申请大量资源的类,应该设计转移构造函数和转移赋值函数,以提高应用程序的效率。
5.4、转移赋值函数
直接看转移赋值函数的实例:
class MyString
{
public:MyString(const char *tmp = "abc"){//普通构造函数len = strlen(tmp); //长度str = new char[len+1]; //堆区申请空间strcpy(str, tmp); //拷贝内容cout << "普通构造函数 str = " << str << endl;}MyString(const MyString &tmp){//拷贝构造函数len = tmp.len;str = new char[len + 1];strcpy(str, tmp.str);cout << "拷贝构造函数 tmp.str = " << tmp.str << endl;}//移动构造函数//参数是非const的右值引用MyString(MyString && t){str = t.str; //拷贝地址,没有重新申请内存len = t.len;//原来指针置空t.str = NULL;cout << "移动构造函数" << endl;}MyString &operator= (const MyString &tmp){//赋值运算符重载函数if(&tmp == this){return *this;}//先释放原来的内存len = 0;delete []str;//重新申请内容len = tmp.len;str = new char[len + 1];strcpy(str, tmp.str);cout << "赋值运算符重载函数 tmp.str = " << tmp.str << endl;return *this;}//移动赋值函数//参数为非const的右值引用MyString &operator=(MyString &&tmp){if(&tmp == this){return *this;}//先释放原来的内存len = 0;delete []str;//无需重新申请堆区空间len = tmp.len;str = tmp.str; //地址赋值tmp.str = NULL;cout << "移动赋值函数\n";return *this;}~MyString(){//析构函数cout << "析构函数: ";if(str != NULL){cout << "已操作delete, str = " << str;delete []str;str = NULL;len = 0;}cout << endl;}private:char *str = NULL;int len = 0;
};MyString func() //返回普通对象,不是引用
{MyString obj("mike");return obj;
}int main()
{MyString tmp("abc"); //实例化一个对象tmp = func();return 0;
}
6、标准库函数 std::move
编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数和转移赋值函数,也就是把一个左值引用当做右值引用来使用,怎么做呢?标准库提供了函数 std::move,这个函数以非常简单的方式将左值引用转换为右值引用。
int a;
int &&r1 = a; // 编译失败
int &&r2 = std::move(a); // 编译通过
7、完美转发 std::forward
完美转发适用于这样的场景:需要将一组参数原封不动的传递给另一个函数。“原封不动”不仅仅是参数的值不变,在 C++ 中,除了参数值之外,还有一下两组属性:左值/右值和 const/non-const。完美转发就是在参数传递过程中,所有这些属性和参数值都不能改变,同时,而不产生额外的开销,就好像转发者不存在一样。在泛型函数中,这样的需求非常普遍。
下面举例说明:
#include <iostream>
using namespace std;template <typename T> void process_value(T & val)
{cout << "T &" << endl;
}template <typename T> void process_value(const T & val)
{cout << "const T &" << endl;
}
//函数 forward_value 是一个泛型函数,它将一个参数传递给另一个函数 process_value
template <typename T> void forward_value(const T& val)
{process_value(val);
}template <typename T> void forward_value(T& val)
{process_value(val);
}int main()
{int a = 0;const int &b = 1;//函数 forward_value 为每一个参数必须重载两种类型,T& 和 const T&forward_value(a); // T&forward_value(b); // const T &forward_value(2); // const T&return 0;
}
对于一个参数就要重载两次,也就是函数重载的次数和参数的个数是一个正比的关系。这个函数的定义次数对于程序员来说,是非常低效的。
那C++11是如何解决完美转发的问题的呢?实际上,C++11是通过引入一条所谓“引用折叠”(reference collapsing)的新语言规则,并结合新的模板推导规则来完成完美转发。
typedef const int T;
typedef T & TR;
TR &v = 1; //在C++11中,一旦出现了这样的表达式,就会发生引用折叠,即将复杂的未知表达式折叠为已知的简单表达式
C++11中的引用折叠规则:
TR的类型定义 | 声明v的类型 | v的实际类型 |
T & | TR | T & |
T & | TR & | T & |
T & | TR && | T & |
T && | TR | T && |
T && | TR & | T & |
T && | TR && | T && |
注意,一旦定义中出现了左值引用,引用折叠总是优先将其折叠为左值引用。 C++11中,std::forward可以保存参数的左值或右值特性:
#include <iostream>
using namespace std;template <typename T> void process_value(T & val)
{cout << "T &" << endl;
}template <typename T> void process_value(T && val)
{cout << "T &&" << endl;
}template <typename T> void process_value(const T & val)
{cout << "const T &" << endl;
}template <typename T> void process_value(const T && val)
{cout << "const T &&" << endl;
}//函数 forward_value 是一个泛型函数,它将一个参数传递给另一个函数 process_value
template <typename T> void forward_value(T && val) //参数为右值引用
{process_value( std::forward<T>(val) );//C++11中,std::forward可以保存参数的左值或右值特性
}int main()
{int a = 0;const int &b = 1;forward_value(a); // T &forward_value(b); // const T &forward_value(2); // T &&forward_value( std::move(b) ); // const T &&return 0;
}
相关文章:
![](https://img-blog.csdnimg.cn/3813799ac0d848109d404063de210bb4.png)
C++11新特性② | 左值、左值引用、右值与右值引用
目录 1、引言 2、值类别及相关概念 3、左值、右值 4、左值引用、右值引用 5、移动语义 5.1、为什么需要移动语义 5.2、移动语义定义 5.3、转移构造函数 5.4、转移赋值函数 6、标准库函数 std::move 7、完美转发 std::forward VC常用功能开发汇总(专栏文章…...
![](https://img-blog.csdnimg.cn/9c4d05ef408f4667b6d68d4484551958.png)
Python Opencv实践 - Harris角点检测
参考资料:https://blog.csdn.net/wsp_1138886114/article/details/90415190 import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/chinease_tower.jpg", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#…...
![](https://www.ngui.cc/images/no-images.jpg)
el-upload上传图片到七牛云或阿里云
(1)绑定上传地址,上传数据对象 <el-upload class"upload-demo" :action"uploadUrl" :data"uploadData":on-success"handleSuccess" :file-list"[]" :show-file-list"false"…...
![](https://www.ngui.cc/images/no-images.jpg)
Web jQuery—选择器、样式和效果
jQuery 选择器、样式和效果 代码下载 jQuery 介绍 JavaScript库:即 library,是一个封装好的特定的集合(方法和函数)。从封装一大堆函数的角度理解库,就是在这个库中,封装了很多预先定义好的函数在里面&a…...
![](https://www.ngui.cc/images/no-images.jpg)
Java和Kotlin的Field在继承中的不同表现
Kotlin是一个宣称与Java兼容性较好的语言,但在接触后发现一些技术还是有“概念上”的冲突,本文就记录下两者对象的Field(中文的说法有字段、域、属性、成员变量,下文若出现这些表达,指的都是这个东西)在继承…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL 子查询
文章目录 1.简介2.优势3.分类3.1 标量子查询3.2 行子查询3.3 列子查询IN 操作符ALL 操作符ANY/SOME 操作符 3.4 表子查询 4.关联子查询5.EXISTS 和 NOT EXISTS6.横向派生表7.附录参考文献 1.简介 子查询是另一个语句中的 SELECT 语句。 子查询也称为内查询(Inner …...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu离线或在线安装CMake
首先下载适用于Ubuntu的CMake安装包,可以去官网下载,也可以通过下面的命令下载(需要联网): wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz将下载的安装包进行解压: tar -xvzf cmake-3.22.1.ta…...
![](https://www.ngui.cc/images/no-images.jpg)
后端面试话术集锦第 十七 篇:MySQL面试话术
这是后端面试集锦第十七篇博文——MySQL面试话术❗❗❗ 1. 解释一下单列索引和联合索引 单列索引是指在表的某一列上创建索引。 联合索引是在多个列上联合创建索引。 单列索引可以出现在where条件的任何位置,而联合索引需要按照一定的顺序来写。在多条件查询的时候,联合索引…...
![](https://www.ngui.cc/images/no-images.jpg)
< 文件资源管理器 > 和 < 此电脑 > 有什么区别?
“文件资源管理器”和 “此电脑” 的区别 1. 文件和文件夹管理:2. 访问存储设备:3. 搜索功能:4. 视图和排序选项:5. 快速访问: 主要的区别1. 界面和用途:2. 显示内容:3. 导航: 在Win…...
![](https://img-blog.csdnimg.cn/116bb0b5d80e4de28be6cd1701de9ad9.png)
线上问诊:可视化展示
系列文章目录 线上问诊:业务数据采集 线上问诊:数仓数据同步 线上问诊:数仓开发(一) 线上问诊:数仓开发(二) 线上问诊:数仓开发(三) 线上问诊:可视化展示 文章目录 系列文章目录前言一、全流程调度1.生产新…...
![](https://img-blog.csdnimg.cn/985e4f50a23a469298b0559334e79da3.jpeg)
如何选择合适的HTTP代理服务器
HTTP代理服务器是一种常见的网络代理方式,它可以帮助用户隐藏自己的IP地址,保护个人隐私和安全。然而,选择合适的HTTP代理服务器并不容易,需要考虑多个因素。本文将介绍如何选择合适的HTTP代理服务器。 了解代理服务器的类型 HTT…...
![](https://img-blog.csdnimg.cn/362421a2e0c24ee98a065ec0a725e0aa.png)
Car Window Control Reset
大众汽车窗口自动升降失效,重置: 扣住5秒,重启汽车,试一下车钥匙,和再重试这个按钮,扣一下试一试...
![](https://www.ngui.cc/images/no-images.jpg)
序列号序列号
主板序列号 string str;str bios.GetSystemSerialNumber(); //wentai//str1 bios.GetSystemECSerialNumber();//CLogHelp::ITCLog(str1);LocalSN str.c_str();str bios.GetSystemVersion();LocalMode str.c_str();string str1;str1 bios.GetSystemSerialNumber();CLogHe…...
![](https://img-blog.csdnimg.cn/4bc2d7ba7aa94401a6159724932ee350.png)
SSM(Spring-Mybatis-SpringMVC)
文章目录 1. 介绍1.1 概念介绍 2 SSM整合框架3. SSM功能模块开发4 测试4.1 业务层接口测试4.2 表现层接口测试 5.优化 -表现层数据封装6.异常处理 1. 介绍 1.1 概念介绍 SSM项目是指基于SpringSpringMVCMyBatis框架搭建的Java Web项目。 Spring是负责管理和组织项目的IOC容器和…...
![](https://img-blog.csdnimg.cn/e30cb5e047b64e62811af1e37288fff9.png)
MySQL——数据的删除以及MySQL中的约束
删除数据 删除表中的一行数据,也必须加上 WHERE条件,否则整列的数据都会被删除。删除语句: delete from 表名 where 条件; 他会将所有的符合条件的数据删除,如果不写条件,则表中的数据全部删除: 如果不添…...
![](https://img-blog.csdnimg.cn/7201e6d17b1943d6a1bd374b9731e0f6.png)
静态路由 网络实验
静态路由 网络实验 拓扑图初步配置R1 ip 配置R2 ip 配置R3 ip 配置查看当前的路由表信息查看路由表信息配置静态路由测试 拓扑图 需求:实现 ip 192.168.1.1 到 192.168.2.1 的通信。 初步配置 R1 ip 配置 system-view sysname R1 undo info-center enable # 忽略…...
![](https://img-blog.csdnimg.cn/224004dec8c24719b16c2583d0e703d4.png)
数据结构-01 数据结构基本概念,算法时间复杂度,空间复杂度
0 数据结构概述 四门课的关系 1 绪论 数据对象、数据元素、数据项关系 1.1 数据结构的基本概念 1.2 算法和算法评价 小练习 空间复杂度中的递归调用 n只是传入 n也是数组,计算存储数组flag的空间大小...
![](https://img-blog.csdnimg.cn/df8b0798c6724a2e9a64c18ef25ece50.png)
【Redis】Bitmap 使用及应用场景
前言:bitmap 占用空间小,查询效率高,在一些场景中使用 bitmap 是一个很好的选择。 一、bitmap 相关命令 SETBIT - 设置指定位置的比特值,可以设为 1 或 0 例如 SETBIT key 10 1,将在 key 对应的 bitmap 中第10位设置为…...
![](https://img-blog.csdnimg.cn/24655a2a654b40cdb408d1029268e84f.png)
C#,数值计算——用于积分函数与方法的Stiel类的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Stiel { public class pp : UniVarRealValueFun, RealValueFun { public Stiel st { get; set; } null; public pp() { } public doubl…...
![](https://img-blog.csdnimg.cn/22f56c4c87a840b5b5a942a3cfb70e3e.png)
报错:为什么数组明明有内容但打印的length是0
文章目录 一、问题二、分析三、解决1.将异步改为同步2.设置延迟 一、问题 在日常开发中,for 循环遍历调用接口,并将接口返回的值进行拼接,即push到一个新的数组中,但是在for循环内部是可以拿到这个新的数组,而for循环…...
![](https://img-blog.csdnimg.cn/5d5b45618c88402db9358cabca0b5b0c.png)
go gin gorm连接postgres postgis输出geojson
go gin gorm连接postgres postgis输出geojson 1. 技术环境 go-gin-gorm postgres-postgis go vscode环境安装-智能提示配置 2. 简单实现代码 思路就是:采用原生sql实现查询、更新等,采用gorm的raw来执行sql语句 package mainimport ("fmt"&q…...
![](https://www.ngui.cc/images/no-images.jpg)
4. Java 的线程安全机制之`volatile`
前言:在多线程编程过程中,线程安全是一个非常重要的概念,它有助于保证多线程程序的正确性和健壮性。其中,volatile是实现线程安全的一种方式,保证内存的立马可见,下面将会详细介绍。 文章目录 是什么为什么…...
![](https://img-blog.csdnimg.cn/img_convert/3e0c91fe28593b0d2c3cbc963f09946f.png)
Vue + Element UI前端篇(二):Vue + Element 案例
Vue Element UI 实现权限管理系统 前端篇(二):Vue Element 案例 导入项目 打开 Visual Studio Code,File --> add Folder to Workspace,导入我们的项目。 安装 Element 安装依赖 Element 是国内饿了么公司提…...
![](https://www.ngui.cc/images/no-images.jpg)
Qt5中connect信号槽无效问题 C++
在写QT的组件信号槽时遇到一个问题,我的QspinBox组件用connect连接函数总是无效,解决办法是: 在QT5中推荐使用如下形式连接槽函数: QObject::connect(ui->spinBox,QOverload<int>::of(&QSpinBox::valueChanged),th…...
![](https://img-blog.csdnimg.cn/img_convert/7e7b02dcad5bc401c8f9f609617981a5.png)
服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决
https://blog.csdn.net/zxlyx/article/details/120397006 本文给出一个 TIME_WAIT 状态的 TCP 连接过多的问题的解决思路,非常典型,大家可以好好看看,以后遇到这个问题就不会束手无策了。 问题描述 模拟高并发的场景,会出现批量…...
![](https://img-blog.csdnimg.cn/430fd5b6362d48c281827ddc6a56789d.gif)
【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
![](https://img-blog.csdnimg.cn/d9d4ae9446e94044afd1e9b335537926.png)
肖sir__设计测试用例方法之编写测试用例12
编写测试用例 一、用例模板 案例1: 案例2: 案例3: 二、测试工作重点: 编写测试用例、 执行用例 (依据测试用例) 三、测试流程(h模型) 1、拿到需求 2、编写测试计划(…...
![](https://www.ngui.cc/images/no-images.jpg)
Android 11.0 ota升级之Systemui下拉状态栏quick_settings_tiles_default值减少时更新的功能实现
1.前言 在11.0的系统rom定制化开发中,在定制功能需求中,在进行systemui的下拉状态栏定制以后,当需要ota升级的时候,发现在systemui下拉状态栏的快捷功能键部分去掉的 一些快捷功能并没有减少,这是因为systemui有缓存造成的只有清理缓存或者恢复出厂设置后才正常,所以今天…...
Android Studio中创建java项目
1.创建普通的android工程 2.创建一个module 3.module类型选择java library 4.填写libary和class的名字 5.生成的工程如图所示 6.然后点击Run --- Edit Configurations... 选择Application选项 设置所需要的参数 选中myjavalib后点击OK。然后打开刚创建的lib的gradle 编辑gradl…...
![](https://img-blog.csdnimg.cn/c076038c06544136a4966945995f02a7.png)
冠达管理:“旺季”来临,煤炭板块走高,云煤能源、陕西黑猫涨停
煤炭板块1日盘中发力走高,截至发稿,云煤动力、陕西黑猫涨停,兖矿动力涨超7%,晋控煤业、华阳股份涨超6%,山西焦煤、平煤股份涨超5%。 组织表明,动力大通胀背景下,未来3-5年煤炭供需偏紧的格局仍…...
![](https://img2018.cnblogs.com/blog/573911/201907/573911-20190709173512174-1131800883.png)
网站建设合同附加协议/百度西安分公司地址
1.Configuration有什么用? configuration 2.Spring是如何获取Bean的定义的? 1):通过启动一个AnnotationConfigApplicationContext 来引导这个Configuration 注解的类,比如: AnnotationConfigApplicationCo…...
![](/images/no-images.jpg)
免费的写作网站/百度学术论文查重免费
在一次会议上面, 领导看新来的小张表现不错,便说: "小张啊, 你以前没什么基础, 但是这两个多月就基本上掌握了公司的业务,做的还不错。我觉得你个人的经验对我们以后的招聘很有用,就你个人…...
沈阳网站建设费用/制作网页教程
SLIC与目前最优超像素算法的比较 Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sabine Susstrunk 摘要 近年来,计算机视觉应用越来越依赖超像素,但并不总是清楚什么是良好的超像素算法。为了解现有方法的优点和…...
![](https://img-blog.csdnimg.cn/20210611164549250.gif)
wordpress上传gif/个人引流推广怎么做
Taro.showToast(option) 显示消息提示框 Taro.showToast({title: 成功,icon: success,duration: 2000 })Taro.showModal(option) 显示模态对话框 Taro.showModal({title: 提示,content: 这是一个模态弹窗,success: function (res) {if (res.confirm) {console.log(用户点击…...
![](/images/no-images.jpg)
电影网站建设基本流程/营销思路八大要点
ftp自动验证登录及自动传输文件在我们使用FTP 是都是需要输入用户名和密码进行验证登录,那么有没有不需要输入用户名密码的方法呢,下面请跟随我一起来见证!1、 配置本地用户认证的vsftpd服务:[rootlocalhost ~]# useradd stlong #…...
![](/images/no-images.jpg)
河南手机网站建设多少钱/济南网络推广公司电话
有关枚举我用例子来进行解释说明 一. enum Sex//性别 {MALE,FEMALE,SECRET }; enum Color//颜色 {RED,GREEN,BLUE }; int main() {enum Sex s MALE;enum Color c RED;return 0; }个人理解: enum Sex s ;后面只能跟 MALE,FEMALE,SECRET 防止自己出错。…...