习题7及其解答

更新时间:2023-05-23 10:46:34 阅读:20 评论:0

习题7及其解答
7.1  选择题
1.在下列运算符中,不能重载的是(  b  )
(a) !            (b) sizeof            (c) new            (d)  delete
2.下列关于运算符重载的描述中,(  d  )是正确的。
(a) 可以改变参与运算的操作数个数    (b) 可以改变运算符原来的优先级
(c) 可以改变运算符原来的结合性        (d) 不能改变原运算符的语义米歇尔北大演讲
3.下列函数中,不能重载运算符的函数是(  b  )
(a) 成员函数      (b) 构造函数        (c) 普通函数  (d) 友员函数
4.要求用成员函数重载的运算符是(  a  )
(a) =            (b) ==                (c) <=            (d) ++
5.要求用友员函数重载的运算符是(  c  )
(a) =            (b) []                (c) <<            (d) ()
6 下面关于类型转换的描述中,错误的是(  a  )
(a) 任何形式的构造函数都可以实现数据类型转换。
(b) 带非默认参数的构造函数可以把基本类型数据转换成类类型对象。
(c) 类型转换函数可以把类类型对象转换为其他指定类型对象。
(d) 类型转换函数只能定义为一个类的成员函数,不能定义为类的友员函数。
7.2  阅读下列程序,写出执行结果
1
#include <iostream>
using namespace std;
class T
{ public :
    T() { a = 0; b = 0; c = 0; }
        T( int i, int j, int k )
      { a = i; b =j; c = k; }
    void get( int &i, int &j, int &k )
      { i = a; j = b; k = c; }
        T operator* ( T obj );
  private:
        int a , b , c;
};
T T::operator* ( T obj )
{ T tempobj;
  tempobj.a = a * obj.a;
  tempobj.b = b * obj.b;
  tempobj.c = c * obj.c;
  return tempobj;
}
int main()
{ T obj1( 1,2,3 ), obj2( 5,5,5 ), obj3;
  int a , b , c;
  obj3 = obj1 * obj2;
  ( a, b, c );
  cout<<"( obj1*obj2 ):  "
      <<"a = "<<a<<'\t'<<"b = "<<b<<'\t'<<"c = "<<c<<'\t'<<endl;
  (obj2*obj3).get( a, b, c );
  cout<<"( obj2*obj3 ):  "
      <<"a = "<<a<<'\t'<<"b = "<<b<<'\t'<<"c = "<<c<<'\t'<<endl;
}
  解答
( obj1 * obj2 ):  a = 5      b = 10      c = 15
    ( obj2 * obj3 ):  a = 25      b = 50      c = 75
2
#include <iostream>
using namespace std;
class Vector
{ public:
    Vector(){ }
        Vector(int i,int j)
          { x = i ; y = j ;
}
        friend Vector operator+ ( Vector v1, Vector v2 )
      { Vector tempVector ;
        tempVector.x = v1.x + v2.x ;
            tempVector.y = v1.y + v2.y ;
            return  tempVector ;
          }
        void display()
      { cout << "( " << x << ", " << y << ") "<< endl ; }
  private:
    int x , y ;
};
int main()
{ Vector v1( 1, 2 ), v2( 3, 4 ), v3 ;
  cout << "v1 = " ;
  v1.display() ;
  cout << "v2 = " ;
  v2.display() ;
  v3 = v1 + v2 ;
  cout << "v3 = v1 + v2 = " ;
  v3.display() ;
}
解答
v1 = ( 1, 2 )
    v2 = ( 3, 4 )
    v3 = v1 + v2 = ( 4, 6 )
7.3  思考题
    1 一个运算符重载函数被定义为成员函数或友员函数,从定义方式、解释方式和调用方式上有何区别?可能会出现什么问题?请用一个实例说明之。
解答
以二元运算符为例。
运算符重载
定义
解释
调用
成员函数
Obj& operator op();
Obj operator op(object);
Obj.operator op()
ObjL.operator op(ObjR)
Obj op op Obj
ObjL op ObjR
左操作数通过this指针指定,右操作数由参数传递网页翻译工具
友员函数
friend Obj & operator op(Obj &);
friend Obj operator op(Obj,Obj);
operator op(Obj)
operator op(ObjL,ObjR)
Obj op  op Obj
ObjL op ObjR
操作数均由参数传递
可能会出现的问题:
1)运算符的左右操作数不同,须用友员函数重载;
2)当运算符的操作需要修改类对象状态时,应用成员函数重载。
3友员函数不能重载运算符 = () [] ->
必须要用友员函数重载的运算符 >> << 
程序略。
    2 类类型对象之间,类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。
解答
szny
构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。
定义形式
调用形式
调用时机
构造函数
ClassX::ClassX(arg,arg1=E1,...,argn=En);
隐式调用
建立对象、参数传递时
类类型转换函数
ClassX::operator Type();
用类型符显式调用;
自动类型转换时隐式调用
需要做数据类型转换时
7.4  编程题
1.分别使用成员函数和友员函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。
【解
1 使用成员函数
#include <iostream>
#include<cstring>
泔脚
using namespace std;
class s
{  public:
        s(){ *str = '\0'; }
    s( char *pstr )
          {  strcpy( str,pstr );
}
      char *gets()
          {  return str;大学英语六级作文
}
          s operator+( s obj );
  private:
        char str[10];
};
s s::operator+( s obj )
{  strcat( str,obj.str );
  return str;    //return *this
just a dream nelly}   
int main()
{ s obj1( "Visual" ),obj2( " C++" ),obj3;
  obj3 = obj1 + obj2;
  cout << s() << endl;
}
2)使用友员函数
#include <iostream>
#include<cstring>
using namespace std;
class s
{ public:
        s(){ *str= '\0'; }
    s( char *pstr )
        { strcpy( str,pstr );
}
    char *gets()
        {  return str;
}
        friend s operator+( s obj1,s obj2 );
  private:
        char str[100];
};
s operator+( s obj1,s obj2 )
{ s tempobj;
  strcat( tempobj.str,obj1.str );
  strcat( tempobj.str,obj2.str );
  return tempobj;
}
fox新闻
int main()
{ s obj1( "Visual" ),obj2( " C++" ),obj3;
四级报名入口
  obj3 = obj1 + obj2;
  cout << s() << endl;
}
2.定义一个整数计算类Integer,实现短整数 +-*/ 基本算术运算。要求可以进行数据范围检查(-3276832767,或自行设定),数据溢出时显示错误信息并中断程序运行。
【解
#include <iostream>
using namespace std;
class Integer
{ private:
    short a;
疯狂英语原声版
  public:
Integer (short n=0){ a=n;}
    Integer operator +(Integer);
    Integer operator -(Integer);
    Integer operator *(Integer);
    Integer  operator /(Integer);
>回馈英文

本文发布于:2023-05-23 10:46:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/119472.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   运算符   类型   重载   数据   类型转换
相关文章
留言与评论(共有 0 条评论)
昵称:
匿名发表 登录账号
         
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图