实验2 Java符号与表达式
2.1 实验目的
(1)熟悉基本数据类型及其占用空间大小,熟悉标识符的定义特点;
(2)熟悉常见转义字符的含义;
(3)掌握不同类型数据的赋值转换原则,熟悉自动转换与强制转换的含义;
(4)掌握常用运算符的使用。
2.2 知识要点
2.2.1 基本数据类型、变量
(1)标识符的命名原则:以字母,下划线(_),美元符($)开始的一个字符序列,后面可以跟字母,下划线,美元符,数字。
(2)基本数据类型(见表2-1)
表2-1 基本数据类型
●八进制表示形式:以0(零)开头,如:012;
●十六进指表示形式:以0x开头,如:0xa1;
●整数默认int型,长整数可在后面加L;
●实数默认双精度型,要明确表示为float型在数据后加F。
●布尔型数据只有true和false两个值;
●字符型数据是用单引号括起来。
2.2.2 特殊字符—转义符
Java字符采用Unicode编码。“\”(反斜杠)在字符表示或字符串中有特殊作用,它和之后的字符合并解释,用于表示一些特殊字符。见表2-2。
表2-2 常见转义符
2.2.3 自动类型转换与强制类型转换
(1)自动转换次序
byte-->short→char→int→long→float→double
按照箭头所示方向,处于左边的数据类型的数据可以自动转换赋值给右边的数据类型的变量,但反之,将处于右边的数据类型的数据赋值给处于左边的数据类型的变量必须经过强制转换。
(2)布尔类型不能与其他类型进行转换;
(3)赋值时强制转换可能导致数据丢失精度。
2.2.4 输出语句的使用
(1)print()方法与println()的差异是前者输出后不换行,而后者换行。
(2)输出时可以通过“+”号将任何数据与字符串拼接。如果拼接的是基本类型变量,则在其位置输出变量值,如果是对象,则在其位置输出对象的toString()方法的返回结果。
2.2.5 容易用错的运算符
(1)++或--的位置相关性。
不妨假设原来a值为4,则使用++或--运算符后的结果如表2-3所示。
表2-3 ++和—运算符的位置相关性
(2)赋值运算(=)与相等比较(==)的差异
赋值语句形式:变量名=表达式;
功能:计算表达式的结果,并将结果给变量赋值,变量的结果也为赋值表达式的结果。
“==”是关系运算符,是比较运算符两边的数据是否相等。表达式的结果为true或false。
(3)求余(%)与除号(/)的使用
注意两个整数进行除法运算是整除,结果将不包含小数部分,而一个是整数、另一个为实数,则转化为实数后再计算,结果为实数。具体样例见表2-4。
表2-4 求余与除号运算符
(4)逻辑与(&&)与逻辑或(||)的使用,尤其是副作用。
逻辑运算符有可能不必计算运算符两边的表达式即可确定结果,其副作用见表2-5。
表2-5 逻辑运算符的附加特点
(5)位运算符的使用
移位运算符左移1位将数值增大1,右移则缩小1倍;按位逻辑运算相当于每位的1对应true,0对应false的逻辑运算,将各位的运算结果拼接后的数据即为结果。各类位运算符的具体功能见表2-6。
表2-6 各类位运算符的功能
(6)运算符的优先级
在一个表达式中运算的优先次序由相邻运算符的优先级决定,同一级运算符的运算次序根据运算符的结合性决定运算次序。如果是左结合则按自左向右的次序进行。
2.3 样例分析
样例1:调试分析以下程序的运行结果:
public class test {
public static void main(String a[]) {
int m=0;
System.out.println("m++="+m++);
System.out.println("++m="+(++m));
boolean x;
x=(5>3)&&(4==6);
System.out.println("x="+x);
m=m%2;
System.out.println("result="+m+1);
int y=m*m+2*m-1;
System.out.println("m="+m+",y="+y);
}
}
【输出结果】
m++=0
++m=2
x=false
result=01
m=0,y=-1
【说明】(1) 注意m++和++m的求值差异;(2)注意输出语句中与字符串的拼接运算次序。字符串“result”先与m的值拼接,然后再与1拼接。
样例2:已知梯形的上底为3,下底为5,高为2.4,求其面积。
【参考程序1】
public class Area {
public static void main(String a[]){
double x=3; // 上底
double y=5; // 下底
double z=2.4; // 高
double s=(x+y)*z/2; //计算面积
System.out.println("面积="+s);
}
}
【参考程序2】
public class Area {
public static void main(String a[]){
double s=(3+5)*2.4/2; //计算面积
System.out.println("面积="+s);
}
}
【说明】计算机编程解法可以是多样的,只要能实现目标即可。但要注意程序的可读性,对引入的变量通常要加以注释。
2.4 上机练习
?基本题
1)编程观察如下输出语句:
System.out.println("hello test escape char");
在“escape”处换上各种转义字符测试输出效果。如何实现如下输出:
Hello "test"
Hello ‘\test’
2)设有如下代码段,考虑赋值转换问题:
int a=234;
byte b=a;
System.out.println("a="+a+",b="+b);
将a,b的类型以及数据进行各种替换,观察什么时候能赋值,什么时候需要使用强制转换,什么时候不能强制转换,什么时候强制转换会丢失数据。
3) 编写一个程序求半径R为10的圆的面积。公式为:S=πR2
注:π可用Math类的常量PI表示(即Math.PI)。
?提高题
1)设有一个边长为30的等边三角形,三角形内有一个内切圆,计算除内切圆外三角形内其它部分的面积。
【提示】先算三角形面积,再计算圆的面积,其差即为结果。
2)调试分析以下程序的运行结果:
public class test {
public static void main(String a[]) {
int m=10,n=517;
System.out.println(n % m);
System.out.println(n / m);
System.out.println(m >> 2);
System.out.println(m & n);
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(m >> 2));
}
}
注意:Integer.toBinaryString(int)用于将一个整数转化为二进制形式的数字串。在进行位运算时,注意观察二进制的数据变化规律。
2.5 思考题
1) 现有一个int类型的整数和一个double类型的数进行加法运算,则得到的结果类型为:
A.int类型B. double类型 C. float类型 D. long类型
2)下面程序段的输出结果是:
int a = 2;
System.out.print( a++);
System.out.print( a);
System.out.print(++a);
A.333 B.334 C.234 D.233
3) 以下代码的输出结果?
public class Test{
int x=3;
public static void main(String argv[]){
int x= 012;
System.out.println(x);
}
}
A.12 B.012 C.10 D.3
4) 下列定义语句正确的是:
A.char c="\n"; B.int i=12; C.float f=2.8; D.boolean b=null; 5)检查如下代码:
public class Quiz2_l{
public static void main(String[] args) {
int a = 8;
int b = -8;
System.out.print(a<<2);
System.out.print("," + (b>>1) );
}
} 化为二进制进行移位,再化为十进制
下列哪条语句正确描述了程序在编译和运行时的行为?
A.编译成功,输出为“32,-4 ”
B. 编译成功,输出为“16,4 ”
C. 编译成功,输出为“32,2147483644”
D. 编译成功,输出为“16,2147483644”
E. 编泽器拒绝表达式 b>>,因为不能对一个负数应用>>操作符
6)以下代码中变量result的可能类型有哪些?
byte b = 11;
short s = 13;
result = b * ++s;
A.byte, short, int, long, float, double
B.boolean, byte, short, char, int, long, float, double
C.byte, short, char, int, long, float, double
D.byte, short, char
E.int, long, float, double
7)以下代码的输出结果为:
System.out.println(" " +2 + 3);
System.out.println(2 + 3);
System.out.println(2 + 3 +"");
System.out.println(2 + "" +3);
A.第3行出现编译错误
B.输出23, 5, 5 和23.
C.输出5, 5, 5 和23.
D.输出 23, 5, 23 和23.
8)设有如下变量说明:
byte myByte;
int myInt;
long myLong;
char myChar;
float myFloat;
double myDouble;
以下赋值语句哪个需要强制转换。
A.myInt = myByte;
B.myInt = myLong;
C.myByte = 3; 自动转换:
D.myInt = myChar; byte→short→char→int→long→float→double E.myFloat = myDouble;
F.myFloat = 3;
G.myDouble = 3.0;
9)考虑如下两语句:
1. boolean passingScore = false && grade == 70; 前面错了,后面的就不算了
2. boolean passingScore = false & grade == 70; 无论前面对错,两者都要算
表达式grade == 70 在什么地方被计算
A.在 1 和 2中均计算
B.在 1 和 2中均未计算
C.在1中计算,在2中未计算
D.在2中计算,在1中未计算
E.非法,因为 false 应写 FALSE
10)设有一个整数x 其二进制值为10011100 (用1 字节表示),则执行如下语句后 z的二进制值为:
int y = 1 << 7; 化为二进制进行移位,再化为十进制,再赋值给y
int z = x & y;
A.10000001 B.10000000 C.00000001
D.10011101 E.10011100
11) 以下哪些编译正确?
A.short myshort = 99S;
B.String name = 'Excellent tutorial Mr Green';
C.char c = 17c;
D.int z = 015;
12) 以下哪些是java关键字?
A.double B.Switch C.then D.instanceof
13) 以下程序行的输出结果为?
System.out.println(010|4);
010是八进制数,化为十进制是8,再化为二进制是1000,4化为二进制是100,两者由“|”按位取或,得1100,化为十进制是12
A.14 B.0 C.6 D.12
14) 设有如下变量
char c = 'c';
int i = 10;
double d = 10;
long l = 1;
String s = "Hello";
以下哪些语句编译不出错? byte→short→char→int→long→float→double
A.c=c+i; B. s+=i; C. i+=s; D. c+=s;
15) 整型变量a,b的值定义如下:
int a=3;
int b=4;
则表达式 ++a==b的值为:
A.4 B.false C.3 D.true
16) 执行下列代码后输出结果为:
public class test {
public static void main(String args[]) {
int a=2;
int b=3;
int c=7;
int d=a>c?a:c;
d=d>>2>b? d:b;
System.out.println(b);
}
}
A.2 B.3 C.5 D.7
运算符重载基础概念练习题 1、下列运算符中, ()运算符在C++中不能重载。 A = B () C :: D delete 2、下列运算符中, ()运算符在C++中不能重载。 A ?: B [] C new D && 3、下列关于C++运算符函数的返回类型的描述中,错误的是()。 A 可以是类类型 B 可以是int类型 C 可以是void类型 D 可以是float类型 4、下列运算符不能用友元函数重载的是()。 A + B = C * D << 5、在重载运算符函数时,下面()运算符必须重载为类成员函数形式。 A + B - C ++ D -> 6、下列关于运算符重载的描述中,正确的是()。 A 运算符重载可以改变运算符的操作数的个数 B 运算符重载可以改变优先级 C 运算符重载可以改变结合性 D 运算符重载不可以改变语法结构 7、友元运算符obj>obj2被C++编译器解释为()。 A operator>(obj1,obj2) B >(obj1,obj2) C obj2.operator>(obj1) D obj1.oprator>(obj2) 8、在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是()。 A operator+有两个参数,operator*有两个参数 B operator+有两个参数,operator*有一个参数 C operator+有一个参数,operator*有两个参数 D operator+有一个参数,operator*有一个参数 9、重载赋值操作符时,应声明为()函数。 A 友元 B 虚 C 成员 D 多态 10、在一个类中可以对一个操作符进行()重载。 A 1种 B 2种以下 C 3种以下 D 多种 11、在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。
3 数据类型、运算符与表达式 一、单项选择题 1、以下选项中,不正确的 C 语言浮点型常量是( C )。 A. 160. B. 0.12 C. 2e4.2 D. 0.0 分析:e 后面的指数必须为整数。 2、以下选项中,( D )是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" 分析:在C 语言中,’a ’表示字符常量,”a ”表示字符串。 3、 在 C 语言中,字符型数据在计算机内存中,以字符的(C )形式存储。 A.原码 B.反码 C. ASCII 码 D. BCD 码 分析:将一个字符常量放入一个字符变量中,实际上并不是将字符本身放到内存单元中,而是将字符的对应的ASCII 码放到储存单元中。 4、若x 、i 、j 和k 都是int 型变量,则计算下面表达式后,x 的值是( C )。 x=(i=4,j=16,k=32) A. 4 B. 16 C.32 D.52 分析:(i=4,j=16,k=32)的值为最后一个表达式的值,即为32,所以x=32. 5、算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B )。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 分析:算术运算符包括加法运算“+”符减法运算“-”符乘法运算符“*”以及除法运算符“/”,赋值运算符包括“=、+=、-=、*=、/=、……”,关系运算符包括“<、<=、>、>=”。 6、若有代数式bc ae 3 ,则不正确的C 语言表达式是( C )。 A.a/b/c*e*3 B. 3*a*e/b/c C.3*a*e/b*c D. a*e/c/b*3 分析:C 选项表达的是3ace/b 。 7、表达式!x||a==b 等效于( D )。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) 分析:由符优先级先后顺序在!x||a==b 中应先算“||”再算“!”,最后算“==”。选项B 不影响运算顺序。 8、设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是( A )。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 分析:先算括号里面的,a 不大于b ,则m=0,c 不大于d ,则n=0. 9、 设有语句 int a=3;,则执行了语句 a+=a-=a*=a;后,变量 a 的值是( B )。 A. 3 B. 0 C. 9 D. -12 分析:从后往前算,a*=a 即a=a*a ,a=9;然后a-=a=9,a=a-9,=0;a+=0,a=a+a=0. 10、在以下一组运算符中,优先级最低的运算符是( D )。
C语言常用转义字符表 ,都必须使用转义字符表示,即在这些字符前加上反斜杠。 在C程序中使用转义字符\ d d d或者\ x h h可以方便灵活地表示任意字符。\ d d d为斜杠后面跟三位八进制数,该三位八进制数得值即为对应得八进制A S C I I码值。\ x后面跟两位十六进制数,该两位十六进制数为对应字符得十六进制A S C I I码值。 使用转义字符时需要注意以下问题: 1) 转义字符中只能使用小写字母,每个转义字符只能瞧作一个字符。 2) \v 垂直制表与\f 换页符对屏幕没有任何影响,但会影响打印机执行响应操作。 3) 在C程序中,使用不可打印字符时,通常用转义字符表示 注: 1,\v垂直制表与\f换页符对屏幕没有任何影响,但会影响打印机执行响应操作。2,\n其实应该叫回车换行。换行只就是换一行,不改变光标得横坐标;回车只就是回到行首,不改变光标得纵坐标。 3,\t 光标向前移动四格或八格,可以在编译器里设置 4,\' 在字符里(即单引号里)使用。在字符串里(即双引号里)不需要,只要用 ' 即可。 5,\? 其实不必要。只要用 ? 就可以了(在windows VC6 与tc2 中验证)。 格式控制符参考:
对64位整数得输入输出,在POJ上得C++环境下(即VC++),64位整数就是: __int64 输入输出格式为”%I64d”、 在G++环境下, 64位整数就是 long long 输入输出格式为”%lld”、 域宽及精度得描述 M:域宽,即对应得输出项在输出设备上所占字符数 若:实际数据宽度>M,按实际数据宽度输出。 实际数据宽度 运算符重载 一.单项选择题 1.下列运算符中,运算符在C++中不能重载。 A.?: B.+ C. D.<= 解:C++中不能被重载的运算符有:·,一,::,?:。本题答案为A。 2.下列运算符中,运算符在C++中不能重载。 A.&& B.[] C.:: D.new 解:c++中不能被重载的运算符有:·,·+,::,?:。本题答案为c。 3.下列关于运算符重载的描述中,是正确的。 A.运算符重载可以改变操作数的个数 B.运算符重载可以改变优先级 C.运算符重载可以改变结合性 D.运算符重载不可以改变语法结构 解:运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算程的语法结构。本题答案为D。 4.友元运算符objl>obj2被C++编译器解释为。 A.operator>(objl,obj2) B.>(obj1,obj2) C.obj2.operator:>(obj1) D.objl.operator>(obj2) 解:重载为友元函数的运算符的调用形式如下: operator<运算符>(<参数1>,<参数2>) 等价于:<参数1><运算符><参数2> 本题答案为A。 5.现需要对list类对象使用的逻辑运算符“==”重载,以下函数声明是正确的。 A、list & list::operator==(const list &a); B、list list::operator==(const list &a); C、bool & list::operator==(const list &a); D、bool list::operator==(const list &a); 6. 以下类中分别说明了“+=”和“++”运算符重载函数的原型。如果主函数中有定义: fun m,c,d;,那么,执行语句c=m++; 时,编译器把m++解释为: (33) A) c.operator++(m); B) m=operator++(m); C) m.operator++(m); D) operator++(m); class fun { public: .. .. .. fun operator +=(fun ); friend fun operator ++(fun &,int); }; 答案:D 7. 在第33题中,当执行语句d+=m; 时,C++编译器对语句作如下解释: (34) A. d=operator+=(m); B. m=operator+=(d); C. d.operator+=(m); D. m.operator+=(d); 答案:C 8. 设有以下类定义,其中说明了“+”运算符重载函数的原型。这是一个友元函数,当类 1. 以下运算符中优先级最高的是()。 A.&&B.+ C.!= D.?: 2.能正确表示逻辑关系:“a≥10或a≤0”的C语言表达式是()。 A.a>=10 or a<=0 B.a>=10| a<=0 C.a>=10 && a<=0 D.a>=10||a<=0 3. C语言中运算对象必需是整型的运算符是()。(A)+ (B)/ (C)% (D)* 4. 已知int i;float f;正确的表达式是()。 A)(int f)%i B) int(f)%i C) int(f % i) D) (int)f % i 5. 下列程序的输出结果是()。 void main( ) { int a=7,b=5; printf("%d\n",b=b%a); } (A)0 (B)1 (C)5 (D)不确定值6. 若有定义:int a=8,b=5,c;,执行语句c=a/b+0.4; 后,c的值为()。 (A)1.4 (B)1 (C)2.0 (D)2 7. 已知x=4.5,y=2.5,求表达式(x+y)/2+(int)y%(int)x的值()。 A) 3 B) 5 C) 3.5 D) 5.5 8. 已知各变量的类型如下 int i=8,k,a,b; unsigned long w=5; double x=1.42,y=5.2; 则以下符合C语言语法的表达式是()。 (A)a+=a-=(b=4)*(a=3)(B)a=a*3+2 (C)x%(-3)(D)y=float(i) 9. 已知int a,b;执行语句a=(b=3*2,b*4),a+6;后变量a的值为()。 A) 6 B) 12 C) 24 D)30 10. 若有以下程序 main() { int k=2,i=2,m; m=(k+=i*=k); 实验十三 1.实验目的 通过本次实验 (1)理解友元函数与运算符重载函数的概念; (2)学会友元函数的定义与使用方法; (3)掌握运算符重载函数的定义与使用方法; 2.实验要求 (1)编写实验程序 (2)在VC++运行环境中,输入源程序 (3)编译运行源程序 (4)输入测试数据进行程序测试; (5)写出运行结果。 3.实验内容 (1)定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。分别用成员函数与友元函数编写运算符重载函数。在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。 参考资料: (1)成员函数 # include . 《面向对象程序设计》习题 班级:学号:姓名:名单序号:成绩: 第7章运算符重载和多态性 一、选择题(共30分,每题1分) 1.下列运算符中,()运算符在C++中不能重载。 A.?: B.[] C. new D.++ 2.友元重载运算符obj1>obj2被C++编译器解释为()。 A.operator >(obj1,obj2) B.>(obj1,obj2) C.obj2.operator >(obj1) D.obj1.operator >(obj2) 3.重载赋值操作符时,应声明为()函数。 A.友元B.虚C.成员D.多态 4.在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。 A. 作为友元函数重载的1元运算符 B. 作为成员函数重载的1元运算符 C. 作为友元函数重载的2元运算符 D. 作为成员函数重载的2元运算符5.在重载一运算符时,若运算符函数的形参表中没有参数,则不可能的情况是()。 A. 该运算符是一个单目运算符。 B. 该运算符函数有一个隐含的参数this。 C. 该运算符函数是类的成员函数。 D. 该运算符函数是类的友元函数。 6. 关于运输符重载,下列表述中正确的是()。 A.C++已有的任何运算符都可以重载 B.运算符函数的返回类型不能声明为基本数据类型 . C.在类型转换符函数的定义中不需要声明返回类型 D.可以通过运算符重载来创建C++中原来没有的运算符 7. C ++流中重载的运算符>>是一个()。 A. 用于输出操作的非成员函数 B. 用于输出操作的成员函数 C. 用于输入操作的非成员函数 D. 用于输入操作的成员函数 8. 若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是()。 A. Data +(Data); B. Data operator+(Data); C. Data +operator(Data); D. operator +(Data, Data); 9. 下列运算符中哪些是不能够被重载的()。 A. .,.*,sizeof,::,?: B. ++,--,new,= = C. new,delete,>=,[ ] D. +,-,=,delete 10. 在名为BigNumber类的类体中对运算符函数double进行如下声明: operator double(BigNumbe); 函数声明中有一个明显的错误,这个错误就是()。 A.参数表中不应该有任何参数 B.缺少对函数返回类型的说明 C.参数声明中缺少参数变量 D.函数声明中缺少函数体 11. 下列关于运算符重载的描述中,正确的是()。 A. 运算符重载成为成员函数时,若参数表中无参数,重载是一元运算符 B. 一元运算符只能作为成员函数重载 C. 二元运算符重载成为非成员函数时,参数表中有一个参数 运算符重载 例子:复数加,Point 所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。运算符也可以重载。 运算符重载是对已有的运算符赋予多重含义。 C++中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)(一) C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。 (二)C++允许重载的运算符C++中绝大部分的运算符允许重载. 不能重载的运算符只有5个: (1) 成员访问运算符. ???? (2) 作用域运算符∷ (3) 条件运算符?: (4) 成员指针运算符* ????? (5) 编译预处理命令的开始符号# (三) 重载不能改变运算符运算对象(即操作数)的个数。 (四) 重载不能改变运算符的优先级别。 (五) 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(3)点矛盾。 (六) 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质。 (七) 用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。 ①赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。 ②地址运算符&也不必重载,它能返回类对象在内存中的起始地址。 总之,当C++语言原有的一个运算符被重载之后,它原先所具有的语义并没有消失,只相当于针对一个特定的类定义了一个新的运算符。 C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) { 实验五运算符重载 【实验目的】 1.进一步了解运算符重载的概念和使用方法。 2.掌握几种常用的运算符重载的方法。 3.了解转换构造函数的使用方法。 4.了解在Visual C++6.0环境下进行运算符重载要注意的问题. 【实验要求】 1.硬件基本配置:Intel PentiumIII以上级别的CPU,大于64MB的内存。 2.软件要求:Window 2000操作系统,Visual Studio 6.0或更高版本开发环境。 3.实验学时:2学时 4.实现实验内容中的题目。 5.写实验报告 【实验内容】 (1)声明一个复数类Complex,重载运算符“+’’,“一”,“*”,“/”使之能用于复数的加、减、乘、除.运算符重载函数作为Complex类的成员函数,重载流提取运算符实现对复数的输出。编程序,分别求两个复数之和、差、积和商并用重载后的流运算符进行输出。 请思考:你编的程序能否用于一个整数与一个复数的算术运算?如4+ (5-2i). (2)声明一个复数类Complex,重载运算符“+“,使之能用于复数的加法运算。 参加运算的两个运算量可以都是类对象.也可以其中有一个是整数,顺序任意。例如, cl+c2, i+cl,cl+i均合法(设i为整数,c1, c2为复数)。 运行程序.分别求两个复数之和、整数和复数之和。 (3)有两个矩阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于矩阵相加。如c=a+b。重载流提取运算符实现对矩阵的输出如:cout< 第10章运算符重载 一、选择题 1.在下列运算符中,不能重载的是( )。 (a) ! (b) sizeof (c) new (d) delete 2. 在下列运算符中,不能重载的是( )。 (a) <= (b) >> (c) && (d) &= 3.下列关于运算符重载的描述中,( )是正确的。 (a) 可以改变参与运算的操作数个数 (b) 可以改变运算符原来的优先级 (c) 可以改变运算符原来的结合性(d) 不能改变原运算符的语义 4.下列函数中,能重载运算符的函数是( b,c )。 (a) 成员函数(b) 构造函数(c) 析构函数 (d) 友员函数 5.不能用友员函数重载的是( a )。 (a) = (b) == (c) += (d) != 6.下面描述中,错误的是( b )。 (a) 只有系统预先定义的运算符才可能被重载 (b) 使用类型转换函数不能把一个类转换为另一个类 (c) 使用类型转换函数可以把类转换为基本类型 (d) 类型转换函数只能定义为一个类的成员函数,不能定义为类的友员函数 二、阅读下列程序,写出执行结果 1.#include HTML常用符号: 显示一个空格 <小于< < >大于> > &&符号& & " 双引号" " 其他常用的字符实体(Character Entities) 显示结果说明Entity Name Entity Number ? 版权© © ? 注册商标® ® ×乘号× × ÷除号÷ ÷ ISO Latin-1字符集: 字符十进制字符编号实体名字说明 --- --- 制表符Horizontal tab ---
--- 换行Line feed ---
--- 回车Carriage Return --- Space ! ! --- 惊叹号Exclamation mark " " " 双引号Quotation mark # # --- 数字标志Number sign $ $ --- 美元标志Dollar sign % % --- 百分号Percent sign && & Ampersand " ' --- 单引号Apostrophe ( ( --- 小括号左边部分Left parenthesis ) ) --- 小括号右边部分Right parenthesis * * --- 星号Asterisk + + --- 加号Plus sign , , --- 逗号Comma - - --- 连字号Hyphen . . --- 句号Period (fullstop) / / --- 斜杠Solidus (slash) 0 0 --- 数字0 Digit 0 1 1 --- 数字1 Digit 1 2 2 --- 数字2 Digit 2 3 3 --- 数字3 Digit 3 4 4 --- 数字4 Digit 4 5 5 --- 数字5 Digit 5 6 6 --- 数字6 Digit 6 7 7 --- 数字7 Digit 7 8 8 --- 数字8 Digit 8 9 9 --- 数字9 Digit 9 : : --- 冒号Colon 二、运算符重载(运算符重载的基本概念、运算符重载方法、运算符重载规则、特殊运算符重载和类型转换) 单选题10道: 1、假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,则该成员函数的声明语句为( B )。 A. AB operator+(AB& a,AB& b) B. AB operator+(AB& a) C. operator+(AB a) D. AB &operator+( ) 2、关于运算符重载,下面的叙述错误的是()。 A.运算符预定义的操作数个数不能改变 B.重载不能改变运算符的优先级顺序 C.参数的类型没有限制 D.尽量使其与原意保持一致 3、在一个类中可以对一个操作符进行(D )重载。 A. 1种 B. 2种以下 C. 3种以下 D. 多种 4、重载赋值操作符时,应声明为(C )函数。 A. 友元 B. 虚 C. 成员 D. 多态 5、要在类对象使用运算符,以下不必被重载的运算符是( A )。 A. [] B. = C. ++ D. -- 6、下列运算符中,不能重载的是(C ) A.new B.() C.::D.&& 7、在表达式x+y*z中,+ 是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是( A )。 A)operator+有两个参数,operator*有两个参数 B)operator+有两个参数,operator*有一个参数 C)operator+有一个参数,operator*有两个参数 D)operator+有一个参数,operator*有一个参数 8、友元运算符obj1>obj2被C++编译器解释为()。 A) operator>(obj1,obj2) B) >(obj1,obj2) C) obj1.operator>(obj2) D) obj2.operator>(obj1) 9、已知某个类的友元函数重载了+=和-,a,b,c是该类的对象,则“a+=b-c”被C++编译器解释为()。 A) operator+=(a,operator-(b,c)) B) a.operator+=(b.operator-(c)) C) operator+=(a,b.operator-(c)) D) a.operator+=(operator-(b,c)) 10、下列运算符中,必须使用成员函数进行重载的是()。 A) == B) = C) >> D) ++ 填空题10道: 1、多数运算符既能作为类的成员函数重载,也能作为类的非成员函数重载,但运算符“[]”只能作为类的函数重载。 2、加法运算符“+”和赋值运算符“=”都重载之后,“+=”也被重载了。 3、单目运算符作为类的成员函数重载时形参。 4、利用成员函数对二元运算符重载时,其右操作数为。 5、重载运算符函数的函数名由关键字引出。 6、运算符的重载归根结底是的重载。 7、后缀自增自减运算符定义时带有一个。 C语言运算符与表达式的练习题 单项选择题 (1)以下选项中,正确的 C 语言整型常量是(D)。 A. 32L B. 510000 C. -1.00 D. 567 (2)以下选项中,(D)是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3)字符串的结束标志是(C)。 A. 0 B. '0' C. '\0' D. "0" (4)算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (5)逻辑运算符中,运算优先级按从高到低依次为(D)。 A. && ! || B. || && ! C. && || ! D. ! && || (6)表达式!x||a==b 等效于(D)。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (7)设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是(A)。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 *(8)设有语句 int a=3;,则执行了语句 a+=a-=a*=a; 后,变量 a 的值是(B)。 A. 3 B. 0 C. 9 D. -12 (9)在以下一组运算符中,优先级最低的运算符是(D)。 A. * B. != C. + D. = (10)设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B,上机13)。 A. 6 B. 12 C. 15 D. 表达式出错 (11)若已定义 x 和 y为double 类型,则表达式的值是(D)。 实验十运算符重载1.实验目的及要求 1)掌握运算符重载的基本概念和方法。 2)熟习几种特殊的运算符的重载。 2.实验内容 1.分析下面的程序,指出程序运行的结果: 1) #include 运行结果为: 30,30 Press any key to continue 2)分析下面程序,指出程序运行的结果: #include 实验五运算符重载、继承 ●实验目的 1、了解类的两种使用方式。 2、学习从现有类派生出新类的方式。 3、了解在派生类中如何使用基类的成员。 4、了解基类成员在派生类中的访问控制。 5、掌握运算符重载的方法。 ●实验内容 1、从类Person中派生出一个教师类,新增的属性有专业(Specialty)、职称(Position)和主讲课程(MajorCourse,一门),并为这些属性定义相应的方法。 [实现要求] Person类的设计如下,请将空白处补充完整。 class Person { string Name; int Age; string Sex; public: void Register(char *name,int age,char *sex) { ; Age=age; Sex=sex; } string GetName() { } string GetSex() { return Sex; } int GetAge() { } void ShowMe() { cout< //带参数的构造函数去初始化各个成员的值,使其显示运行结果的第一行t.TeacherRegister("张三",40, "f","计算机","副教授","C++"); t.ShowMe(); return 0; } 运行结果如下: XXX m 0 XXX XXX XXX 张三 f 40 计算机副教授C++ [思考问题] ①在Teacher类中是否要需要重新定义ShowMe成员函数?不重新定义ShowMe成员函数能否得到上述要求的运行结果?为什么? 2、从Point类中派生出一个Line类。Line类增加一个数据成员EndPoint,计算线的长度。 [实现提示] Point类可以按下面方式进行设计: class Point{ int x,y; public: Point(int a=0,int b=0){SetPoint(a,b);} void SetPoint(int a,int b); //设置点的坐标值 int GetX(){return x;} int GetY(){return y;} void Print(); //显示点的坐标值 }; Line类增加一个数据成员EndPoint为Point类对象,注意在设计Line类的构造函数时应为其基类和对象成员EndPoint提供形参。 为了检验Line类的功能,主函数按如下方式设计: int main(){ Line line(1,1,10,10); cout<<"Line line:"; line.Print(); cout<<"\n线line的长度:"; cout< C语言常用转义字符 语言常用转义字符表 页脚内容1 字符常量中使用单引号和反斜杠以及字符常量中使用双引号和反斜杠时,都必须使用转义字符表示,即在这些字符前加上反斜杠。 在C程序中使用转义字符\ d d d或者\ x h h可以方便灵活地表示任意字符。\ d d d为斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制A S C I I码值。\ x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制A S C I I码值。 使用转义字符时需要注意以下问题: 1) 转义字符中只能使用小写字母,每个转义字符只能看作一个字符。 2) \v 垂直制表和\f 换页符对屏幕没有任何影响,但会影响打印机执行响应操作。 3) 在C程序中,使用不可打印字符时,通常用转义字符表示 页脚内容2 注: 1,\v垂直制表和\f换页符对屏幕没有任何影响,但会影响打印机执行响应操作。 2,\n其实应该叫回车换行。换行只是换一行,不改变光标的横坐标;回车只是回到行首,不改变光标的纵坐标。 3,\t 光标向前移动四格或八格,可以在编译器里设置 4,\' 在字符里(即单引号里)使用。在字符串里(即双引号里)不需要,只要用' 即可。 5,\? 其实不必要。只要用? 就可以了(在windows VC6 和tc2 中验证)。 格式控制符参考: 对64位整数的输入输出,在POJ上的C++环境下(即VC++),64位整数是: __int64 输入输出格式为”%I64d”. 在G++环境下,64位整数是 long long 输入输出格式为”%lld”. 域宽及精度的描述 页脚内容3 实验十六运算符重载 一、实验目的 1、理解运算符重载作用和意义; 2、掌握类运算符和友元运算符重载的定义和使用; 3、掌握常用运算符(++、--、+、-、*、/、=、+=、-=、*=、/=、<<(插入)、>>(提取))的重载。 二、实验内容 1、下列程序定义了一个复数类,重载"+"运算符以实现复数的加法运算。 #include 一、运算符重载的规则 运算符重载规则如下: ①、C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。 ②、重载之后运算符的优先级和结合性都不会改变。 ③、运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。 不能重载的运算符只有五个,它们是:成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”。 运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。 运算符重载为类的成员函数的一般语法形式为: 函数类型 operator 运算符(形参表) { 函数体; } 运算符重载为类的友元函数的一般语法形式为: friend 函数类型 operator 运算符(形参表) { 函数体; } 其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。 当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。 运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式,以适应用户自定义类型的类似运算。 一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便此,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。 二、运算符重载为成员函数 对于双目运算符B,如果要重载B为类的成员函数,使之能够实现表达式oprd1 B oprd2,其中oprd1为类A的对象,则应当把B重载为A类的成员函数,该函数只有一个形参,形参的类型是oprd2所属的类型。经过重载后,表达式oprd1 B oprd2 就相当于函数调用 oprd1.operator B(oprd2).运算符重载练习题.
运算符与表达式练习题附答案
实验8--友元函数与运算符重载函数
运算符重载知识题
运算符重载
实验五 运算符重载
运算符重载练习1
HTML转义符号
运算符重载题目
(完整word版)C语言运算符与表达式的练习题答案
实验十_运算符重载
实验5-运算符重载、继承 ( 1 )
C语言常用转义字符
实验十六运算符重载解读
C++运算符重载