您的位置:  首页 > 鸿蒙 > 正文

高级语言程序设计C++ 第七章 运算符重载

2021-07-17 16:07 管理员 次阅读 条评论

1.  下列运算符中,不能重载的是(  )。
  A.!  B.sizeof  C.new  D.delete 
答题:  A.  B.  C.  D. (已提交)
-->
参考答案:B
问题解析:
2.  下列运算符中,不能用友元函数重载的是(  )。
  A.=  B.== C.<=  D.++ 
答题:  A.  B.  C.  D. (已提交)
-->
参考答案:A
问题解析:
3.  下列函数中,不能重载运算符的是(  )。
  A.成员函数 B.构造函数 C.普通函数  D.友元函数 
答题:  A.  B.  C.  D. (已提交)
-->
参考答案:B
问题解析:
4.  如果表达式++i*k中的++和*都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为(  )。
  A.operator*(i.operator++(),k)
  B.operator*( operator++(i),k)
  C.i. operator++(). operator*(k)
  D.k. operator*( operator++(i)) 
答题:  A.  B.  C.  D. (已提交)
-->
参考答案:B
问题解析:
5.  下列运算符中不能重载的是(  )。
  A.<=  B.>>  C.:  D.&= 
答题:  A.  B.  C.  D. (已提交)
-->
参考答案:C
问题解析:
6.  下面描述中错误的是(  )。
  A.只有系统预先定义的运算符才能被重载
  B.使用类型转换函数不能把一个类转换为另一个类
  C.使用类型转换函数可以把类转换为基本类型
  D.类型转换函数只能定义为一个类的成员函数,不能定义为类的友元函数 
答题:  A.  B.  C.  D. (已提交)
-->
参考答案:B
问题解析:


思考题

1.一个运算符重载函数被定义为成员函数或友员函数,从定义方式、解释方式和调用方式上有何区别?可能会出现什么问题?请用一个实例说明之。

【解答】

以二元运算符为例。

运算符重载定义解释调用
成员函数Obj& operator op();
Obj operator op(object);
Obj.operatorop()
ObjL.operator op(ObjR)
Obj op opObj
ObjLopObjR
左操作数通过this指针指定,右操作数由参数传递
友员函数friend Obj& operator op(Obj&);
friend Obj operator op(Obj,Obj);
operator op(Obj)
operator op(ObjL,ObjR)
Objop opObj
ObjLopObjR
操作数均由参数传递

可能会出现的问题:

(1)运算符的左右操作数不同,须用友员函数重载;

(2)当运算符的操作需要修改类对象状态时,应用成员函数重载。

(3)友员函数不能重载运算符 = () [] ->

必须要用友员函数重载的运算符>><<

程序略。

2.类类型对象之间,类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。

【解答】

构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。

 定义形式调用形式调用时机
构造函数ClassX::ClassX(arg,arg1=E1,...,argn=En);隐式调用建立对象、参数传递时
类类型转换函数ClassX::operator Type();用类型符显式调用;
自动类型转换时隐式调用
需要做数据类型转换时

 

程序设计

1.分别使用成员函数和友员函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。

【解答】

(1) 使用成员函数

#include <iostream>

#include<cstring>

using namespace std;

class s

{  public:

    s()

    { *str = '\0'; len = 0;

    }

  s( char *pstr )

   {  strcpy_s( str,pstr );

      Len = strlen(pstr);

    }

  char *gets()

    {  return str;

    }

  int getLen()

    {  return len;

    }

  s operator+( s obj );

private:

  char str[100];

  int len;

};

s s::operator+( s obj )

{  strcat_s( str,obj.str );

  return str;

}        

int main()

{ s obj1( "Visual" ),obj2( " C++" ),obj3(" language");

  obj3 = obj1 + obj2 + obj3;

  cout << "obj3.str = "<<obj3.gets() << endl;

  cout<<"obj3.len = "<<obj3.getLen()<<endl;

}

(2)使用友员函数

#include <iostream>

#include<cstring>

using namespace std;

class s

{  public:

    s()

    { *str = '\0'; len = 0;

    }

  s( char *pstr )

  {  strcpy_s( str,pstr );

    len=strlen(pstr);

  }

  char *gets()

  {  return str;

  }

int getLen()

  {  return len;

  }

  friend s operator+( s obj1, s obj2 );

private:

  char str[100];

  int len;

};

s operator+( s obj1, s obj2  )

  { strcat_s( obj1.str,obj2.str );

  return obj1.str;

}      

int main()

{ s obj1( "Visual" ),obj2( " C++" ),obj3(" language");

  obj3 = obj1 + obj2 + obj3;

  cout << "obj3.str = "<<obj3.gets() << endl;

}

 

  • 0
    感动
  • 0
    路过
  • 0
    高兴
  • 0
    难过
  • 0
    搞笑
  • 0
    无聊
  • 0
    愤怒
  • 0
    同情
热度排行
友情链接