面向对象技术(C++ Primer)第5章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
逗号操作符
27
逗号表达式是一组由逗号分隔的表达式, 从左向右计算。其结果是最右边表达式的 值。如果最右边的操作数是左值,则该逗 号表达式的值也是左值。常用于for循环。
复合表达式的求值
Biblioteka Baidu
28
含有两个或更多操作符的表达式称为复合 表达式。 优先级和结合性决定了复合表达式的值。 圆括号凌驾于所有优先级之上。 看P147页的表
赋值操作具有最低优先级
int i=get_value(); while(i!=42) i=get_value(); 简化为: int i; while((i=get_value())!=42) { ….. }
和 if(i==42)
18
If(i=42)
复合赋值操作符
14
将移位操作符用于IO
15
IO操作符为左结合。即从左向右结合。 IO操作符具有中等优先级:比算术操作的优先级 低,但比关系操作、赋值操作、条件操作的优先 级高。 Cout<<“hi”<<“there”<<endl; Cout<<42+10; //ok,+ higher than << Cout<<(10<42); //ok,prints 1 Cout<<10<42; //error,attempt to comapare cout //to 42 第四句等效于 (cout<<10)<42;
19
a op=b; 基中,op=可为下列十个操作之一 算术运算和位运算 += -= *= /= %= <<= >>= &= ^= |= a op=b与 a=a op b等价
自增和自减操作符
20
int i; ++i; --i; //前自增加1后返回对象本身是左值 i++; i--; //后自增返回的是右值 建议:只在必要时才使用后自增操作符。
赋值操作符
16
左操作数必面是非const的左值 int i,j,ival,ia[3]; const int ci=i; //ok ,初始化,不是赋值 1024=ival;//err i+j=ival; //error ci=ival; //error ia=0; //error 即:字面值常量,表达式,const对象都不能作为 赋值操作的左操作数。数组名是不可修改的左值 ,不可用作赋值操作的目标。 Ival=0; //resutl: type int value 0 Ival=3.14159; //result:type int value 3
零指针的删除
35
如果指针的值为0,则在其上做delete操作 是合法的,但这样没有任何意义。 int *ip=0; delete ip; //ok.
Const对象的动态分配和回收
C++允许动态创建const对象。 const int *pci=new const int(1024); const string *pcs=new const string; delete pci; //ok,deletes a const object
条件操作符
23
cond? expr1 : expr2; int i=10,j=20,k=30; Int maxval=i>j? i:j; 避免条件操作符的深度嵌套。以下是不好 的例子。可用更简单的比较语句实现。 int max=i>j ? i>k ?i:k :j>k? j:k;
赋值操作的右结合性
17
与下标和解引用操作符一样,赋值操作也 返回左值。只要被赋值的每个操作数都具 有相同的通用类型,C++允许将多个赋值 操作写在同一个表达式中。 Int ival,jval; Ival=jval=0; 赋值具有右结合性。当表达式含有多个赋 值操作符时,从右向左结合。
求值顺序
29
只有&& || 及条件操作符和逗号操作符指定 了操作数的求值顺序。其作操作符未定义 求值顺序。 While(iter!=vec.end()&& *iter!=some_val) f1()*f2(); //f1先计算还是f2先计算未定义 if(ia[index++]<ia[index]) if(ia[0]<ia[0]) //先算右边 if(ia[0]<ia[1]) //先算左边
9
相等测试与bool字面值
Bool类型可转换为任何算术类型。 false由0表示,true由1表示。 If(val==true)等效于if(val==1) 只有当val==1时上式才为true. If(val)则是当val不为0时,就为true 这两种写法相 同吗?
10
5.3位操作符
动态创建对象的默认初始化
32
类类型的对象用该类的默认构造函数初始化,内 置类型的对象无初始化。除了对其赋值之个,对 未初始化的对象所关联的值的任何使用都是没有 定义的。正如我们总是要初始化定义为变量的对 象一样,在动态创建对象时,几乎总是对它做初 始化。 string *ps=new string(); //ini to empty int *pi=new int(); //pi point to an int 0 cls *pc=new cls(); //pc ponts to a value // inittialed object of type cls
33
int * pi=new int; //pi points to uninitializ int int *pi=new int(); //pi point to an int //initialized to 0. New有可能因为自由存储区被耗尽而失败 。如果new无法获取所需要的内存空间, 系统将抛出名为bad_alloc的异常。
在单个表达式中组合使用解引用 和自增操作 21
移位操作的右操作数不可以是负数,而且 必须是严格小于左操作数位数的值。否则 操作结果未定义。
箭头操作符
22
C++为包含点操作和解引用操作符的表达 式提供了一个同义词:-> Item1.same_isbn(item2); // Sales_item *sp=&item1; (*sp).same_isbn(item2); *sp.same_isbn(item2); //error (*p).foo; 等价于p->foo; sp->same_isbn(item2);
24
cout<<(i<j?i:j); //ok Cout<<(i<j)?i:j; //printfs 1 or 0 等效于: Cout<<(i<j); cout?i:j; Cout<<i<j?i:j; //error,compares cout to int
5.8 sizeof操作符
25
26
对char类型或值为char类型的表达式做sizeof操 作保证得1 对引用类型做sizeof操作将返回存放此引用类型 对象所需的内存空间大小 对指针做sizeof操作将返回存放指针所需的内存 大小。注意,若要获得该指针所指向对象大小, 必须对指针解引用 对数组sizeof等效于对其元素类型做sizeof操作的 结果乘上数组元素个数。 Int sz=sizeof(ia)/sizeof(*ia);
第五章 表达式
算术操作符 关系操作符,逻辑操作符 位操作符 赋值操作符 自增和自减操作符 箭头操作符 条件操作符 sizeof操作符 逗号操作符 复合表达式的求值 New 和delete表达式 类型转换
1
相关知识复习
操作符表示该 操作符执行什么操作及 操作结果的类型,这取决于操作数的类 型 一元,二元,三元操作符 操作符对其操作数的类型有要求。 操作符的优先级、结合性及操作数的求 值顺序。
2
算术操作符
3
溢出和其他算术异常
某些算术表达式的求解结果未定义。其中 一部分由数学特性引起了,如除零操作; 其他则由计算机特性引起,如溢出:计算 出的数值超了其类型的表示范围。 short short_value=32767; short ival=1; //this is calculation overflows short_value+=ival;
5.2 关系和逻辑操作符
6
逻辑与和逻辑或
7
exp1&& exp2 exp1 || exp2 上式中仅当expr1不能确定表达式的值时,才会求解exp2. 即,逻辑与中,当exp1结果为true时,逻辑或中,exp1的 结果为false. String s(“Expression in C++ …”); Stirng::iterator it=s.begin(); While(it!=s.end()&&!isspace(*it)) { *it=toupper(*it); ++it;
30
注意事项: 如有怀疑,则在表达式上按程序逻辑要求 使用圆括号强制操作数的组合。 如果要修改操作数的值,则不要在同一个 语句的其他地方使用该操作数。若必须使 用,则分成两个独立语句。
5.11 new和delete
31
int i; int *pi=new int; 动态创建对象的初始化:C++使用直接初始化的 语法规则初始化动态创建的对象。 int i(1024); int *pi=new int(1024); //pi指的值是1024 String s(10,’9’); //value of s is 10个9 String *ps=new string(10,’9’); //*ps 是10个9
返回一对象或类型名的长度,size_t 字节 sizeof(type name); sizeof(expr); sizeof expr; 以下三个sizeof的操作等效 sales_item item, *p; sizeof(Sales_item); sizeof item; sizeof *p
4
5
求余操作&符只能用于整型操作数。包括 bool, char,short,int,long及对应的unsigned类 型。 两个正数的除法和求模操作结果也是正数。 两个负数的除法结果为正,求模结果为负。 若只有一个负数,求模结果的符号取决于机 器。除法操作为负数。求模操作的符号可由 分子或分母的符号而定。若与分子的符号一 致,则结果向零取整。若与分母的一致,则 向无穷一侧取整 。
11
对于位操作符,由于系统不能确保如 何处理其操作数的符号位,所以强列 建议使用unsigned 整型操作数。
12
移位操作的右操作数不可以是负数,而且 必须是严格小于左操作数位数的值。否则 操作结果未定义。
bitset对象或整型值的使用
bitset<30> bitset_quiz1; unsigned long int_quiz1=0;
撤销动态创建的对象
34
动态创建的对象必须显式地由delete将其占用的 内存返回给自由存储区。 delete pi; int I; int *pi=&i; string str=“dwarves”; double *pd=new double(33); delete str; //error, str is not a dynamic obj delete pi; //error, pi refer to a local delete pd; //ok
}
逻辑非操作
将其操作数视为条件表达式,产生与操作 数值相反的条件值。 int x=0; if(!vec.empty()) x=*vec.begin(;
8
不建议串接使用关系操作符
关系操作符(<,<=,>,>=)具有左结合特性 。但事实上由于关系操作符返回bool类型 ,因此很少使用左结合特性。如果把多个 关系操作符串接起来用,结果往往出乎预 料。 if(i<j<k) {….} //error If(i<j && j<k) {…}//ok