Microsoft Word - 新正文.doc

Size: px
Start display at page:

Download "Microsoft Word - 新正文.doc"

Transcription

1 第 6 章运算符重载 运算符重载是面向对象程序设计的重要特性 运算符重载是对已有的运算符赋予多重含义, 使同一个运算符作用于不同类型的数据时触发不同的响应 C++ 中经重载后的运算符能直接对用户自定义的数据进行操作运算, 这就是 C++ 语言中的运算符重载所提供的功能 通过本章的学习, 读者应该掌握以下内容 : 运算符重载函数的定义及规则 友元运算符重载函数的定义与使用 成员运算符重载函数的定义与使用 几种常用运算符的重载 类型转换运算符的重载 6.1 运算符重载概述 在前一章中曾提到过,C++ 中运行时的多态性主要通过虚函数来实现, 而编译时的多态性由函数重载和运算符重载来实现 本章主要讲解 C++ 中有关运算符重载方面的内容 在讲解本章之前, 有一些基础知识需要我们去理解 而运算符重载的基础就是运算符重载函数, 所以本节主要讲的是运算符重载函数 运算符重载函数的定义 运算符重载是对已有的运算符赋予多重含义, 使同一个运算符作用于不同类型的数据时触发不同的响应 比如 : int i; int i1=10,i2=10; i=i1+i2; cout<<"i1+i2="<<i<<endl; double d; double d1=20,d2=20; d=d1+d2; cout<<"d1+d2="<<d<<endl; 在这个程序里 + 既完成两个整型数的加法运算, 又完成了两个双精度数的加法运算 为什么同一个运算符 + 可以用于完成不同类型的数据的加法运算? 这是因为 C++ 针对预定义的基本数据类型已经对 + 运算符进行了适当的重载 在编译程序编译不同类型数据的加法表达式时, 会自动调用相应类型的加法运算符重载函数

2 第 6 章运算符重载 193 但是 C++ 中所提供的预定义的基本数据类型毕竟是有限的, 在解决一些实际的问题时, 往往需要用户自定义数据类型 例如, 在解决科学与工程计算问题时, 往往要使用复数 矩阵等 下面定义一个简化的复数类 complex: class complex double real,imag; complex(double r=0,double i=0) real=r; imag=i; ; 若要把类 complex 的两个对象 com1 和 com2 加在一起, 下面的语句无法实现此功能 : int main() complex com1(1.1,2.2),com2(3.3,4.4),total; total=com1+com2; // 错误 // return 0; 会提示没有与这些操作数匹配的 + 运算符的错误 这是因为 complex 类不是预定义类型, 系统没用对该类型的数据进行加法运算符函数的重载 C++ 为运算符重载提供了一种方法, 即运算符重载函数 其函数名字为 operator 后紧跟重载运算符 运算符函数定义的一般格式如下 : 返回类型 operator 运算符符号 ( 参数表 ) 函数体 若要将上述类 complex 的两个对象相加, 只要编写一个运算符函数 operator+(), 如下所示 : complex operator+(complex om1,complex om2) complex temp; temp.real=om1.real+om2.real; temp.imag=om1.imag+om2.imag; return temp; 重载后就能方便地使用语句 : total=com1+com2; 对类 complex 的两个对象 com1 和 com2 相加 当然, 在程序中可以使用以下的调用语句, 对两个 complex 类对象执行加操作 : total=operator+(com1,com2); 以上两个调用语句是等价的, 但是直接用 com1+com2 的形式更加符合人的书写习惯 以下就是使用运算符重载函数 operator+() 将两个 complex 类对象相加的完整程序 例 6.1 运算符重载完成两个复数相加 class complex

3 194 C++ 面向对象程序设计 double real,imag; complex(double r=0,double i=0) real=r; imag=i; ; complex operator+(complex om1,complex om2) complex temp; temp.real=om1.real+om2.real; temp.imag=om1.imag+om2.imag; return temp; int main() complex com1(11.1,12.2),com2(13.3,14.4),sum; sum=com1+com2; cout<<"real="<<sum.real<<" "<<"imag="<<sum.imag<<endl; return 0; 程序运行结果为 : real=24.4 imag= 运算符重载的规则 C++ 对运算符重载制定了以下一些规则 : (1) 重载运算符与预定义运算符的使用方法完全相同, 被重载的运算符不改变原来的操作数个数 优先级和结合性 (2) 重载的运算符只能是运算符集中的运算符, 不能另创新的运算符 (3) 在 C++ 中, 大多数系统预定义的运算符可以被重载, 但也有些运算符不能被重载, 如类属关系运算符. 成员指针运算符.* 及 ->* 作用域标识符 :: sizeof 运算符和三目运算符?: (4) 运算符的含义可以改变, 但最好不要改变 如实数的加法运算可以用乘法运算符来实现 (5) 不能改变运算符对预定义类型的操作方式, 即至少要有一个操作对象是自定义类型, 这样做的目的是为了防止用户修改用于基本类型数据的运算符性质 (6) 运算符重载函数不能包括缺省的参数 (7) 除赋值运算符重载函数外, 其他运算符重载函数都可以由派生类继承 (8) 运算符的重载实际上是函数的重载 编译程序对运算符重载的选择, 遵循函数重载的选择原则 当遇到不很明显的运算符时, 编译程序将去寻找参数匹配的运算符函数 (9) 用于类对象的运算符一般必须重载, 但有两个例外, 运算符 = 和 & 不必用户重载 : 1 赋值运算符 = 可以用于每一个类对象, 可以利用它在同类对象之间相互赋值 2 地址运算符 & 也不必重载, 它返回类对象在内存中的起始地址

4 第 6 章运算符重载 195 (10) 运算符的重载只能显式重载, 不能隐式重载 例如重载了 +, 并不表示可以自动重载 +=, 要想执行 += 运算, 必须再对其进行显式的重载 6.2 运算符重载函数的两种形式 运算符重载与函数重载相似, 其目的是设置某一运算符, 让它实现另一种功能, 尽管此运算符在原先 C++ 中代表另一种含义, 但它们彼此之间并不冲突 例 6.1 中的运算符重载函数不属于任何类, 是全局的函数 因为在 complex 类 ( 复数类 ) 中的数据成员是公有的, 所以运算符重载函数可以被访问 但如果定义为私有呢, 那该怎么办 实际上, 运算符的重载有两种形式, 定义为类的友元函数 ; 定义为它将要操作的类的成员函数 前者称为友元运算符函数, 后者称为成员运算符函数 友元运算符重载函数 在 C++ 中, 可以把运算符重载函数定义成某个类的友元函数, 称为友元运算符重载函数 1. 友元运算符重载函数定义的语法形式 (1) 在类的内部, 定义友元运算符重载函数的格式如下 : friend 返回类型 operator 运算符 ( 形参表 ) 函数体 (2) 友元运算符重载函数也可以只在类中声明友元重载函数的原型, 在类外定义 在类中, 声明友元重载函数的原型的格式如下 : class X friend 返回类型 operator 运算符 ( 形参表 ); 在类外定义友元运算符重载函数的格式如下 : 返回类型 operator 运算符 ( 形参表 ) 函数体 说明 : X 是重载此运算符的类名, 返回类型指定了友元运算符函数的运算结果的类型 ; operator 是定义运算符重载的关键字 ; 运算符就是需要重载的运算符名称, 需满足 节中约定的规则 ; 形参表中给出重载运算符所需要的参数和类型 ; 关键字 friend 表明这是一个友元函数 当运算符重载函数为友元函数时, 将没有隐含的参数 this 指针 这样, 对双目运算符友元函数带两个参数, 对单目运算符友元函数带一个参数

5 196 C++ 面向对象程序设计 2. 友元函数重载双目运算符双目运算符带两个操作数, 通常在运算符的左右两侧, 例如 : 3+5,24>13 当用友元函数重载双目运算符时, 两个操作数都要传递给运算符重载函数 请看下面的例子 例 6.2 用友元运算符重载函数完成复数的加 减 乘 除 class complex complex(double r=0,double i=0) real=r; imag=i; void print(); friend complex operator+(complex a,complex b); friend complex operator-(complex a,complex b); friend complex operator*(complex a,complex b); friend complex operator/(complex a,complex b); private: double real; double imag; ; complex operator+(complex a,complex b) complex temp; temp.real=a.real+b.real; temp.imag=a.imag+b.imag; return temp; complex operator-(complex a,complex b) complex temp; temp.real=a.real-b.real; temp.imag=a.imag-b.imag; return temp; complex operator*(complex a,complex b) complex temp; temp.real=a.real*b.real-a.imag*b.imag; temp.imag=a.real*b.imag+a.imag*b.real; return temp;

6 第 6 章运算符重载 197 complex operator/(complex a,complex b) complex temp; double t; t=1/(b.real*b.real+b.imag*b.imag); temp.real=(a.real*b.real+a.imag*b.imag)*t; temp.imag=(b.real*a.imag-a.real*b.imag)*t; return temp; void complex::print() cout<<real; if(imag>0)cout<<"+"; if(imag!=0)cout<<imag<<"i\n"; void main() complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6; A3=A1+A2; A4=A1-A2; A5=A1*A2; A6=A1/A2; A1.print(); A2.print(); A3.print(); A4.print(); A5.print(); A6.print(); 程序运行结果为 : i i i i i i 当用友元函数重载双目运算符时, 两个操作数都要传递给运算符函数 一般而言, 如果在类 X 而 aa 和 bb 是类 X 的两个对象, 则采用以下两种方法调用是等价的 : aa@bb // 隐式调用 aa.operator@(bb)// 显式调用 如上例中, 主函数 main() 中的语句 : A3=A1+A2; A4=A1-A2;

7 198 C++ 面向对象程序设计 A5=A1*A2; A6=A1/A2; 可以改写为 : A3=operator+(A1,A2); A4=operator-(A1,A2); A5=operator*(A1,A2); A6=operator/(A1,A2); 说明 : (1) 在函数返回时, 也可直接用类的构造函数来生成一个临时对象, 而不对该对象进行命名 例如 : complex operator+(complex a,complex b) complex temp; temp.real=a.real+b.real; temp.imag=a.imag+b.imag; return temp; 改为 : complex operator+(complex a,complex b) return complex(a.real+b.real,a.imag+b.imag); 在返回语句中, 通过构造函数建立临时对象作为返回值 这个临时对象没有对象名, 是一个无名对象 (2)Visual C 提供的不带后缀.h 的头文件不支持友元运算符重载函数, 在 Visual C 中编译会出错, 需要采用带后缀的.h 头文件 例如 : 将程序中的 #include<iostream> using namespace std; 修改为 : 编译可以通过 3. 友元函数重载单目运算符用友元函数重载单目运算符时, 需要一个显式的操作数 例 6.3 用友元函数重载单目运算符 - class nclass int a,b; nclass(int x=0,int y=0) a=x;b=y; friend nclass operator -(nclass obj);

8 第 6 章运算符重载 199 void show(); ; nclass operator-(nclass obj) obj.a=-obj.a; obj.b=-obj.b; return obj; void nclass::show() cout<<"a="<<a<<" b"<<b<<endl; main() nclass ob1(10,20),ob2; ob1.show(); ob2=-ob1; ob2.show(); return 0; 程序运行结果为 : a=10 b20 a=-10 b-20 使用友元函数重载 ++, -- 单目运算符时, 可能会出现一些错误 例 6.4 用友元函数重载单目运算符 ++ #include <iostream.h> class Point private: int x; int y; Point(int x,int y) this->x=x; this->y=y; friend void operator++(point point);// 友元函数重载单目运算符 ++ void showpoint(); ; void operator++(point point)// 友元运算符重载函数 ++point.x; ++point.y; void Point::showPoint() cout<<"("<<x<<","<<y<<")"<<endl;

9 200 C++ 面向对象程序设计 int main() Point point(10,10); point.showpoint(); ++point;// 或 operator++(point) point.showpoint();// 输出坐标值 return 0; 程序运行结果为 : (10,10) (10,10) 而我们希望的结果为 : (10,10) (11,11) 显然这个结果与我们期望的结果有很大出入, 产生这个错误的原因是因为友元函数没有 this 指针, 所以不能引用 this 指针所指的对象 这个函数采用对象通过值传递的方式传递参数, 函数内对 point 的所有修改都无法传到主调函数中去 因此, 使用友元函数重载单目运算符 ++ 或 -- 时, 采用引用参数来传递操作数, 使得函数参数的任何改变都影响产生调用的操作数, 从而保持了运算符 ++ 或 -- 的原义 例 6.5 友元函数采用引用参数重载单目运算符 ++ #include <iostream.h> class Point private: int x; int y; Point(int x,int y) this->x=x; this->y=y; friend void operator++(point &point);// 友元函数重载单目运算符 ++ void showpoint(); ; void operator++(point &point)// 友元运算符重载函数 ++point.x; ++point.y; void Point::showPoint() cout<<"("<<x<<","<<y<<")"<<endl; int main()

10 第 6 章运算符重载 201 Point point(10,10); point.showpoint(); ++point;// 或 operator++(point) point.showpoint();// 输出坐标值 return 0; 程序运行结果为 : (10,10) (11,11) 从上述程序可以看出, 当用友元函数重载单目运算符 ++, 参数表中有一个操作数 aa 一般可以采用以下两种方式来调用 : Operator++(aa); // 显示调用 ++aa; // 隐式 ( 习惯 ) 调用 说明 : (1) 运算符重载函数 operator++() 可以返回任何类型, 甚至可以是 void 类型, 但通常返回类型与它所操作的类的类型相同, 这样可使重载运算符用在复杂的表达式中 例如, 可以将几个复数连续进行加运算 : A4=A3+A2+A1; (2) 不能用友元函数重载的运算符是 := () [] -> (3)C++ 编译器根据参数的个数和类型来决定调用哪个重载函数 因此, 可以为同一个运算符定义几个运算符重载函数来进行不同的操作 (4) 由于单目运算符 - ( 取反 ) 可不改变操作数自身的值, 所以单目运算符 - 的友元运算符重载函数的原型可写成 : friend AB operator-(ab obj); 通过传值的方式传送参数 成员运算符重载函数 在 C++ 中, 可以把运算符重载函数定义成某个类的成员函数, 称为成员运算符重载函数 1. 成员运算符重载函数定义的语法形式 (1) 在类的内部, 定义成员运算符重载函数的格式如下 : 返回类型 operator 运算符 ( 形参表 ) 函数体 (2) 成员运算符重载函数也可只在类中声明成员函数的原型, 在类外进行定义 在类中, 声明成员运算符重载函数原型的格式如下 : class X 返回类型 operator 运算符 ( 形参表 );

11 202 C++ 面向对象程序设计 在类外, 定义成员运算符重载函数的格式如下 : 返回类型 X::operator 运算符 ( 形参表 ) 函数体 说明 : (1)X 是重载此运算符的类名, 返回类型指定了成员运算符重载函数的运算结果类型 (2)operator 是定义运算符重载的关键字 (3) 运算符就是需要重载的运算符名称, 需满足 节中约定的规则 (4) 形参表中给出重载运算符所需要的参数和类型 根据成员运算符重载函数中操作数的不同, 可将运算符分为单目运算符与双目运算符 若为双目运算符, 则成员运算符重载函数的参数表中只有一个参数, 若为单目运算符, 则参数表为空 2. 用成员函数重载双目运算符对双目运算符而言, 成员运算符重载函数的参数表中仅有一个参数, 它作为运算符的右操作数, 此时当前对象作为运算符的左操作数 它是通过 this 指针隐含地传递给函数的 例如 : class comlpex // ; complex operator+(complex a); // ; ; 在类 complex 中声明了重载 + 的成员运算符函数, 返回类型为 complex, 它具有两个操作数, 一个是当前对象, 是左操作数, 另一个是对象 a, 是右操作数 例 6.6 采用成员函数重载运算符来完成复数的加 减 乘 除 class complex complex(double r=0.0,double i=0.0) real=r; imag=i; void print(); complex operator+(complex a); complex operator-(complex a); complex operator*(complex a); complex operator/(complex a); private: double real; double imag; ;

12 第 6 章运算符重载 203 complex complex::operator+(complex a) // 实现复数加法运算的成员函数 complex temp; temp.real=a.real+real; temp.imag=a.imag+imag; return temp; complex complex::operator-(complex a) complex temp; temp.real=real-a.real; temp.imag=imag-a.imag; return temp; complex complex::operator*(complex a) complex temp; temp.real=real*a.real-imag*a.imag; temp.imag=real*a.imag+imag*a.real; return temp; complex complex::operator/(complex a) complex temp; double t; t=1/(a.real*a.real+a.imag*a.imag); temp.real=(real*a.real+imag*a.imag)*t; temp.imag=(a.real*imag-real*a.imag)*t; return temp; void complex::print() cout<<real; if(imag>0)cout<<"+"; if(imag!=0)cout<<imag<<"i\n"; void main() complex A1(2.3,4.6),A2(3.6,2.8),A3,A4,A5,A6; A3=A1+A2; A4=A1-A2; A5=A1*A2; A6=A1/A2; A1.print(); A2.print(); A3.print();

13 204 C++ 面向对象程序设计 A4.print(); A5.print(); A6.print(); 程序运行结果为 : i i i i i i 在上述例题中, 主函数中以下四条语句 : A3=A1+A2; A4=A1-A2; A5=A1*A2; A6=A1/A2; 实质上是对运算符 + - * / 的重载, 程序执行到这四条语句时,C++ 将其解释为 : A3=A1.operator+(A2); A4=A1.operator-(A2); A5=A1.operator*(A2); A6=A1.operator/(A2); 由此可知, 成员运算符重载函数 实际上是由双目运算符的左边对象 A1 调用的 尽管参数表中只有一个操作数 A2, 但另一个操作数由对象 A1 通过 this 指针隐含地传递 一般而言, 后, 可以采用如下两种方法来调用 : aa@bb // 隐式调用 aa.operator@(bb)// 显式调用成员运算符重载函数 operator@ 所需要的一个操作数由当前调用成员运算符重载函数的对象 aa 通过 this 指针隐含地传递 因此它的参数表中只有一个操作数 bb 3. 用成员函数重载单目运算符对单目运算符而言, 成员运算符重载函数的参数表中没有参数, 此时当前对象作为运算符的唯一操作数 例 6.7 成员运算符重载函数重载单目运算符 ++ #include <iostream.h> class coord int x,y; coord(int i=0,int j=0); void print(); coord operator++(); ; coord::coord(int i,int j) x=i;y=j;

14 第 6 章运算符重载 205 void coord::print() cout<<"x="<<x<<",y="<<y<<endl;; coord coord::operator++() ++x; ++y; return *this; int main() coord ob(10,20); ob.print(); ++ob; ob.print(); ob.operator++(); ob.print(); return 0; 程序运行结果为 : x=10,y=20 x=11,y=21 x=12,y=22 从本例可以看出, 当成员函数重载单目运算符时, 没有参数被显式地传递给成员运算符重载函数, 参数是通过 this 指针隐含地传递给函数 一般而言, 后, 可采用如下两种方法来调用 // 隐式调用 aa.operator@()// 显式调用 成员运算符重载函数 operator@ 所需要的操作数由当前调用成员运算符重载函数的对象 aa 通过 this 指针隐含地传递, 因此, 它的参数表中没有参数 友元运算符重载函数与成员运算符重载函数的比较 (1) 对双目运算符而言, 成员运算符重载函数带一个参数, 而友元运算符重载函数带两个参数 ; 对单目运算符而言, 成员运算符重载函数不带参数, 而友元运算符重载函数带一个参数 (2) 双目运算符一般可以重载为友元运算符重载函数或成员运算符重载函数 如果运算符重载函数中两个操作数类型不同, 则一般只能采用友元运算符重载函数, 而且有些情况必须采用友元函数 例 6.8 在类 AB 中, 用成员运算符函数重载 + 运算符 class AB AB(int x=0,int y=0);

15 206 C++ 面向对象程序设计 AB operator+(int x); void show(); private: int a,b; ; AB::AB(int x,int y) a=x; b=y; AB AB::operator+(int x) AB temp; temp.a=a+x; temp.b=b+x; return temp; void AB::show() cout<<"a="<<a<<" "<<"b="<<b<<endl; void main() AB ob1(50,60),ob2; ob2=ob1+20; ob2.show(); //ob2=30+ob1; 编译报错 ob2.show(); 在本程序中类 AB 的对象 ob1 与 20 做加法运算, 以下语句是正确的 : ob2=ob1+20; 由于对象 ob1 是运算符 + 的左操作数, 所以它调用了 + 运算符重载函数, 把一个整数加到了对象 ob1 的某些元素上 然而, 下一条语句就不能正常工作了 : ob2=30+ob1; 程序编译会报错, 原因是由于 30 是系统预定义的数据类型, 不能对成员函数进行调用, 成员函数的调用一般是通过对象来调用的, 解决这个问题的办法是用两个友元函数来重载运算符函数 +, 可以将两个参数都显式地传递给运算符函数 这样系统预定义的数据类型就可以出现在运算符的左边, 请看下面的例子 例 6.9 系统预定义数据类型出现在运算符的左边 class AB AB(int x=0,int y=0);

16 第 6 章运算符重载 207 friend AB operator+(ab ob,int x); friend AB operator+(int x,ab ob); void show(); private: int a,b; ; AB::AB(int x,int y) a=x; b=y; AB operator+(ab ob,int x) AB temp; temp.a=ob.a+x; temp.b=ob.b+x; return temp; AB operator+(int x,ab ob) AB temp; temp.a=x+ob.a; temp.b=x+ob.b; return temp; void AB::show() cout<<"a="<<a<<" "<<"b="<<b<<endl; void main() AB ob1(50,60),ob2; ob2=ob1+20; ob2.show(); ob2=40+ob1; ob2.show(); 程序运行结果为 : a=70 b=80 a=90 b=100 (3) 成员运算符重载函数和友元运算符重载函数都有两种调用方式 : 显式调用与隐式调用 (4) 运算符的优先级决定怎样将一个表达式改写为函数调用形式 如 : a+b*c a+b*!c operator+(a,operator*(b,c)) operator+(a,operator*(b,c.operator!()))

17 208 C++ 面向对象程序设计 a*(b+c) operator*(a,operator+(b,c)) a+b+c operator+(operator+(a,b),c) a=b+=c operator=(b.opertaor+=( c )) (5) 对同一运算符重载时, 成员函数重载比友元函数重载少一个参数 (6)C++ 的大部分运算符既可以说明为友元运算符重载函数, 也可说明为成员运算符重载函数 一般来讲, 单目运算符最好重载为成员函数, 而双目运算符则最好重载为友元函数 6.3 几种常用运算符重载 前缀运算符和后缀运算符的重载 针对预定义数据类型,C++ 提供了自增运算符 ++ 和自减运算符 --, 这两个运算符都有前缀与后缀两种形式 早期 C++ 版本虽然能重载这两个运算符, 但不能区分它们的两种形式 在后期的 C++ 版本中, 编译器可以通过在运算符函数参数表中是否包含关键字 int 来区分前缀与后缀 以 ++ 重载运算符为例, 其语法格式如下 : (1) 成员运算符重载函数 < 函数类型 > operator ++(); // 前缀运算 < 函数类型 > operator ++(int); // 后缀运算 在调用后缀方式的函数时, 参数 int 一般被传值为 0 (2) 友元运算符重载函数 friend < 函数类型 > operator ++(X &ob); // 前缀运算 friend < 函数类型 > operator ++(X &ob,int); // 后缀运算 在调用后缀方式的函数时, 参数 int 一般被传值为 0 重载 -- 可以采用类似的方法 例如, 已知对象 ob, 使用前缀方式 ++ 调用形式有以下几种 : ++ob;// 隐式调用 operator++(ob);// 显式调用, 友元运算符重载函数 ob.operator++();// 显式调用, 成员运算符重载函数 使用后缀方式 ++ 调用形式有以下几种 : ob++;// 隐式调用 operator++(ob,0);// 显式调用, 友元运算符重载函数 ob.operator++(0);// 显式调用, 成员运算符重载函数 例 6.10 成员运算符函数重载 ++ 的前缀和后缀方式 class over void init(int x) a=x; void print() cout<<"a="<<a<<endl; over operator++()

18 第 6 章运算符重载 a; return *this; over operator++(int) a++; return *this; private: int a; ; void main() over obj1,obj2; obj1.init(2); obj2.init(4); obj1.operator++();//++obj1 obj2.operator++(0);//obj2++ obj1.print(); obj2.print(); 程序运行结果为 : a=3 a=5 例 6.11 友元运算符函数重载 -- 的前缀和后缀方式 class over void init(int x) a=x; void print() cout<<"a="<<a<<endl; friend over operator--(over &ob) --ob.a; return ob; friend over operator--(over &ob,int) ob.a--; return ob; private: int a; ;

19 210 C++ 面向对象程序设计 void main() over obj1,obj2; obj1.init(2); obj2.init(4); operator--(obj1);//--obj1 operator--(obj2,0);//obj2-- obj1.print(); obj2.print(); 程序运行结果为 : a=1 a= 赋值运算符的重载 对任一类 X, 如果没有用户自定义的赋值运算符函数, 系统将自动地为其生成一个缺省的赋值运算符函数, 完成类 X 中的数据成员间的赋值, 例如 : X &X::operator=(const X &source) // 成员间赋值 若 Objl 和 Obj2 是类 X 的两个对象,Obj2 已被创建, 当编译程序遇到如下语句 : Objl=Obj2; 就调用缺省的赋值运算符函数, 将对象 Obj2 的数据成员的值逐个赋给对象 Objl 的对应数据成员 如果类中包含指向动态空间的指针, 调用默认赋值运算符会导致 浅拷贝, 造成内存泄漏或程序异常 此时需要重载赋值运算符和拷贝构造函数, 以实现 深拷贝 例 6.12 使用缺省的赋值运算符产生指针悬挂问题 #include<string.h> class string string(char *s) ptr=new char[strlen(s)+1]; strcpy(ptr,s); ~string() delete ptr; void print() cout<<ptr<<endl; private: char *ptr;

20 第 6 章运算符重载 211 ; void main() string p1("teacher"); string p2("student"); p1=p2; cout<<"p2: "; p2.print(); cout<<"p1: "; p1.print(); 从这个例子可以看出, 通过使用缺省的赋值运算符 =, 把对象 p2 的数据成员值逐个赋值给对象 p1 的对应数据成员, 从而使得 pl 的数据成员原先的值被覆盖 由于 pl.ptr 和 p2.ptr 具有相同值, 都指向 p2 的字符串,p1.ptr 原先指向的内存区不仅没有释放, 而且被封锁起来无法再使用, 这就是所谓的指针悬挂问题 更为严重的是, 对于存储 student 内容的内存在程序结束时被释放了两次, 从而导致运行错误 可以通过重载赋值运算符来解决指针悬挂问题 例 6.13 重载赋值运算符解决指针悬挂问题 #include<string.h> class string string(char *s) ptr=new char[strlen(s)+1]; strcpy(ptr,s); ~string() delete ptr; void print() cout<<ptr<<endl; string &operator=(const string &); private: char *ptr; ; string &string::operator=(const string &s) if(this==&s)return *this; delete ptr; ptr=new char[strlen(s.ptr)+1]; strcpy(ptr,s.ptr); return *this; void main()

21 212 C++ 面向对象程序设计 string p1("teacher"); string p2("student"); p1=p2; cout<<"p2: "; p2.print(); cout<<"p1: "; p1.print(); 运行修改后的程序, 就不会产生上面的问题了 因为已释放掉了旧区域, 又按新长度分配了新区域, 并且将简单的赋值变成了内容拷贝 程序运行结果为 : p2: student p1: student 说明 : 类的赋值运算符 = 只能重载为成员函数, 而不能把它重载为友元函数 ; 类的赋值运算符 = 可以被重载, 但重载了的运算符函数 operator=() 不能被继承 下标运算符的重载 在 C++ 中, 在重载下标运算符 [] 时认为它是一个双目运算符, 第一个运算符是数组名, 第二个运算符是数组下标 例如 X[Y] 可以看成 : [] 双目运算符 X 左操作数 Y 右操作数 C++ 不允许把下标运算符函数作为外部函数来定义, 它只能是非静态的成员函数 对于下标运算符重载定义形式如下 : 返回类型类名 ::operator[]( 形参 ) // 函数体 其中, 类名是重载下标运算符的类, 形参在此表示下标,C++ 规定只能有一个参数, 可以是任意类型, 如整型 字符型或某个类 返回类型是数组运算的结果, 也可以是任意类型, 但为了能对数组赋值, 一般将其声明为引用形式 假设 X 是某一个类的对象, 类中定义了重载 [] 的 operator[] 函数, 表达式 X[5] 可被解释为 : X.operator[](5); 例 6.14 下标运算符重载的一个实例 #include <iostream.h> class ainteger ainteger(int size) sz=size; a=new int[size]; int& operator[](int i);

22 ~ainteger() delete []a; private: int* a; int sz; ; int& ainteger::operator[](int i) if(i<0 i>sz) cout<<"error,leap the pale"<<endl; return a[i]; int main() ainteger arr(10); for(int i=0;i<10;i++) arr[i] = i+1; cout<<arr[i]<<" "; cout<<endl; int n=arr.operator[](2); cout<<"n="<<n<<endl; return 0; 程序运行结果为 : 第 6 章运算符重载 n=3 在整型数组 ainteger 中重载了下标运算符, 这种下标运算符能检查越界的错误 现在使用它 : ainteger ai(10); ai[2]=3; int i=ai[2]; ai[2]=3 调用了 ai.operator(2), 返回对 ai::a[2] 的引用, 接着再调用缺省的赋值运算符, 把 3 的值赋给此引用, 因而 ai::a[2] 的值为 3 注意, 假如返回值不采用引用形式,ai.operator(2) 的返回值是一临时变量, 不能作为左值, 因而, 上述赋值会出错 对于初始化 i=ai[2], 先调用 ai.operator(2) 取出 ai::a[2] 的值, 然后再利用缺省的拷贝构造函数来初始化 i 说明 : 重载下标运算符 [] 的优点之一是可以增加 C++ 中数组检索的安全性, 可以对下标越界做出判断 ; 重载下标运算符 [] 时返回一个 int 的引用, 所以可使重载运算符 [] 用在赋值语句的左边

23 214 C++ 面向对象程序设计 函数调用运算符的重载 在 C++ 中, 在对函数调用运算符 () 重载时认为它是一个双目运算符, 第一个运算符是函数名, 第二个运算符是函数的形参 例如 X(Y) 可以看成 : () 双目运算符 X 左操作数 Y 右操作数其相应的运算符函数名为 operator(), 必须重载为一个成员函数, 则重载运算符 () 的调用由左边的对象产生对 operator 函数的调用,this 指针总是指向发起函数调用的对象 重载运算符 () 的 operator 函数可以带任何类型的操作数, 返回类型也可以是任何有效的类型 对于函数调用运算符的重载定义形式如下 : 返回类型类名 ::operator()( 形参 ) // 函数体 例 6.15 形参为对象引用的函数调用运算符的重载实例 class Point private: int x; Point(int x1) x=x1; const int operator()(const Point& p); ; const int Point::operator()(const Point& p) return (x+p.x); int main() Point a(1); Point b(2); cout<<"a(b)="<<a(b)<<endl;//a.operator()(b); return 0; 程序运行结果为 : a(b)=3 在程序中 a(b); 相当于 a.operator()(b); 对象 a 是函数调用运算符重载函数 () 的左操作数, 而 b 构成实参, 当执行 a(b) 时, 对对象 a 和对象 b 的两个私有成员值进行加运算 例 6.16 设数学表达式为 f(x,y)=(x 2 +y 2 )*z, 通过函数调用运算符的重载实现该表达式 #include <iostream.h> class fun

24 第 6 章运算符重载 215 double operator()(double x,double y,double z) const; ; double fun::operator()(double x,double y,double z) const return (x*x+y*y)*z; void main() fun f; cout<<f(3.0,2.0,5.0)<<endl; 程序运行结果为 : 65 执行 f(3.0,2.0,5.0) 时, 对象 f 是函数调用运算符 () 的左操作数, 而 构成实参表 ; 其左操作数是 fun 类的对象 f, 它将执行对 fun 类的重载函数的调用 6.4 类型转换 我们在使用重载的运算符时, 往往需要在自定义的数据类型和系统预定义的数据类型之间进行转换, 或者需要在不同的自定义数据类型之间进行转换 本节介绍 C++ 中数据类型的转换 系统预定义类型间的转换 对于系统预定义的数据类型,C++ 提供了两种类型转换方式, 即隐式类型转换 ( 或称标准类型转换 ) 和显式类型转换 (1) 隐式类型转换隐式类型转换主要遵循以下规则 : 字符或 short 类型变量与 int 类型变量进行运算时, 将字符或 short 类型转换成 int 类型 ; float 型数据在运算时一律转换为双精度 (double) 型, 以提高运算精度 ( 同属于实型 ); 在赋值表达式 A=B 中, 赋值运算符右端 B 的值需转换为 A 类型后再进行赋值 ; 当两个操作对象类型不一致时, 在算术运算前, 级别低的自动转换为级别高的类型 (2) 显式类型转换 强制转换法 ( 类型名 ) 表达式例如 : int i,j; cout<<(float)(i+j); 函数法类型名 ( 表达式 )

25 216 C++ 面向对象程序设计 例如 : int i,j; cout<<float (i+j) 例 6.17 系统预定义类型间转换 void main() int a=5,sum; double b=5.55; sum=a+b;// cout<<" 隐式转换 :a+b="<<sum<<endl; sum=(int)(a+b);// sum=int(a+b); // cout<<" 显式转换 :a+b="<<sum<<endl; 程序运行结果为 : 隐式转换 :a+b=10 显式转换 :a+b=10 上述代码中的 1 就是含有隐式类型转换的表达式, 在进行 a+b 时, 编译系统先将 a 的值 5 转换为双精度 double, 然后和 b 相加得到 10.55, 在向整型变量 sum 赋值时, 将 转换为整型数 10, 赋值给变量 sum 这种转换由 C++ 编译系统自动完成, 不需要用户干预 而上例中的 2 和 3 中则涉及到了显式类型转换, 它们都是把 a+b 所得结果的值强制转换为整型数 只是 2 式是 C 语言中用到的形式 ( 类型名 ) 表达式, 而 3 式是 C++ 中采用的形式 类型名 ( 表达式 ) 类类型与系统预定义类型间的转换 对于用户自己定义的类类型而言, 编译系统并不知道怎样进行转换 解决这个问题的关键是让编译系统知道怎样去进行这些转换, 需要定义专门的函数来处理 C++ 中提供了如下两种方法 : 通过转换构造函数进行类型转换 ; 通过类型转换函数进行类型转换 1. 通过转换构造函数进行类型转换转换构造函数 (conversion constructor function) 的作用是将一个其他类型的数据转换成一个类的对象 主要有以下几种构造函数 : (1) 默认构造函数 以 Complex 类为例, 函数原型的形式为 : Complex( ); // 没有参数 (2) 用于初始化的构造函数 函数原型的形式为 : Complex(double r,double i); // 形参列表中一般有两个以上参数 (3) 用于复制对象的拷贝构造函数 函数原型的形式为 : Complex (Complex &c); // 形参是本类对象的引用 (4) 再介绍一种新的构造函数 转换构造函数, 转换构造函数只有一个形参, 如 : Complex(double r) real=r;imag=0;

26 第 6 章运算符重载 217 其作用是将 double 型的参数 r 转换成 Complex 类的对象, 将 r 作为复数的实部, 虚部为 0 用户可以根据需要定义转换构造函数, 在函数体中告诉编译系统怎样去进行转换 毫无疑问转换构造函数就是构造函数的一种, 只不过它具有类型转换的作用 回顾下例 6.1 中两个复数 (sum=com1+com2) 相加的实例, 现在如果想要实现 sum=com1+5.5 该怎么办, 也许首先会想到再定义一个关于复数加双精度数的运算符重载函数, 这样做的确可以 另外还可以定义一个转换构造函数来解决上述问题 可对 Comlex 类 ( 复数类 ) 进行如下改造 例 6.18 使用转换构造函数完成双精度数到复数的转换 class Complex // 复数类 private:// 私有 double real;// 实数 double imag;// 虚数 Complex(double real,double imag) this->real=real; this->imag=imag; Complex(double d=0.0)// 转换构造函数 real=d;// 实数取 double 类型的值 imag=0;// 虚数取 0 Complex operator+(complex com1); void showcomplex(); ; Complex Complex::operator+(Complex com1) return Complex(real+com1.real,imag+com1.imag); void Complex::showComplex() cout<<real; if(imag>0) cout<<"+"; if(imag!=0) cout<<imag<<"i"<<endl; else cout<<endl; int main() Complex com(10,10),sum; sum=com+complex(5.5);//1

27 218 C++ 面向对象程序设计 sum.showcomplex();// 输出运算结果 sum=com+6.6; //2 sum.showcomplex();// 输出运算结果 sum=5.5; //3 sum.showcomplex();// 输出运算结果 return 0; 程序运行结果为 : i i 5.5 main() 函数中的语句 1 显式地调用转换构造函数 Complex(5.5), 将 double 类型的 5.5 转换为无名的 Complex 类的临时对象 (5.5+0i), 然后执行两个 Complex 类 ( 复数类 ) 对象相加的运算符重载函数 语句 2 隐式地调用转换构造函数 Complex(6.6), 将 double 类型的 6.6 转换为无名的 Complex 类的临时对象 (6.6+0i), 然后执行两个 Complex 类 ( 复数类 ) 对象相加的运算符重载函数 语句 3 隐式调用 Complex(5.5), 将 double 类型的 5.5 转换为无名的 Complex 类的临时对象 (5.5+0i), 然后调用缺省的赋值运算符函数完成对 sum 的赋值 所以说一般的转换构造函数的定义形式如下 : 类名 ( 待转换类型 ) 函数体 ; 说明 : (1) 转换构造函数只有一个形参 (2) 在类体中, 可以有转换构造函数, 也可以没有转换构造函数, 视需要而定 (3) 当几种构造函数同时出现在同一个类中, 它们是构造函数的重载 编译系统会根据建立对象时给出的实参的个数与类型来选择与之匹配的构造函数 (4) 转换构造函数不仅可以将系统预定义类型的数据转换成类对象, 也可以将另一个类的对象转换成转换构造函数所在类的对象 例如, 将一个学生类对象转换为教师类对象, 可以在 Teacher 类中定义出下面的转换构造函数 : Teacher(Student &s) num=s.num; strcpy(name,s.name); sex=s.sex; 但应注意, 对象 s 中 num name 和 sex 必须是公有成员, 否则不能在类外被访问 2. 通过类型转换函数进行类型转换转换构造函数可以把系统预定义类型转化为自定义类的对象, 但是却不能把类的对象转换为基本数据类型 比如, 不能将 Complex 类 ( 复数类 ) 的对象转换成 double 类型数据 在 C++ 中可用类型转换函数 (type conversion function) 来解决这个问题 类型转换函数的作用是

28 第 6 章运算符重载 219 将一个类的对象转换成另一类型的数据, 定义类型转换函数的一般形式为 : class 源类类名 // operator 目标类型 ( ) // return 目标类型的数据 ; // ; 说明 : (1) 源类类名为要转换的源类类型, 目标类型为要转换成的类型, 它既可以是自定义的类型也可以是系统预定义类型 (2) 类型转换函数的函数名前不能指定返回类型, 且没有参数 从函数的形式看, 它与运算符重载函数相似, 都是用 operator 开头, 只是被重载的是类型名 (3) 类型转换函数只能定义为一个类的成员函数, 因为转换的主体是本类对象 不能为友元函数或普通函数 (4) 类型转换函数中必须有 return 目标类型的数据 ; 的语句, 即必须回传目标类型数 据作为函数的返回值 (5) 在类中可以有多个类型转换函数,C++ 编译器将根据操作数的类型自动地选择一个合适的类型转换函数与之匹配 例 6.19 类型转换函数显式调用举例 class Complex Complex(float r=0,float i=0) real=r; imag=i; cout<<"complex class Constructing...\n"; operator float() cout<<"complex changed to float...\n"; return real; operator int() cout<<"complex changed to int...\n"; return int(real); void print() cout<<'('<<real<<','<<imag<<')'<<endl; private:

29 220 C++ 面向对象程序设计 float real,imag; ; int main() Complex a(1.1,3.3); a.print(); cout<<float(a)*0.5<<endl; Complex b(2.5,5.5); b.print(); cout<<int(b)*2<<endl; return 0; 程序运行结果为 : Complex class Constructing... (1.1,3.3) Complex changed to float Complex class Constructing... (2.5,5.5) Complex changed to int... 4 上例中两次调用了类型转换函数 第一次采用显式调用, 将类对象 a 转换成 float 类型 第二次也是显式调用, 将类对象 b 转换为 int 类型 类型转换函数的调用分为显式转换与隐式转换两种形式, 下面通过例 6.20 来说明如何进行隐式转换 例 6.20 类型转换函数隐式调用的举例 class Complex Complex(int r,int i) real=r; imag=i; cout<<"complex class Constructing...\n"; Complex(int i=0) // 转换构造函数 real=imag=i/2; operator int() // 类型转换函数 cout<<"complex changed to int...\n"; return real+imag; void print() cout<<"real:"<<real<<"\t"<<"imag:"<<imag<<endl; private: int real,imag;

30 第 6 章运算符重载 221 ; int main() Complex c1(1,2),c2(3,4); c1.print(); c2.print(); Complex c3; c3=c1+c2; c3.print(); 程序运行结果为 : Complex class Constructing... Complex class Constructing... real:1 imag:2 real:3 imag:4 Complex changed to int... Complex changed to int... real:5 imag:5 上例中没有在类中重载运算符 +, 为何 c3=c1+c2 成立呢? 原因在于 C++ 自动进行了隐式转换, 将 c1 与 c2 分别都转换成 int 型, 然后调用转换构造函数将整型数据转换为 complex 类 这里类型转换函数和转换构造函数构成了互逆操作, 转换构造函数 Complex(int) 将一个整型转换成一个 Complex 类型, 而类型转换函数 Complex::operator int() 将 Complex 类型转换成整型 习题六 一 选择题 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. 运算符重载可以改变运算符操作数的个数

31 222 C++ 面向对象程序设计 B. 运算符重载可以改变优先级 C. 运算符重载可以改变结合性 D. 运算符重载不可以改变语法结构 7. 友元运算符 obj>obj2 被 C++ 编译器解释为 A.operator>(obj1,obj2) B.>(obj1,obj2) C.obj2.operator>(obj1) D.obj1.operator>(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. 在重载一个运算符时, 其参数表中没有任何参数, 这表明该运算符是 A. 作为友元函数重载的单目运算符 B. 作为成员函数重载的单目运算符 C. 作为友元函数重载的双目运算符 D. 作为成员函数重载的双目运算符 12. 在成员函数中进行双目运算符重载时, 其参数表中应带有 个参数 A.0 B.1 C.2 D 双目运算符重载为普通函数时, 其参数表中应带有 个参数 A.0 B.1 C.2 D 如果表达式 a+b 中的 + 是作为成员函数重载的运算符, 若采用运算符函数调用格式, 则可表示 为 A.a.operator+(b) B.b.operator+(a) C.operator+(a,b) D.operator(a+b) 15. 如果表达式 a==b 中的 == 是作为普通函数重载的运算符, 若采用运算符函数调用格式, 则可表 示为 A.a.operator==(b) B.b.operator==(a) C.operator==(a,b) D.operator==(b,a) 16. 如果表达式 a++ 中的 ++ 是作为普通函数重载的运算符, 若采用运算符函数调用格式, 则可表示 为 A.a.operator++() B.operator++(a) C.operator++(a,1) D.operator++(1,a) 17. 如果表达式 ++a 中的 ++ 是作为成员函数重载的运算符, 若采用运算符函数调用格式, 则可表示 为 A.a.operator++(1) B.operator++(a) C.operator++(a,1) D.a.operator++()

32 第 6 章运算符重载 关于运算符重载, 下列说法正确的是 A. 重载时, 运算符的优先级可以改变 B. 重载时, 运算符的结合性可以改变 C. 重载时, 运算符的功能可以改变 D. 重载时, 运算符的操作数个数可以改变 19. 关于运算符重载, 下列说法正确的是 A. 所有的运算符都可以重载 B. 通过重载, 可以使运算符应用于自定义的数据类型 C. 通过重载, 可以创造原来没有的运算符 D. 通过重载, 可以改变运算符的优先级 20. 一个程序中数组 a 和变量 k 定义为 int a[5][10],k;, 且程序中包含有语句 a(2,5)=++k*3;, 则此语 句中肯定属于重载操作符的是 A.( ) B.= C.++ D.* 21. 假定 K 是一个类名, 并有定义 K k; int j;, 已知在 K 中重载了操作符 ( ), 且语句 j=k(3); 和 k(5)=99; 都能顺利执行, 则该操作符函数的原型只可能是 A.K operator( )(int); B.int operator( )(int); C.int & operator( )(int); D.K & operator( )(int); 22. 假定 M 是一个类名, 且 M 中重载了操作符 =, 可以实现 M 对象间的连续赋值, 如 m1=m2=m3; 重载操作符 = 的函数原型最好是 A.int operaotor=(m); B.int operator=(m); C.M operator=(m); D.M & operator=(m); 23. 下面是重载双目运算符 + 的普通函数原型, 其中最符合 + 原来含义的是 A.Value operator+(value, Value); B.Value operator+(value,int); C.Value operator+(value); D.Value operator+(int, Value); 24. 下面是重载双目运算符 - 的成员函数原型, 其中最符合 - 原来含义的是 A.Value Value::operator-(Value); B.Value Value::operator-(int); C.Value Value::operator-(Value,int); D.Value Value::operator-(int,Value); 25. 在重载运算符时, 若运算符函数的形参表中没有参数, 则不可能的情况是 A. 该运算符是一个单目运算符 B. 该运算符函数有一个隐含的参数 this C. 该运算符函数是类的成员函数 D. 该运算符函数是类的友元函数 二 填空题 1. 不能重载. ::.* ->* 和 5 个运算符 2. 运算符重载不能改变运算符的 3. 在 C++ 中, 运算符的重载有两种实现方法, 一种是通过成员函数来实现, 另一种则通过 来实现 4. 运算符 -- delete -= = + 和 ->* 中, 只能作为成员运算符重载的有 5. 运算符 -- delete -= = + 和 ->* 中, 只能重载为静态函数的有 6. 运算符 -- delete -= = + 和 ->* 中, 肯定不能重载的是 7. 当运算符重载为成员函数时, 对象本身就是, 不在参数表中显式地出现 8. 若以成员函数形式, 为类 CSAI 重载 double 运算符, 则该运算符重载函数的原型是 9. 在表达式 x+=y 中, += 是作为非成员函数重载的运算符, 若是使用显式的函数调用代替直接使

33 224 C++ 面向对象程序设计 用运算符 +=, 这个表达式还可以表示为 10. 将运算符 >> 重载为类 CSAI 的友元函数的格式是 :friend stream& operator >> 三 分析题 1. 分析以下程序的执行结果 class Sample int n; Sample() Sample(int m)n=m; int &operator--(int) n--; return n; void disp() cout<<"n="<<n<<endl; ; void main() Sample s(10); (s--)++; s.disp(); 2. 分析以下程序的执行结果 class Sample private: int x; Sample()x=0; void disp()cout<<"x="<<x<<endl; void operator++()x+=10; ; void main() Sample obj; obj.disp(); obj++; cout<<" 执行 obj++ 之后 "<<endl; obj.disp(); 3. 分析以下程序的执行结果

34 第 6 章运算符重载 225 static int dys[]=31,28,31,30,31,30,31,31,30,31,30,31; class date int mo,da,yr; date(int m,int d,int y)mo=m;da=d;yr=y; date() void disp()cout<<mo<< "/"<<da<<"/"<<yr<<endl; friend date operator+(date &d,int day) // 友元运算符重载函数 date dt; dt.mo=d.mo; dt.yr=d.yr; day+=d.da; while(day>dys[dt.mo-1]) day-=dys[dt.mo-1]; if(++dt.mo==13) dt.mo=1; dt.yr++; dt.da=day; return dt; ; void main() date dl(2,10,2003),d2; d2=dl+365; d2.disp(); 4. 分析以下程序的执行结果 #include<string.h> class Words char *str; Words(char *s) str=new char[strlen(s)+1]; strcpy(str,s); void disp()cout<<str<<endl; char operator[](int i)

35 226 C++ 面向对象程序设计 if(str[i]>='a'&& str[i]<='z') // 大写字母 return char(str[i]+32); else if(str[i]>='a'&&str[i]<='z') // 小写字母 return char(str[i]-32); else // 其他字符 return str[i]; ; void main() int i; char *s="hello"; Words word(s); word.disp(); for(i=0;i<strlen(s);i++) cout<<word[i]; cout<<endl; 5. 分析以下程序的执行结果 class Point int x,y; Point()x=y=0; Point(int i,int j)x=i;y=j; Point operator+(point); void disp() cout<<"("<<x<<","<<y<<")"<<endl; ; Point Point::operator+(Point p) this->x+=p.x; this->y+=p.y; return *this; void main() Point p1(2,3),p2(3,4),p3; cout<<"pl:"; p1.disp(); cout<<"p2:"; p2.disp(); p3=p1+p2; cout<<" 执行 p3=pl+p2 后 "<<endl; cout<<"pl:",p1.disp(); cout<<"p2:"; p2.disp();

36 第 6 章运算符重载 227 cout<<"p3:"; p3.disp(); 四 编程题 1. 定义一个计数器类 Counter, 对其重载运算符 + 2.C++ 在运行期间不会自动检查数组是否越界, 设计一个类来检查数组是否越界 3. 有两个矩阵 a 和 b, 均为 2 行 3 列, 求两个矩阵之和 重载运算符 + 使之能用于矩阵相加, 如 :c = a + b 4. 对于下面的类 MyString, 要求重载一些运算符后可以计算表达式 a=b+c, 其中 a b c 都是类 MyString 的对象 请重载相应的运算符并编写测试程序 class MyString MyString(char *s) str=new char[strlen(s)+1]; strcpy(str,s); ~MyString()delete[]str; private: char *str; ; 5. 设计人民币类 RMB, 其数据成员为分 角 元, 定义构造函数和数据成员 yuan jiao fen, 重载这个类的加法 减法运算符 6. 设计一个日期类 Date, 包括年 月 日等私有数据成员 要求有实现日期基本运算的成员函数, 如某日期加上天数 某日期减去天数 两日期相差的天数等 7. 定义如下集合类的成员函数, 并用数据进行测试 class Set int * elem; // 存放集合元素的指针 int count; // 存放集合中的元素个数 Set(); Set(int S[],int n); int find(int x)const; // 判断 x 是否在集合中 Set operator+(const Set&); // 集合的并集 Set operator-(const Set&); // 集合的差集 Set operator*(const Set&); // 集合的交集 void disp(); // 输出集合元素 ;

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 第十一讲 运算符重载 与类型转换 运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 为什么要运算符重载 预定义的运算符只针对基本数据类型, 若要对类的对象进行类似的运算, 需要重新定义运算符的功能 运算符重载实质就是函数重载 : 对已有的运算符赋予多重含义, 使得同一个运算符作用于不同类型的数据时导致不同的行为

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

北京大学

北京大学 1 运算符重载 基本概念 郭炜刘家瑛 北京大学程序设计实习 运算符 C++ 预定义表示对数据的运算 +, -, *, /, %, ^, &, ~,!,, =, ,!= 只能用于基本的数据类型 整型, 实型, 字符型, 逻辑型 2 自定义数据类型与运算符重载 C++ 提供了数据抽象的手段 : 用户自己定义数据类型 -- 类 调用类的成员函数 操作它的对象 类的成员函数 操作对象时, 很不方便

More information

Microsoft PowerPoint - 04-Inheritance.ppt

Microsoft PowerPoint - 04-Inheritance.ppt 继承 派生与多态性 1 本章主要内容 类的继承与派生 类成员的访问控制 简单继承与多重继承 派生类的构造 析构函数 多态性 2 1 类的继承与派生 保持已有类的特性, 并在其基础上产生新的类, 称新类继承了已有类的特征, 或称已有类派生出新类 被继承的已有类称为基类 ( 或父类 ) 派生出的新类称为派生类 派生类将自动继承基类的所有特性 ( 属性和方法 ) 派生类可以定义新的特性 ( 属性和方法 )

More information

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式] 用户定义类型 User-defined Datatypes classes and structs 几何向量 (Geometry Vector) 二维平面上的向量由起点和终点构成 每个点包含两个坐标 (x, y), 因此一个向量需要四个实数表示 Start= (0.9,1.5) Start= (0.4,0.8) int main() { double xstart = 0.4; double xend

More information

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

PowerPoint Presentation

PowerPoint Presentation 程序设计 II 第 10 讲运算符重载与类型转换 计算机学院黄章进 zhuang@ustc.edu.cn 内容 10.1 基本概念 10.2 输入和输出运算符 10.3 算术和关系运算符 10.4 赋值运算符 10.5 下标运算符 10.6 自增和自减运算符 10.7 成员访问运算符 10.8 函数调用运算符 10.9 类型转换运算符 2 基本概念 重载运算符函数的声明形式 : 返回类型 operator

More information

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft PowerPoint - string_kruse [兼容模式] Strings Strings in C not encapsulated Every C-string has type char *. Hence, a C-string references an address in memory, the first of a contiguous set of bytes that store the characters making up the string.

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 CIRCLE 1 Circle 描述 编写一个圆类 Circle, 实现半径的输入 面积的计算和输出 输入 圆的半径 (double 类型 ) 输出 圆的面积 ( 保留小数点后两位 ) 样例输入 3 样例输出 28.27 提示 圆周率的取值需要比较精确, 以保证计算结果的精度 #include

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

第3章.doc

第3章.doc 3 3 3 3.1 3 IT Trend C++ Java SAP Advantech ERPCRM C++ C++ Synopsys C++ NEC C C++PHP C++Java C++Java VIA C++ 3COM C++ SPSS C++ Sybase C++LinuxUNIX Motorola C++ IBM C++Java Oracle Java HP C++ C++ Yahoo

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1

C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1 C++ 程序设计 实验 2 - 参考答案 MASTER 2017 年 5 月 21 日 1 1 CRECT 类 1 CRect 类 设计矩形类, 包含 长度和宽度信息 基本构造函数 基础属性的访问接口 ( 读 / 写, Read/Write, Get/Set) 计算周长和面积 ( 注 : 基本构造函数, 一个无参数的默认构造函数, 以及一个初始化数据成员的构造函数如果数据成员的初始化有多种形式, 就提供多个构造函数

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

untitled

untitled 1 7 7.1 7.2 7.3 7.4 7.5 2 7.1 VFT virtual 7.1 3 1 1. 2. public protected public 3. VFT 4. this const volatile 4 2 5. ( ) ( ) 7.1 6. no-static virtual 7.2 7. inline 7.3 5 3 8. this this 9. ( ) ( ) delete

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 PERSON 1 Person 题目描述 编写程序, 定义一个基类 Person, 包含 name 和 age 两个数据成员 ; 再由它派生出学生类 Student 和教师类 Teacher, 其中学生类添加学号 no 数据, 教师类添加职称 title 数据 ; 要求每个类均有构造函数 析构函数和显示数据的函数

More information

第七讲 继承与多态

第七讲  继承与多态 第 七 章 继 承 与 派 生 1 本 章 主 要 内 容 的 继 承 成 员 的 访 问 控 制 单 继 承 与 多 继 承 派 生 的 构 造 析 构 函 数 成 员 的 标 识 与 访 问 深 度 探 索 2 的 继 承 与 派 生 的 继 承 与 派 生 保 持 已 有 的 特 性 而 构 造 新 的 过 程 称 为 继 承 在 已 有 的 基 础 上 新 增 自 己 的 特 性 而 产 生

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

Microsoft PowerPoint - 10 模板 Template.pptx

Microsoft PowerPoint - 10 模板 Template.pptx 模板 Tempalte 泛型编程的需要 Why Templates? 设想你对整数类型实现了一个排序算法 : void sort(int *is,int n); 用该函数可以对实 复数或工资单排序吗? 模板可以复用源代码 - 泛型编程. inline void Swap( int &x, int &y){ int t = x; x = y; y =t; inline void Swap(double

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i;

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

程序设计语言及基础

程序设计语言及基础 Chapter 10 Classes: A Deeper Look, Part 2 http://jssec.seu.edu.cn 杨明 yangming2002@seu.edu.cn OBJECTIVES To specify const (constant) objects and const member functions. To create objects composed of other

More information

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期  开放本科  期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l 试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 c++ 程序中都必须包含有这样一个函数, 该函数的函数名为 ( ) A. main

More information

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期  开放本科  期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new 试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 C 十 + 程序中都必须包含有这样一个函数, 该函数的函数名为 ) A.main

More information

上海交通大学

上海交通大学 一 读程序, 写结果 ( 每题 4 分, 共 40 分 ) 1. 写出下列程序运行结果 class test friend test operator+(const test &p1, const test &p2) return test(p1.data1 + p2.data1, p1.data2 + p2.data2); friend ostream &operator

More information

IO

IO 1 C/C++ C FILE* fscanf fgets fread fprintf fputs fwrite C++ ifstream ofstream >>

More information

北京大学

北京大学 1 string 类 郭炜刘家瑛 北京大学程序设计实习 string 类 string 类是一个模板类, 它的定义如下 : typedef basic_string string; 使用 string 类要包含头文件 string 对象的初始化 : string s1("hello"); // 一个参数的构造函数 string s2(8, x ); // 两个参数的构造函数

More information

Chapter12 Derived Classes

Chapter12   Derived Classes 继 承 -- 派 生 类 复 习 1. 有 下 面 类 的 说 明, 有 错 误 的 语 句 是 : class X { A) const int a; B) X(); C) X(int val) {a=2 D) ~X(); 答 案 :C 不 正 确, 应 改 成 X(int val) : a(2) { 2. 下 列 静 态 数 据 成 员 的 特 性 中, 错 误 的 是 A) 说 明 静 态 数

More information

4. if 与 else 在使用过程中为避免嵌套出现二义性,C++ 中规定与 else 子句配对的是 ( ) A. 其之前最近的 if 语句 B. 其之前最近且尚未配对的 if 语句 C. 缩排位置相同的 if 语句 D. 其之后最近的 if 语句答案 :B 解析 :C++ 中规定与 else 子句

4. if 与 else 在使用过程中为避免嵌套出现二义性,C++ 中规定与 else 子句配对的是 ( ) A. 其之前最近的 if 语句 B. 其之前最近且尚未配对的 if 语句 C. 缩排位置相同的 if 语句 D. 其之后最近的 if 语句答案 :B 解析 :C++ 中规定与 else 子句 计算机 -C++ 程序设计 ( 本科 ) 2017 年 10 月真题及答案解析 单项选择题 : 本大题共 20 小题 每小题 1 分, 共 20 分 1. 按照标识符的要求, 不能组成标识符的符号是 ( ) A. 连接符 B. 下划线 C. 大小写字母 D. 数字字符答案 :A 解析 : 组成标识符的符号可以是大小写字母 下划线和数字, 且数字不能打头 2. 下列输出语句中, 正确的是 ( ) A.

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

幻灯片 1

幻灯片 1 第三课类和对象 ( 封装 ) 互联网新技术在线教育领航者 1 内容概述 1. 封装的概念 2. 访问控制 3. 栈类的封装 4. 构造与析构 5.myString 构造函数 6. 构造与析构的次序 7. 类文件写法 8. 对象的内存 9.this 指针初探 10. 构造函数初始值列表 11. 拷贝构造和赋值运算符重载 12. 浅拷贝 13. 深拷贝 14. 成员函数内联 15. 友元 16.const

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 lambda 表达式及其应用 lambda 表达式是 Java 8 提供的一种新特性, 它使得 Java 也能像 C# 和 C++ 语言一样进行简单的 函数式编程, 这不仅简化了某些通用结构的实现方式, 也大大增强了 Java 语言的表达功能 3.1 lambda 表达式简介 lambda 表达式是基于数学中的 λ 演算得名, 本质上就是一个没有方法名的匿名方法 例如, 有一个方法定义如下

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

36 2013 6 29 2012 10 24 2012 12 1 93 1998 10 25 94 95 2001 12 12 96 2007 4 15 97 (1) 200.0 50.0 100.0 500.0 98 49% 5% 20% 25% 25% 25% 25% H 598,100,000 H 59,810,000 657,910,000 H 25.0% 10 2010 9 19 5%

More information

程序设计与算法语言 静态与友元 C/C++ Programming and Algorithms Static, Friend and Const Dongke Sun ( 孙东科 ) 东南大学机械工程学院 School of Mechanical Engineer

程序设计与算法语言 静态与友元 C/C++ Programming and Algorithms Static, Friend and Const Dongke Sun ( 孙东科 ) 东南大学机械工程学院 School of Mechanical Engineer 程序设计与算法语言 静态与友元 C/C++ Programming and Algorithms Static, Friend and Const Dongke Sun ( 孙东科 ) dksun@seu.edu.cn 东南大学机械工程学院 School of Mechanical Engineering Southeast University Spring semester, 2019 牢记 80/20

More information

untitled

untitled Double Angel 1.,,,, [] (1),,,,,,,,,,,,,,,,() (),,( ), (2),,,,,1978 ( 53 )2 (M6.2) 6 (M7.4) 1997 ( 9 )3 1 (M6.2)5(M6.3),,,, (3),,1990,,, (4),,,,,,,,,,,,, 2.,,,,,, [] (1) 2 ,,,,, (2),,,,, (),,,,,,,,,, 10,,,,,,,,,,,,,,,,,,,,

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

68003 (Project Unity TC)_.indb

68003 (Project Unity TC)_.indb 2014 8 31 2016 2 6 104 2015 4 24 105 2008 6 1 2014 7 29 2 5,000 1 106 5 2008 3 5% 5% 2012 10 11 5% 5% 20% 25% H 17.51% A 107 A0.07% A 0.06% A H 25% H 25% 30 10 2015 8 27 5% 108 5% 2008 12 1 5% 2012 9 23

More information

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

幻灯片 1

幻灯片 1 第四课类和对象 ( 构造深入 ) 互联网新技术在线教育领航者 1 内容概述 1. 数据成员指针 2. 成员函数指针 3. 三 / 五法则 4. 引用计数 5. 写时拷贝 6.swap 函数 7. 移动构造函数 8. 移动赋值运算符重载 9. 对象移动 10.std::vector 动态增长 11.std::vector 与移动 12. 移动小结 互联网新技术在线教育领航者 2 数据成员指针 定义 :

More information

<4D F736F F F696E74202D20B5DA3032BDB25FC0E0BACDB6D4CFF3312E BBCE6C8DDC4A3CABD5D>

<4D F736F F F696E74202D20B5DA3032BDB25FC0E0BACDB6D4CFF3312E BBCE6C8DDC4A3CABD5D> 程序设计实习 (I): C++ 程序设计 第二讲类和对象 (1) 面向对象的程序设计 面向对象的程序设计方法, 能够较好解决结构化程序设计中出现的问题 面向对象的程序 = 类 + 类 + + 类 设计程序的过程, 就是设计类的过程 2 面向对象的程序设计 面向对象的程序设计方法 : 将某类客观事物共同特点 ( 属性 ) 归纳出来, 形成一个数据结 构 ( 可以用多个变量描述事物的属性 ); 将这类事物所能进行的行为也归纳出来,

More information

Microsoft PowerPoint - 第06讲_继承.ppt [兼容模式]

Microsoft PowerPoint - 第06讲_继承.ppt [兼容模式] 程序设计实习 (I): C++ 程序设计 第六讲继承 上节内容回顾 三种运算符重载的实现方式 重载为普通函数 重载为成员函数 重载为友元 常见的运算符重载 流运算符 (>>

More information

CHAPTER VC#

CHAPTER VC# 1. 2. 3. 4. CHAPTER 2-1 2-2 2-3 2-4 VC# 2-5 2-6 2-7 2-8 Visual C# 2008 2-1 Visual C# 0~100 (-32768~+32767) 2 4 VC# (Overflow) 2-1 2-2 2-1 2-1.1 2-1 1 10 10!(1 10) 2-3 Visual C# 2008 10! 32767 short( )

More information

Microsoft PowerPoint - C语言课件-9-结构体.pptx

Microsoft PowerPoint - C语言课件-9-结构体.pptx 第九章结构体 郎大鹏 第九章结构体 9.1 结构体类型的声明方法 9.2 结构体类型变量的定义与使用 9.3 结构体数组 9.4 编程举例 9.5 习题 9.1 结构体类型的声明方法 结构体声明的语法形式如下 : struct 结构体标识符 成员变量列表 ; }; 例如, 为了描述班级 ( 假设仅仅包括班级编号 专业 人数等信息 ), 可以声明如下的结构体类型 struct Class char Code[10];

More information

目录 C++ 基本的程序设计... 1 C++ 对 C 的扩充... 3 类和对象... 5 继承和派生... 9 多态性 函数模板和类模板 输入输出流

目录 C++ 基本的程序设计... 1 C++ 对 C 的扩充... 3 类和对象... 5 继承和派生... 9 多态性 函数模板和类模板 输入输出流 面向对象程序设计 上机实验指导书 临沂大学汽车学院 编写 : 韩晓翠 2015 年 8 月修订 1 目录 C++ 基本的程序设计... 1 C++ 对 C 的扩充... 3 类和对象... 5 继承和派生... 9 多态性... 11 函数模板和类模板... 13 输入输出流... 14 2 C++ 基本的程序设计 一 目的 : 1 熟悉 VC++ 环境的基本命令和功能键 ; 2 掌握 C++ 程序的三大基本结构的输入

More information

C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1

C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1 C++ 程序设计 实验 3 - 参考答案 MASTER 2017 年 5 月 21 日 1 1 圆 1 圆 设计圆类 包含 包含基本属性和基本属性访问接口 计算面积和周长接口 2 1 圆 1 #include 2 using namespace std ; 3 c l a s s CCircle 4 { 5 p r i v a t e : 6 double r ; 7 const

More information

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B,

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B, 1 下列类头定义中, 正确的是 A class x B public x extends y C public class x extends y. D class x extends y implements y1 2 现有两个类 A B, 以下描述中表示 B 继承自 A 的是 (D ) A) class A extends B B) class B implements A C) class A

More information

<4D6963726F736F667420576F7264202D2032303132C4EAD6A4C8AFCAD0B3A1C6C0BCB6BDE1B9FBB7D6CEF6B1A8B8E62E646F6378>

<4D6963726F736F667420576F7264202D2032303132C4EAD6A4C8AFCAD0B3A1C6C0BCB6BDE1B9FBB7D6CEF6B1A8B8E62E646F6378> 鹏 元 资 信 评 估 证 券 市 场 评 级 结 果 分 析 报 告 ( 截 至 2012 年 12 月 底 ) 一 证 券 市 场 债 券 评 级 结 果 1 2007 年 9 月 30 日, 鹏 元 资 信 评 估 ( 简 称 鹏 元 ) 获 得 中 国 证 券 监 督 管 理 委 员 会 关 于 核 准 鹏 元 资 信 评 估 从 事 证 券 市 场 资 信 评 级 业 务 的 批 复 (

More information

提问袁小兵:

提问袁小兵: C++ 面 试 试 题 汇 总 柯 贤 富 管 理 软 件 需 求 分 析 篇 1. STL 类 模 板 标 准 库 中 容 器 和 算 法 这 部 分 一 般 称 为 标 准 模 板 库 2. 为 什 么 定 义 虚 的 析 构 函 数? 避 免 内 存 问 题, 当 你 可 能 通 过 基 类 指 针 删 除 派 生 类 对 象 时 必 须 保 证 基 类 析 构 函 数 为 虚 函 数 3.

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

计算概论A B03 C++语言的基本成分 - 运算成分(2)

计算概论A B03 C++语言的基本成分 - 运算成分(2) 计算概论 A 程序设计部分 C 语言的构成成分 运算成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn C 语言中的运算符 C 语言的运算符范围很宽 求字节数运算符 : sizeof 下标运算符 [ ] 赋值运算符 = 算术运算符 + - * / % 关系运算符 < > == >= > ~

More information

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 复习 创建对象 构造函数 函数重载 : 函数 = 函数名 + 参数列表 public class MyType { int i; double d; char c; void set(double x)

More information

<4D6963726F736F667420576F7264202D20A1BE3230313630373237A1BF32303136C4EABDADCBD5D7CFBDF0C5A9B4E5C9CCD2B5D2F8D0D0B9C9B7DDD3D0CFDEB9ABCBBEB8FAD7D9C6C0BCB6B1A8B8E6A3A8B8FAD7D93230313630373237A3A9>

<4D6963726F736F667420576F7264202D20A1BE3230313630373237A1BF32303136C4EABDADCBD5D7CFBDF0C5A9B4E5C9CCD2B5D2F8D0D0B9C9B7DDD3D0CFDEB9ABCBBEB8FAD7D9C6C0BCB6B1A8B8E6A3A8B8FAD7D93230313630373237A3A9> 优 化 组 织 架 构, 提 升 管 控 效 率 ; 总 行 参 与 贷 款 调 查, 控 制 信 贷 风 险 2015 年 底, 紫 金 农 商 银 行 为 适 应 经 营 发 展 需 要, 对 组 织 架 构 和 内 设 机 构 进 行 了 部 分 调 整, 新 设 立 了 金 融 同 业 部 和 七 个 部 门 内 设 中 心, 分 别 为 : 个 人 存 款 管 理 中 心 和 零 售 业

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

02

02 Thinking in C++: Volume One: Introduction to Standard C++, Second Edition & Volume Two: Practical Programming C++ C C++ C++ 3 3 C C class C++ C++ C++ C++ string vector 2.1 interpreter compiler 2.1.1 BASIC

More information

Microsoft PowerPoint - 03.Fortran程序设计基础1

Microsoft PowerPoint - 03.Fortran程序设计基础1 简单 Fortran 90 程序的构造形式 : 第二讲 Fortran 程序设计基础 (2) [PROGRAM 程序名 ] [ 声明语句 ] [ 执行语句 ] END [PROGRAM [ 程序名 ]] 程序的书写 (P5) PROGRAM MONEY!calculate balance after interest compounded! 根据利息计算余额 REAL BALANCE, INTEREST,

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Microsoft PowerPoint - 01_Introduction.ppt

Microsoft PowerPoint - 01_Introduction.ppt Hello, World C 程序设计语言 第 1 章章观其大略 孙志岗 sun@hit.edu.cn http://sunner.cn prf("hello,, world\n"); 超级无敌考考你 : 如何把 hello 和 world 分别打印在两行? 2004-12-19 A Tutorial Introduction 2 hello.c 打印华氏温度与摄氏温度对照表 计算公式 : C=(5/9)(

More information

untitled

untitled CHAPTER 02 2 CHAPTER 2-1 2-4 2-2 2-5 2-3 2-6 2-1 2-1-1 2-2 02 int A[3] = {10, 20, 30; A[0] 10 A[1] 20 A[2] 30 int *pa[3], A[3]; C 3 pa pa[0]pa[1]pa[2] 3 A A[0]A[1]A[2] 3 A A[0] A + i A[i] A + i &A[i]*(A

More information

C++ 程序设计 OJ4 - 参考答案 MASTER 2017 年 5 月 21 日 1

C++ 程序设计 OJ4 - 参考答案 MASTER 2017 年 5 月 21 日 1 C++ 程序设计 OJ4 - 参考答案 MASTER 2017 年 5 月 21 日 1 1 SWAP 1 Swap 题目描述 用函数模板的方式实现对不同数据类型的数组中的数据进行输入 从小到大排序和输出 使用如下主函数测试你的模板设计一个函数模板 Swap, 实现任意数据类型的两个数据的交换, 分别用 int 型 double 型和 char 型的数据进行测试 main 函数如下 : int main()

More information

编号:

编号: 南 宁 糖 业 股 份 有 限 公 司 主 体 与 12 南 糖 债 2016 年 度 跟 踪 评 级 报 告 跟 踪 评 级 报 告 报 告 编 号 : 东 方 金 诚 债 跟 踪 评 字 2016 026 号 本 次 跟 踪 评 级 主 体 信 用 等 级 :AA 评 级 展 望 : 负 面 债 项 信 用 等 级 :AA 评 级 时 间 :2016 年 5 月 31 日 上 次 信 用 等 级

More information

72075(BOC A Share)_入cover同back cover.indb

72075(BOC A Share)_入cover同back cover.indb 2015 32 3 20142014 2015630 201516 2014 1 2015630 20141231 73,858 85,123 (1) 1,651,951 1,727,805 (2) 126,744 158,224 (3) 396,199 420,059 2,248,752 2,391,211 (1) 2015630 18.5%2014123120.0%5.0%2014 12315.0%

More information

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ4 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 MYQUEUE 1 MyQueue 题目描述 设计一个 MyQueue 类模板, 类模板说明如下 : template class MyQueue; template std::ostream & operator

More information

全国水库移民后期扶持管理信息系统

全国水库移民后期扶持管理信息系统 2016 年 城 市 河 湖 水 华 防 治 项 目 第 四 标 段 : 南 护 ( 太 平 街 橡 胶 坝 东 便 门 橡 胶 坝 ) 生 物 措 施 治 理 招 标 文 件 招 标 / 合 同 编 号 :CSHH-SHFZ-201604 招 标 人 : 北 京 市 城 市 河 湖 管 理 处 招 标 代 理 人 : 北 京 江 河 润 泽 工 程 管 理 咨 询 有 限 公 司 日 期 : 二

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf (%d, & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf (%d %d 2013 18 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp, Compilation Error cin scanf Time Limit Exceeded 1: A 5 B 5 C 5 D 5 E 5 F 5 1 2013 C 1 # include 2 int main ( void ) 3 { 4 int cases, a, b,

More information

C/C++语言 - 运算符、表达式和语句

C/C++语言 - 运算符、表达式和语句 C/C++ Table of contents 1. 2. 3. 4. C C++ 5. 6. 7. 1 i // shoe1.c: # include # define ADJUST 7. 64 # define SCALE 0. 325 int main ( void ) { double shoe, foot ; shoe = 9. 0; foot = SCALE * shoe

More information

第一次段考 二年級社會領域試題 郭玉華 (A)(B) (C)(D)

第一次段考   二年級社會領域試題 郭玉華   (A)(B) (C)(D) 五 福 二 社 p1 高 雄 市 立 五 福 國 民 中 學 97 學 年 度 第 1 學 期 第 1 次 段 考 二 年 級 社 會 學 習 領 域 試 題 卷 代 號 :30 答 案 卡 塗 寫 注 意 事 項 1. 答 案 卡 劃 記 時, 必 須 用 黑 色 2B 鉛 筆 塗 黑 塗 滿, 但 不 可 超 出 圈 外 2. 年 班 級 座 號 科 目 請 劃 記 正 確 若 劃 記 錯 誤,

More information

网C试题(08上).doc

网C试题(08上).doc 学习中心 姓名 学号 西安电子科技大学网络与继续教育学院 高级语言程序设计 (C) 全真试题 ( 闭卷 90 分钟 ) 题号一二三总分 题分 60 20 20 得分 一 单项选择题 ( 每小题 3 分, 共 60 分 ) 1.C 语言程序的基本单位是 A) 程序行 B) 语句 C) 函数 D) 字符 2. 下列四组选项中, 均是不合法的用户标识符的选项是 A)A B)getc C)include D)while

More information

(E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E) (A) (B) (C) (D) (E) (A) (B) (C) (D). ( ) ( ) ( ) ( ) ( ) ( ) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (

(E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E) (A) (B) (C) (D) (E) (A) (B) (C) (D). ( ) ( ) ( ) ( ) ( ) ( ) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). ( . (A) (B) (C) (D) (E). ( ) ( ) ( ) ( ) ( ) ( ) (A) (B) (C) (D) (E) (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). (A) (B) (C) (D) (E). 1950 (A) (B) (C) (D) (E). 60 70 (A) (B) (C) (D) (E). ( ) ( ) ( ) ( ) (

More information

untitled

untitled (encapsulation) 例 類 說 類 料 來 料 information hiding 念 (inheritance) 來說 類 類 類 類 類 類 行 利 來 (polymorphism) 不 類 數 不 1 2 3 4 類 類 不 類 不 類 5 6 7 // virtual 不見了 #include #include using namespace

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

98825 (Project Sunshine) Chi_TC_.indb

98825 (Project Sunshine) Chi_TC_.indb 2116 20132015 2016 6 3010 353103 2016 6 305 30 37 2016 6 30 44.8% 2016 6 3045.4% 36.0% 37 21 16 2013 12 3155,170.5 4,679.8 2015 12 31141,953.3 11,857.2 60.4% 59.2%20.7% 24.7% 2013542.52015 1,402.260.8%

More information

农银人寿发[2013]102号-4 农银寰宇至尊高端医疗保险条款

农银人寿发[2013]102号-4 农银寰宇至尊高端医疗保险条款 农 银 人 寿 [2013] 医 疗 保 险 004 号 请 扫 描 以 查 询 验 证 条 款 农 银 寰 宇 至 尊 高 端 医 疗 保 险 条 款 阅 读 指 引 本 阅 读 指 引 有 助 于 您 理 解 条 款, 对... 本 主 险 合 同... 内 容 的 解 释 以 条 款 为 准... C 您 拥 有 的 重 要 权 益 v 本 主 险 合 同 提 供 的 保 障 第 二 章 v

More information

第五讲 C++程序的结构

第五讲 C++程序的结构 第五章数据的共享与保护 本章主要内容 作用域与可见性 对象的生存期 数据与函数 静态成员 共享数据的保护 友元 编译预处理命令 多文件结构和工程 深度探索 2 命名空间作用域作用域与可见性标识符的作用域 标识符在程序正文中有效的区域 函数原型作用域 局部作用域 类作用域 3 作用域与可见性函数原型的作用域 函数原型中的参数, 其作用域始于 "(", 结束于 ")" 例如, 设有下列原型声明 : double

More information

AAA (i) (ii) 19

AAA (i) (ii) 19 2015 7 14107.7 2009 8 31 51%49% [ ] 2015 4 8 18 2012 7 512012 AAA 622 32 2003 5 23(i) (ii) 19 1.00 (a) (b) 2012119 2005 11 11 2007929 2011 5 3030% 70% 20 2007 11 13 2008 4 15 [ ] 2005 [ ] 2009 2015 7 1050.1

More information