高一物理公式 全一些 包括一些符号是啥意思 等 谢谢 物理学得好的童鞋进啊............
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高一物理公式 全一些 包括一些符号是啥意思 等 谢谢 物理学得好的童鞋进啊............相关的知识,希望对你有一定的参考价值。
一、质点的运动(1)------直线运动1)匀变速直线运动
1.平均速度V平=s/t(定义式) 2.有用推论Vt2-Vo2=2as
3.中间时刻速度Vt/2=V平=(Vt+Vo)/2 4.末速度Vt=Vo+at
5.中间位置速度Vs/2=[(Vo2+Vt2)/2]1/2 6.位移s=V平t=Vot+at2/2=Vt/2t
7.加速度a=(Vt-Vo)/t {以Vo为正方向,a与Vo同向(加速)a>0;反向则a<0}
8.实验用推论Δs=aT2 {Δs为连续相邻相等时间(T)内位移之差}
9.主要物理量及单位:初速度(Vo):m/s;加速度(a):m/s2;末速度(Vt):m/s;时间(t)秒(s);位移(s):米(m);路程:米;速度单位换算:1m/s=3.6km/h。
注:
(1)平均速度是矢量;
(2)物体速度大,加速度不一定大;
(3)a=(Vt-Vo)/t只是量度式,不是决定式;
(4)其它相关内容:质点、位移和路程、参考系、时间与时刻〔见第一册P19〕/s--t图、v--t图/速度与速率、瞬时速度〔见第一册P24〕。
2)自由落体运动
1.初速度Vo=0 2.末速度Vt=gt
3.下落高度h=gt2/2(从Vo位置向下计算) 4.推论Vt2=2gh
注:
(1)自由落体运动是初速度为零的匀加速直线运动,遵循匀变速直线运动规律;
(2)a=g=9.8m/s2≈10m/s2(重力加速度在赤道附近较小,在高山处比平地小,方向竖直向下)。
(3)竖直上抛运动
1.位移s=Vot-gt2/2 2.末速度Vt=Vo-gt (g=9.8m/s2≈10m/s2)
3.有用推论Vt2-Vo2=-2gs 4.上升最大高度Hm=Vo2/2g(抛出点算起)
5.往返时间t=2Vo/g (从抛出落回原位置的时间)
注:
(1)全过程处理:是匀减速直线运动,以向上为正方向,加速度取负值;
(2)分段处理:向上为匀减速直线运动,向下为自由落体运动,具有对称性;
(3)上升与下落过程具有对称性,如在同点速度等值反向等。
二、质点的运动(2)----曲线运动、万有引力
1)平抛运动
1.水平方向速度:Vx=Vo 2.竖直方向速度:Vy=gt
3.水平方向位移:x=Vot 4.竖直方向位移:y=gt2/2
5.运动时间t=(2y/g)1/2(通常又表示为(2h/g)1/2)
6.合速度Vt=(Vx2+Vy2)1/2=[Vo2+(gt)2]1/2
合速度方向与水平夹角β:tgβ=Vy/Vx=gt/V0
7.合位移:s=(x2+y2)1/2,
位移方向与水平夹角α:tgα=y/x=gt/2Vo
8.水平方向加速度:ax=0;竖直方向加速度:ay=g
注:
(1)平抛运动是匀变速曲线运动,加速度为g,通常可看作是水平方向的匀速直线运与竖直方向的自由落体运动的合成;
(2)运动时间由下落高度h(y)决定与水平抛出速度无关;
(3)θ与β的关系为tgβ=2tgα;
(4)在平抛运动中时间t是解题关键;(5)做曲线运动的物体必有加速度,当速度方向与所受合力(加速度)方向不在同一直线上时,物体做曲线运动。
2)匀速圆周运动
1.线速度V=s/t=2πr/T 2.角速度ω=Φ/t=2π/T=2πf
3.向心加速度a=V2/r=ω2r=(2π/T)2r 4.向心力F心=mV2/r=mω2r=mr(2π/T)2=mωv=F合
5.周期与频率:T=1/f 6.角速度与线速度的关系:V=ωr
7.角速度与转速的关系ω=2πn(此处频率与转速意义相同)
8.主要物理量及单位:弧长(s):米(m);角度(Φ):弧度(rad);频率(f):赫(Hz);周期(T):秒(s);转速(n):r/s;半径�0�3:米(m);线速度(V):m/s;角速度(ω):rad/s;向心加速度:m/s2。
注:
(1)向心力可以由某个具体力提供,也可以由合力提供,还可以由分力提供,方向始终与速度方向垂直,指向圆心;
(2)做匀速圆周运动的物体,其向心力等于合力,并且向心力只改变速度的方向,不改变速度的大小,因此物体的动能保持不变,向心力不做功,但动量不断改变。
3)万有引力
1.开普勒第三定律:T2/R3=K(=4π2/GM){R:轨道半径,T:周期,K:常量(与行星质量无关,取决于中心天体的质量)}
2.万有引力定律:F=Gm1m2/r2 (G=6.67×10-11N�6�1m2/kg2,方向在它们的连线上)
3.天体上的重力和重力加速度:GMm/R2=mg;g=GM/R2 {R:天体半径(m),M:天体质量(kg)}
4.卫星绕行速度、角速度、周期:V=(GM/r)1/2;ω=(GM/r3)1/2;T=2π(r3/GM)1/2{M:中心天体质量}
5.第一(二、三)宇宙速度V1=(g地r地)1/2=(GM/r地)1/2=7.9km/s;V2=11.2km/s;V3=16.7km/s
6.地球同步卫星GMm/(r地+h)2=m4π2(r地+h)/T2{h≈36000km,h:距地球表面的高度,r地:地球的半径}
注:
(1)天体运动所需的向心力由万有引力提供,F向=F万;
(2)应用万有引力定律可估算天体的质量密度等;
(3)地球同步卫星只能运行于赤道上空,运行周期和地球自转周期相同;
(4)卫星轨道半径变小时,势能变小、动能变大、速度变大、周期变小(一同三反);
(5)地球卫星的最大环绕速度和最小发射速度均为7.9km/s。
三、力(常见的力、力的合成与分解)
1)常见的力
1.重力G=mg (方向竖直向下,g=9.8m/s2≈10m/s2,作用点在重心,适用于地球表面附近)
2.胡克定律F=kx {方向沿恢复形变方向,k:劲度系数(N/m),x:形变量(m)}
3.滑动摩擦力F=μFN {与物体相对运动方向相反,μ:摩擦因数,FN:正压力(N)}
4.静摩擦力0≤f静≤fm (与物体相对运动趋势方向相反,fm为最大静摩擦力)
5.万有引力F=Gm1m2/r2 (G=6.67×10-11N�6�1m2/kg2,方向在它们的连线上)
6.静电力F=kQ1Q2/r2 (k=9.0×109N�6�1m2/C2,方向在它们的连线上)
7.电场力F=Eq (E:场强N/C,q:电量C,正电荷受的电场力与场强方向相同)
8.安培力F=BILsinθ (θ为B与L的夹角,当L⊥B时:F=BIL,B//L时:F=0)
9.洛仑兹力f=qVBsinθ (θ为B与V的夹角,当V⊥B时:f=qVB,V//B时:f=0)
注:
(1)劲度系数k由弹簧自身决定;
(2)摩擦因数μ与压力大小及接触面积大小无关,由接触面材料特性与表面状况等决定;
(3)fm略大于μFN,一般视为fm≈μFN;
(4)其它相关内容:静摩擦力(大小、方向)〔见第一册P8〕;
(5)物理量符号及单位B:磁感强度(T),L:有效长度(m),I:电流强度(A),V:带电粒子速度(m/s),q:带电粒子(带电体)电量(C);
(6)安培力与洛仑兹力方向均用左手定则判定。
2)力的合成与分解
1.同一直线上力的合成同向:F=F1+F2, 反向:F=F1-F2 (F1>F2)
2.互成角度力的合成:
F=(F12+F22+2F1F2cosα)1/2(余弦定理) F1⊥F2时:F=(F12+F22)1/2
3.合力大小范围:|F1-F2|≤F≤|F1+F2|
4.力的正交分解:Fx=Fcosβ,Fy=Fsinβ(β为合力与x轴之间的夹角tgβ=Fy/Fx)
注:
(1)力(矢量)的合成与分解遵循平行四边形定则;
(2)合力与分力的关系是等效替代关系,可用合力替代分力的共同作用,反之也成立;
(3)除公式法外,也可用作图法求解,此时要选择标度,严格作图;
(4)F1与F2的值一定时,F1与F2的夹角(α角)越大,合力越小;
(5)同一直线上力的合成,可沿直线取正方向,用正负号表示力的方向,化简为代数运算。
四、动力学(运动和力)
1.牛顿第一运动定律(惯性定律):物体具有惯性,总保持匀速直线运动状态或静止状态,直到有外力迫使它改变这种状态为止
2.牛顿第二运动定律:F合=ma或a=F合/ma由合外力决定,与合外力方向一致
3.牛顿第三运动定律:F=-F�0�7负号表示方向相反,F、F�0�7各自作用在对方,平衡力与作用力反作用力区别,实际应用:反冲运动
4.共点力的平衡F合=0,推广 {正交分解法、三力汇交原理}
5.超重:FN>G,失重:FN<G 加速度方向向下,均失重,加速度方向向上,均超重
6.牛顿运动定律的适用条件:适用于解决低速运动问题,适用于宏观物体,不适用于处理高速问题,不适用于微观粒子〔见第一册P67〕
注:平衡状态是指物体处于静止或匀速直线状态,或者是匀速转动。
五、振动和波(机械振动与机械振动的传播)
1.简谐振动F=-kx F:回复力,k:比例系数,x:位移,负号表示F的方向与x始终反向
2.单摆周期T=2π(l/g)1/2 {l:摆长(m),g:当地重力加速度值,成立条件:摆角θ<100;l>>r}
3.受迫振动频率特点:f=f驱动力
4.发生共振条件:f驱动力=f固,A=max,共振的防止和应用〔见第一册P175〕
5.机械波、横波、纵波〔见第二册P2〕
6.波速v=s/t=λf=λ/T波传播过程中,一个周期向前传播一个波长;波速大小由介质本身所决定
7.声波的波速(在空气中)0℃:332m/s;20℃:344m/s;30℃:349m/s;(声波是纵波)
8.波发生明显衍射(波绕过障碍物或孔继续传播)条件:障碍物或孔的尺寸比波长小,或者相差不大
9.波的干涉条件:两列波频率相同(相差恒定、振幅相近、振动方向相同)
10.多普勒效应:由于波源与观测者间的相互运动,导致波源发射频率与接收频率不同{相互接近,接收频率增大,反之,减小〔见第二册P21〕}
注:
(1)物体的固有频率与振幅、驱动力频率无关,取决于振动系统本身;
(2)加强区是波峰与波峰或波谷与波谷相遇处,减弱区则是波峰与波谷相遇处;
(3)波只是传播了振动,介质本身不随波发生迁移,是传递能量的一种方式;
(4)干涉与衍射是波特有的;
(5)振动图象与波动图象;
(6)其它相关内容:超声波及其应用〔见第二册P22〕/振动中的能量转化〔见第一册P173〕。
六、冲量与动量(物体的受力与动量的变化)
1.动量:p=mv {p:动量(kg/s),m:质量(kg),v:速度(m/s),方向与速度方向相同}
3.冲量:I=Ft {I:冲量(N�6�1s),F:恒力(N),t:力的作用时间(s),方向由F决定}
4.动量定理:I=Δp或Ft=mvt–mvo Δp:动量变化Δp=mvt–mvo,是矢量式
5.动量守恒定律:p前总=p后总或p=p’�0�7也可以是m1v1+m2v2=m1v1�0�7+m2v2�0�7
6.弹性碰撞:Δp=0;ΔEk=0 即系统的动量和动能均守恒
7.非弹性碰撞Δp=0;0<ΔEK<ΔEKm ΔEK:损失的动能,EKm:损失的最大动能
8.完全非弹性碰撞Δp=0;ΔEK=ΔEKm 碰后连在一起成一整体
9.物体m1以v1初速度与静止的物体m2发生弹性正碰:
v1�0�7=(m1-m2)v1/(m1+m2) v2�0�7=2m1v1/(m1+m2)
10.由9得的推论-----等质量弹性正碰时二者交换速度(动能守恒、动量守恒)
11.子弹m水平速度vo射入静止置于水平光滑地面的长木块M,并嵌入其中一起运动时的机械能损失
E损=mvo2/2-(M+m)vt2/2=fs相对 vt:共同速度,f:阻力,s相对子弹相对长木块的位移
注:
(1)正碰又叫对心碰撞,速度方向在它们“中心”的连线上;
(2)以上表达式除动能外均为矢量运算,在一维情况下可取正方向化为代数运算;
(3)系统动量守恒的条件:合外力为零或系统不受外力,则系统动量守恒(碰撞问题、爆炸问题、反冲问题等);
(4)碰撞过程(时间极短,发生碰撞的物体构成的系统)视为动量守恒,原子核衰变时动量守恒;
(5)爆炸过程视为动量守恒,这时化学能转化为动能,动能增加;(6)其它相关内容:反冲运动、火箭、航天技术的发展和宇宙航行〔见第一册P128〕。
七、功和能(功是能量转化的量度)
1.功:W=Fscosα(定义式){W:功(J),F:恒力(N),s:位移(m),α:F、s间的夹角}
2.重力做功:Wab=mghab m:物体的质量,g=9.8m/s2≈10m/s2,hab:a与b高度差(hab=ha-hb)
3.电场力做功:Wab=qUab {q:电量(C),Uab:a与b之间电势差(V)即Uab=φa-φb}
4.电功:W=UIt(普适式) {U:电压(V),I:电流(A),t:通电时间(s)}
5.功率:P=W/t(定义式) {P:功率[瓦(W)],W:t时间内所做的功(J),t:做功所用时间(s)}
6.汽车牵引力的功率:P=Fv;P平=Fv平 P:瞬时功率,P平:平均功率
7.汽车以恒定功率启动、以恒定加速度启动、汽车最大行驶速度(vmax=P额/f)
8.电功率:P=UI(普适式) {U:电路电压(V),I:电路电流(A)}
9.焦耳定律:Q=I2Rt {Q:电热(J),I:电流强度(A),R:电阻值(Ω),t:通电时间(s)}
10.纯电阻电路中I=U/R;P=UI=U2/R=I2R;Q=W=UIt=U2t/R=I2Rt
11.动能:Ek=mv2/2 {Ek:动能(J),m:物体质量(kg),v:物体瞬时速度(m/s)}
12.重力势能:EP=mgh {EP :重力势能(J),g:重力加速度,h:竖直高度(m)(从零势能面起)}
13.电势能:EA=qφA {EA:带电体在A点的电势能(J),q:电量(C),φA:A点的电势(V)(从零势能面起)}
14.动能定理(对物体做正功,物体的动能增加):
W合=mvt2/2-mvo2/2或W合=ΔEK
{W合:外力对物体做的总功,ΔEK:动能变化ΔEK=(mvt2/2-mvo2/2)}
15.机械能守恒定律:ΔE=0或EK1+EP1=EK2+EP2也可以是mv12/2+mgh1=mv22/2+mgh2
16.重力做功与重力势能的变化(重力做功等于物体重力势能增量的负值)WG=-ΔEP
注:
(1)功率大小表示做功快慢,做功多少表示能量转化多少;
(2)O0≤α<90O 做正功;90O<α≤180O做负功;α=90o不做功(力的方向与位移(速度)方向垂直时该力不做功);
(3)重力(弹力、电场力、分子力)做正功,则重力(弹性、电、分子)势能减少
(4)重力做功和电场力做功均与路径无关(见2、3两式);(5)机械能守恒成立条件:除重力(弹力)外其它力不做功,只是动能和势能之间的转化;(6)能的其它单位换算:1kWh(度)=3.6×106J,1eV=1.60×10-19J;*(7)弹簧弹性势能E=kx2/2,与劲度系数和形变量有关。
八、分子动理论、能量守恒定律
1.阿伏加德罗常数NA=6.02×1023/mol;分子直径数量级10-10米
2.油膜法测分子直径d=V/s {V:单分子油膜的体积(m3),S:油膜表面积(m)2}
3.分子动理论内容:物质是由大量分子组成的;大量分子做无规则的热运动;分子间存在相互作用力。
4.分子间的引力和斥力(1)r<r0,f引<f斥,F分子力表现为斥力
(2)r=r0,f引=f斥,F分子力=0,E分子势能=Emin(最小值)
(3)r>r0,f引>f斥,F分子力表现为引力
(4)r>10r0,f引=f斥≈0,F分子力≈0,E分子势能≈0
5.热力学第一定律W+Q=ΔU{(做功和热传递,这两种改变物体内能的方式,在效果上是等效的),
W:外界对物体做的正功(J),Q:物体吸收的热量(J),ΔU:增加的内能(J),涉及到第一类永动机不可造出〔见第二册P40〕}
6.热力学第二定律
克氏表述:不可能使热量由低温物体传递到高温物体,而不引起其它变化(热传导的方向性);
开氏表述:不可能从单一热源吸收热量并把它全部用来做功,而不引起其它变化(机械能与内能转化的方向性){涉及到第二类永动机不可造出〔见第二册P44〕}
7.热力学第三定律:热力学零度不可达到{宇宙温度下限:-273.15摄氏度(热力学零度)}
注:
(1)布朗粒子不是分子,布朗颗粒越小,布朗运动越明显,温度越高越剧烈;
(2)温度是分子平均动能的标志;
3)分子间的引力和斥力同时存在,随分子间距离的增大而减小,但斥力减小得比引力快;
(4)分子力做正功,分子势能减小,在r0处F引=F斥且分子势能最小;
(5)气体膨胀,外界对气体做负功W<0;温度升高,内能增大ΔU>0;吸收热量,Q>0
(6)物体的内能是指物体所有的分子动能和分子势能的总和,对于理想气体分子间作用力为零,分子势能为零;
(7)r0为分子处于平衡状态时,分子间的距离;
(8)其它相关内容:能的转化和定恒定律〔见第二册P41〕/能源的开发与利用、环保〔见第二册P47〕/物体的内能、分子的动能、分子势能〔见第二册P47〕。
九、气体的性质
1.气体的状态参量:
温度:宏观上,物体的冷热程度;微观上,物体内部分子无规则运动的剧烈程度的标志,
热力学温度与摄氏温度关系:T=t+273 {T:热力学温度(K),t:摄氏温度(℃)}
体积V:气体分子所能占据的空间,单位换算:1m3=103L=106mL
压强p:单位面积上,大量气体分子频繁撞击器壁而产生持续、均匀的压力,标准大气压:1atm=1.013×105Pa=76cmHg(1Pa=1N/m2)
2.气体分子运动的特点:分子间空隙大;除了碰撞的瞬间外,相互作用力微弱;分子运动速率很大
3.理想气体的状态方程:p1V1/T1=p2V2/T2 {PV/T=恒量,T为热力学温度(K)}
注:
(1)理想气体的内能与理想气体的体积无关,与温度和物质的量有关;
(2)公式3成立条件均为一定质量的理想气体,使用公式时要注意温度的单位,t为摄氏温度(℃),而T为热力学温度(K)。
物理化学常用符号
1.物理量符号名称(拉丁文)
A
Helmholtz自由能,指数前因子,面积
Mr
物质的相对摩尔质量
a
van der Waals参量,相对活度
m
质量
b
van der Waals参量,碰撞参数
N
系统中的分子数
bB
物质B的质量摩尔浓度,亦有用mB
n
物质的量,反应级数
B
任意物质,溶质
P
相数(亦有用F),概率因子
C
热容,独立组分数
p
压力
C
库仑
Q
热量,电量
c
物质的量浓度,光速
q
吸附量
D
介电常数,解离能,扩散系数
R
标准摩尔气体常量,电组,半径
d
直径
R,R‘ 独立的化学反应数和其它限制条件数
E
能量,电动势,电极电势
r
速率,距离,半径
e-
电子电荷
S
熵,物种数
F
Faraday 常量,力, 自由度数
T
热力学温度
f
自由度
t 时间,摄氏温度
G
Gibbs 函数(自由能),电导
u
离子电迁移率
g
重力加速度
V
体积
H
焓
Vm(B)
物质B的摩尔体积
h
高度,Planck 常量
VB
物质B的偏摩尔体积
I
电流强度,离子强度,光强度
v
物质B的计量系数
J
焦耳
W
功
j
电流密度
wB
物质B的质量分数
K
平衡常数
xB
物质B的摩尔分数
k
Boltzmann 常量,反应速率系数
yB
物质B在气相中的摩尔分数
L
Avogadro 常量
Z
配位数,碰撞频率
l
长度,距离
z
离子价数,电荷数
M
摩尔质量
2.物理量符号名称(希腊文)
a
热膨胀系数,转化率,解离度
Q 特征温度
b
冷冻系数
G
表面吸附超量
g
Cp,m / CV,m之值,活度因子,表面张力
d
非状态函数的微小变化量,距离,厚度
e
能量,介电常数
D
状态函数的变化量
z
动电电势
mJ
Joule 系数
h
热机效率,超电势,黏度
mJ-T
Joule-Thomson 系数
q
覆盖率,角度
u
速度
k
电导率
x
反应进度
l
波长
P
渗透压,表面压力
Lm
摩尔电导率
r
电阻率,密度,体积质量
m
化学势,折合质量
t
弛豫时间,时间间隔
3. 其它符号和上下标(正体)
g
气态(gas)
e 外部(external),环境,亦有用amb
l
液态(liquid)
vap
蒸发(vaporation)
s
固态(solid),秒(second)
±
离子平均
mol
摩尔(molar)
≠
活化络合物或过渡状态
r
转动(rotation),化学反应(reaction)
id
理想(ideal)
sat
饱和(saturation)
re
实际(real)
sln
溶液(solution)
P
连乘号
sol
溶解
S
加和号
sub
升华(sublimation)
exp
指数函数(exponential)
trs
晶型转变(transformation)
def
定义(definition)
mix
混合(mixture)
<>
平均值
dil
稀释(dilution 参考技术A 楼上的哥们真的很专业,满意吧。
C++11 中的 T&&(双 & 符号)是啥意思?
【中文标题】C++11 中的 T&&(双 & 符号)是啥意思?【英文标题】:What does T&& (double ampersand) mean in C++11?C++11 中的 T&&(双 & 符号)是什么意思? 【发布时间】:2011-07-25 18:57:37 【问题描述】:我一直在研究 C++11 的一些新特性,我注意到其中一个是声明变量时的双 & 符号,例如 T&& var
。
首先,这个野兽叫什么?我希望 Google 允许我们搜索这样的标点符号。
具体是什么意思?
乍一看,它似乎是一个双重引用(就像 C 风格的双指针 T** var
),但我很难考虑它的用例。
【问题讨论】:
我已将此添加到 c++-faq 中,因为我相信它会在未来出现更多。 关于move semantics的相关问题 你可以用谷歌搜索这个,你只需要用引号括起来你的短语:google.com/#q="T%26%26" 现在你的问题是第一个命中。:)
这里有一个很好的、易于理解的对类似问题的回复***.com/questions/7153991/…
我在 Google 的顶部搜索“c++ 两个 & 符号参数”时遇到了三个 *** 问题,而你的问题是第一个。因此,如果您可以拼出“两个与号参数”,您甚至不需要使用标点符号。
【参考方案1】:
它声明了一个rvalue reference(标准提案文档)。
这里介绍一下右值references。
这里是微软标准库developers 对右值引用的深入了解。
注意: MSDN 上的链接文章(“Rvalue References: C++0x Features in VC10, Part 2”)是对 Rvalue 引用的非常清晰的介绍,但对右值引用在 C++11 标准草案中曾经是正确的,但在最终标准中不是正确的!具体来说,它在不同的点上说右值引用可以绑定到左值,这曾经是正确的,但被改变了。(例如 int x; int &&rrx = x; 不再在 GCC 中编译) – 2014-07-13 16:12:47
C++03 引用(现在在 C++11 中称为左值引用)之间的最大区别在于它可以像临时值一样绑定到右值,而不必是 const。因此,这种语法现在是合法的:
T&& r = T();
右值引用主要提供以下功能:
移动语义。现在可以定义一个移动构造函数和移动赋值运算符,它采用右值引用而不是通常的 const-lvalue 引用。移动的功能类似于副本,但不必保持源不变;事实上,它通常会修改源,使其不再拥有移动的资源。这对于消除无关副本非常有用,尤其是在标准库实现中。
例如,复制构造函数可能如下所示:
foo(foo const& other)
this->length = other.length;
this->ptr = new int[other.length];
copy(other.ptr, other.ptr + other.length, this->ptr);
如果这个构造函数被传递了一个临时的,副本将是不必要的,因为我们知道临时将被销毁;为什么不利用临时已经分配的资源呢?在 C++03 中,没有办法阻止复制,因为我们无法确定我们是否传递了一个临时的。在 C++11 中,我们可以重载移动构造函数:
foo(foo&& other)
this->length = other.length;
this->ptr = other.ptr;
other.length = 0;
other.ptr = nullptr;
请注意这里的最大区别:移动构造函数实际上修改了它的参数。这将有效地将临时“移动”到正在构造的对象中,从而消除不必要的复制。
移动构造函数将用于临时对象和非常量左值引用,这些引用使用std::move
函数显式转换为右值引用(它只是执行转换)。以下代码均调用 f1
和 f2
的移动构造函数:
foo f1((foo())); // Move a temporary into f1; temporary becomes "empty"
foo f2 = std::move(f1); // Move f1 into f2; f1 is now "empty"
完美转发。右值引用允许我们正确地转发模板函数的参数。以这个工厂函数为例:
template <typename T, typename A1>
std::unique_ptr<T> factory(A1& a1)
return std::unique_ptr<T>(new T(a1));
如果我们调用factory<foo>(5)
,参数将被推导出为int&
,它不会绑定到文字5,即使foo
的构造函数采用int
。好吧,我们可以改用A1 const&
,但是如果foo
通过非常量引用获取构造函数参数呢?要创建一个真正通用的工厂函数,我们必须在 A1&
和 A1 const&
上重载工厂。如果 factory 采用 1 个参数类型,这可能没问题,但每个额外的参数类型都会将必要的重载集乘以 2。这很快就无法维护。
右值引用通过允许标准库定义一个可以正确转发左值/右值引用的std::forward
函数来解决这个问题。有关std::forward
工作原理的更多信息,请参阅this excellent answer。
这使我们能够像这样定义工厂函数:
template <typename T, typename A1>
std::unique_ptr<T> factory(A1&& a1)
return std::unique_ptr<T>(new T(std::forward<A1>(a1)));
现在参数的右值/左值在传递给T
的构造函数时被保留。这意味着如果使用右值调用工厂,则使用右值调用T
的构造函数。如果使用左值调用工厂,则使用左值调用T
的构造函数。改进后的工厂函数之所以起作用,是因为有一个特殊规则:
当函数参数类型为 表单
T&&
其中T
是一个模板 参数和函数参数 是A
类型的左值,A&
类型是 用于模板参数推导。
因此,我们可以像这样使用工厂:
auto p1 = factory<foo>(foo()); // calls foo(foo&&)
auto p2 = factory<foo>(*p1); // calls foo(foo const&)
重要的右值引用属性:
对于重载决议,左值更喜欢绑定到左值引用,而右值更喜欢绑定到右值引用。因此,为什么临时工更喜欢调用移动构造函数/移动赋值运算符而不是复制构造函数/赋值运算符。 右值引用将隐式绑定到右值和作为隐式转换结果的临时变量。即float f = 0f; int&& i = f;
格式正确,因为 float 可以隐式转换为 int;引用将指向作为转换结果的临时对象。
命名的右值引用是左值。未命名的右值引用是右值。 这对于理解std::move
调用在以下情况下的必要性很重要:foo&& r = foo(); foo f = std::move(r);
【讨论】:
+1 代表Named rvalue references are lvalues. Unnamed rvalue references are rvalues.
;在不知道这一点的情况下,我一直在努力理解为什么人们会在很长一段时间内使用 T &&t; std::move(t);
,等等。
@MaximYegorushkin:在那个例子中,r 绑定到一个纯右值(临时),因此临时应该有它的生命周期范围扩展,不是吗?
@PeterHuene 我收回这一点,r 值引用确实延长了临时的生命周期。
CAUTION:MSDN上的链接文章(“Rvalue References: C++0x Features in VC10, Part 2”)是很清楚在介绍右值引用时,but 对在 C++11 标准草案中曾经为真,但对于最后一个!具体来说,它在各个方面都说右值引用可以绑定到左值,这曾经是正确的,但是was changed.(例如,GCC 中的int x; int &&rrx = x;
no longer compiles)
为了更好地理解,如果以下陈述不正确,有人可以解释一下 1. rvalues
可以被认为是无法保证生命周期的临时人员。 2.foo&& r = foo()
将foo()
返回的生命周期延长到作用域的持续时间。 3. 这些是否等效:foo&& r
和 const foo& r
?【参考方案2】:
它表示一个右值引用。除非以其他方式显式生成,否则右值引用只会绑定到临时对象。它们用于在某些情况下使对象更加高效,并提供一种称为完美转发的工具,从而大大简化模板代码。
在 C++03 中,您无法区分非可变左值和右值的副本。
std::string s;
std::string another(s); // calls std::string(const std::string&);
std::string more(std::string(s)); // calls std::string(const std::string&);
在 C++0x 中,情况并非如此。
std::string s;
std::string another(s); // calls std::string(const std::string&);
std::string more(std::string(s)); // calls std::string(std::string&&);
考虑这些构造函数背后的实现。在第一种情况下,字符串必须执行复制以保留值语义,这涉及到新的堆分配。但是,在第二种情况下,我们预先知道传入构造函数的对象将立即销毁,并且不必保持原样。在这种情况下,我们可以有效地只交换内部指针而不执行任何复制,这大大提高了效率。移动语义有利于任何具有昂贵或禁止复制内部引用资源的类。考虑std::unique_ptr
的情况——既然我们的类可以区分临时和非临时,我们可以使移动语义正确工作,使得unique_ptr
不能被复制但可以移动,这意味着std::unique_ptr
可以可以合法地存储在标准容器中,进行排序等,而 C++03 的 std::auto_ptr
则不能。
现在我们考虑右值引用的另一种用法——完美转发。考虑将引用绑定到引用的问题。
std::string s;
std::string& ref = s;
(std::string&)& anotherref = ref; // usually expressed via template
不记得 C++03 对此有何评论,但在 C++0x 中,处理右值引用时的结果类型至关重要。对类型 T 的右值引用(其中 T 是引用类型)成为类型 T 的引用。
(std::string&)&& ref // ref is std::string&
(const std::string&)&& ref // ref is const std::string&
(std::string&&)&& ref // ref is std::string&&
(const std::string&&)&& ref // ref is const std::string&&
考虑最简单的模板函数——最小值和最大值。在 C++03 中,您必须手动重载 const 和非常量的所有四种组合。在 C++0x 中,它只是一个重载。结合可变参数模板,这可以实现完美的转发。
template<typename A, typename B> auto min(A&& aref, B&& bref)
// for example, if you pass a const std::string& as first argument,
// then A becomes const std::string& and by extension, aref becomes
// const std::string&, completely maintaining it's type information.
if (std::forward<A>(aref) < std::forward<B>(bref))
return std::forward<A>(aref);
else
return std::forward<B>(bref);
我放弃了返回类型推导,因为我不记得它是如何临时完成的,但是那个 min 可以接受左值、右值、const 左值的任意组合。
【讨论】:
你为什么使用std::forward<A>(aref) < std::forward<B>(bref)
?当您尝试转发int&
和float&
时,我认为这个定义是不正确的。最好删除一种类型的表单模板。【参考方案3】:
T&&
的术语当与类型推导一起使用时(例如完美转发)通俗地称为转发引用。 “通用参考”一词由 Scott Meyers in this article 创造,但后来被更改。
那是因为它可能是右值或左值。
例如:
// template
template<class T> foo(T&& t) ...
// auto
auto&& t = ...;
// typedef
typedef ... T;
T&& t = ...;
// decltype
decltype(...)&& t = ...;
更多讨论可以在Syntax for universal references的答案中找到
【讨论】:
【参考方案4】:右值引用是一种行为与普通引用 X& 非常相似的类型,但有几个例外。最重要的是,当涉及到函数重载决议时,左值更喜欢旧式左值引用,而右值更喜欢新的右值引用:
void foo(X& x); // lvalue reference overload
void foo(X&& x); // rvalue reference overload
X x;
X foobar();
foo(x); // argument is lvalue: calls foo(X&)
foo(foobar()); // argument is rvalue: calls foo(X&&)
那么什么是右值?任何不是左值的东西。一个左值存在 一个引用内存位置的表达式,并允许我们通过 & 运算符获取该内存位置的地址。
首先通过一个例子来理解右值的作用几乎更容易:
#include <cstring>
class Sample
int *ptr; // large block of memory
int size;
public:
Sample(int sz=0) : ptrsz != 0 ? new int[sz] : nullptr, sizesz
if (ptr != nullptr) memset(ptr, 0, sz);
// copy constructor that takes lvalue
Sample(const Sample& s) : ptrs.size != 0 ? new int[s.size] :\
nullptr, sizes.size
if (ptr != nullptr) memcpy(ptr, s.ptr, s.size);
std::cout << "copy constructor called on lvalue\n";
// move constructor that take rvalue
Sample(Sample&& s)
// steal s's resources
ptr = s.ptr;
size = s.size;
s.ptr = nullptr; // destructive write
s.size = 0;
cout << "Move constructor called on rvalue." << std::endl;
// normal copy assignment operator taking lvalue
Sample& operator=(const Sample& s)
if(this != &s)
delete [] ptr; // free current pointer
size = s.size;
if (size != 0)
ptr = new int[s.size];
memcpy(ptr, s.ptr, s.size);
else
ptr = nullptr;
cout << "Copy Assignment called on lvalue." << std::endl;
return *this;
// overloaded move assignment operator taking rvalue
Sample& operator=(Sample&& lhs)
if(this != &s)
delete [] ptr; //don't let ptr be orphaned
ptr = lhs.ptr; //but now "steal" lhs, don't clone it.
size = lhs.size;
lhs.ptr = nullptr; // lhs's new "stolen" state
lhs.size = 0;
cout << "Move Assignment called on rvalue" << std::endl;
return *this;
//...snip
;
构造函数和赋值运算符已被采用右值引用的版本重载。右值引用允许函数在编译时(通过重载解析)在“我是在左值还是右值上被调用?”的条件下进行分支。 这使我们能够在上面创建更高效的构造函数和赋值运算符来移动资源而不是复制它们。
编译器在编译时自动分支(取决于它是为左值还是右值调用)选择是否应该调用移动构造函数或移动赋值运算符。
总结:右值引用允许移动语义(和完美转发,在下面的文章链接中讨论)。
一个易于理解的实用示例是类模板std::unique_ptr。由于 unique_ptr 维护其底层原始指针的独占所有权,因此无法复制 unique_ptr。这将违反他们的专有所有权不变性。所以他们没有复制构造函数。但他们确实有移动构造函数:
template<class T> class unique_ptr
//...snip
unique_ptr(unique_ptr&& __u) noexcept; // move constructor
;
std::unique_ptr<int[] pt1new int[10];
std::unique_ptr<int[]> ptr2ptr1;// compile error: no copy ctor.
// So we must first cast ptr1 to an rvalue
std::unique_ptr<int[]> ptr2std::move(ptr1);
std::unique_ptr<int[]> TakeOwnershipAndAlter(std::unique_ptr<int[]> param,\
int size)
for (auto i = 0; i < size; ++i)
param[i] += 10;
return param; // implicitly calls unique_ptr(unique_ptr&&)
// Now use function
unique_ptr<int[]> ptrnew int[10];
// first cast ptr from lvalue to rvalue
unique_ptr<int[]> new_owner = TakeOwnershipAndAlter(\
static_cast<unique_ptr<int[]>&&>(ptr), 10);
cout << "output:\n";
for(auto i = 0; i< 10; ++i)
cout << new_owner[i] << ", ";
output:
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
static_cast<unique_ptr<int[]>&&>(ptr)
通常使用 std::move
// first cast ptr from lvalue to rvalue
unique_ptr<int[]> new_owner = TakeOwnershipAndAlter(std::move(ptr),0);
Thomas Becker 的C++ Rvalue References Explained 是一篇很好的文章,解释了所有这些以及更多内容(例如右值如何实现完美转发以及这意味着什么),并提供了很多很好的示例。这篇文章在很大程度上依赖于他的文章。
Stroutrup 等人的简短介绍是A Brief Introduction to Rvalue References。人
【讨论】:
是不是拷贝构造函数Sample(const Sample& s)
也需要拷贝内容? '复制赋值运算符'的相同问题。
是的,你是对的。我无法复制内存。复制构造函数和复制赋值运算符都应该在测试 size != 0 后执行 memcpy(ptr, s.ptr, size)。如果 size != 0,默认构造函数应该执行 memset(ptr,0, size)。跨度>
好的,谢谢。因此这个评论和前两个cmet可以去掉,因为问题也已经在答案中得到纠正。以上是关于高一物理公式 全一些 包括一些符号是啥意思 等 谢谢 物理学得好的童鞋进啊............的主要内容,如果未能解决你的问题,请参考以下文章
拉普拉斯方程数学符号∂是啥意思,请举一个拉普拉斯方程完整例子