首页 > 试题广场 >

在下列关于类型转换的描述中,错误的是( )。

[单选题]
在下列关于类型转换的描述中,错误的是()
  • 任何形式的构造函数都可以实现数据类型转换。
  • 带非默认参数的构造函数可以把基本类型数据转换成类类型对象。
  • 类型转换函数可以把类类型对象转换为其他指定类型对象。
  • 类型转换函数只能定义为一个类的成员函数,不能定义为类的友元函数。

转换构造函数(conversion constructor function) 的作用是将一个其他类型的数据转换成一个类的对象。这里回顾一下以前学习过的几种构造函数:
1) 默认构造函数。以Complex类为例,函数原型的形式为:
    Complex( );  //没有参数

2) 用于初始化的构造函数。函数原型的形式为:
    Complex(double r, double i);  //形参表列中一般有两个以上参数

3) 用于复制对象的复制构造函数。函数原型的形式为:
    Complex (Complex &c);  //形参是本类对象的引用

现在介绍一种新的构造函数——转换构造函数

转换构造函数只有一个形参,如
    Complex(double r) {real=r;imag=0;}
其作用是将double型的参数r转换成Complex类的对象,将r作为复数的实部,虚部为0。用户可以根据需要定义转换构造函数,在函数体中告诉编译系统怎样去进行转换。

在类体中,可以有转换构造函数,也可以没有转换构造函数,视需要而定。以上几种构造函数可以同时出现在同一个类中,它们是构造函数的重载。编译系统会根据建立对象时给出的实参的个数与类型选择形参与之匹配的构造函数。

假如在Complex类中定义了上面的构造函数,在Complex类的作用域中有以下声明语句:
    Complex cl(3.5) ;  //建立对象cl,由于只有一个参数,调用转换构造函数
建立Comptex类对象cl,其real(实部)的值为3.5,imag(虚部)的值为0。它的作用就是将double型常数转换成一个名为cl的Complex类对象。也可以用声明语句建立一 个无名的Complex类对象。如
    Complex(3.6) ;   //用声明语句建立一个无名的对象,合法,但无法使用它

可以在一个表达式中使用无名对象,如:
    cl =Complex(3.6);    //假设cl巳被定义为Complex类对象
建立一个无名的Complex类对象,其值为(3.6+0i),然后将此无名对象的值賦给cl,cl 在赋值后的值是(3.6+0i)。

如果已对运算符“+”进行了重载,使之能进行两个Complex类对象的相加,若在程序中有以下表达式:
    c = cl +2.5;
编译出错,因为不能用运算符“+”将一个Comptex类对象和一个浮点数相加。可以先将 2.5转换为Complex类无名对象,然后相加:
    c = cl + Complex (2.5);    //合法

请对比Complex(2.5)和int(2.5)。二者形式类似,int(2.5)是强制类型转换,将2.5转换为整数,int()是强制类型转换运算符。可以认为Complex(2.5)的作用也是强制类型 转换,将2.5转换为Complex类对象。

转换构造函数也是一种构造函数,它遵循构造函数的一般规则。通常把有一个参数的构造函数用作类型转换,所以,称为转换构造函数。其实,有一个参数的构造函数也可以不用作类型转换,如
    Complex (double r){ cout<<r; }  //这种用法毫无意义,没有人会这样用

转换构造函数的函数体是根据需要由用户确定的,务必使其有实际意义。例如也可 以这样定义转换构造函数:
    Complex(double r){ real =0; imag = r; }
即实部为0,虚部为r。这并不违反语法,但没有人会这样做。应该符合习惯,合乎情理。

注意:转换构造函数只能有一个参数。如果有多个参数,就不是转换构造函数。原因是显然的,如果有多个参数的话,究竟是把哪个参数转换成Complex类的对象呢?

归纳起来,使用转换构造函数将一个指定的数据转换为类对象的方法如下:
1) 先声明一个类。

2) 在这个类中定义一个只有一个参数的构造函数,参数的类型是需要转换的类型,在函数体中指定转换的方法。

3) 在该类的作用域内可以用以下形式进行类型转换:
    类名(指定类型的数据)
就可以将指定类型的数据转换为此类的对象。

不仅可以将一个标准类型数据转换成类对象,也可以将另一个类的对象转换成转换构造函数所在的类对象。如可以将一个学生类对象转换为教师类对象,可以在Teacher类中写出下面的转换构造函数:
    Teacher(Student& s){ num=s.num;strcpy(name, s.name);sex=s.sex; }
但应注意,对象s中的num,name,sex必须是公用成员,否则不能被类外引用

发表于 2018-05-28 20:00:46 回复(3)
构造函数有:
1、默认构造函数:Complex();
2、用于初始化的构造函数:Complex(double r, double i);
3、用于复制对象的复制构造函数:Complex(Complex &c);
4、转换构造函数:Complex(double r){real=r; imag=0;}
转换构造函数的作用是将一个其他类型的数据转换成一个类的对象;
类型转换函数的作用是将一个类的对象转换成另一个类型的数据,且类型转换函数只能作为成员函数,因为转换的主体是本类的对象。不能作为友元函数或者普通函数。
根据以上4种构造函数的理解知A错误,B,C,D正确,
发表于 2019-03-15 15:18:30 回复(2)
A只有接受一个参数的构造函数才能作为转换函数
发表于 2018-07-15 16:01:27 回复(1)
只有接受一个参数的构造函数才能作为转换函数。
发表于 2022-06-13 14:13:11 回复(0)
发表于 2019-07-09 01:44:52 回复(0)
如果考类型的隐式转换,直接考关键字explicit的用法即可,建议考点为:给出下述不同样例代码,哪些能够编译通过即可,文字误导性和可解释性太强,容易理解偏差
发表于 2020-07-29 09:25:39 回复(0)
默认构造函数就不能起到类型转换的作用
发表于 2019-12-27 10:07:48 回复(1)
A只有接受一个参数的构造函数才能作为转换函数
发表于 2022-08-27 14:52:28 回复(0)
<p>转换构造函数</p>
发表于 2020-09-10 09:24:08 回复(0)
A. 实现类型转换的是“转换构造函数”;
B.C. 转换构造函数不仅可以把基本类型数据转换成类类型对象,还可以把类类型对象转换为其他指定类型对象;
D. 应该可以,友元函数可以正常访问数据成员。
发表于 2018-06-22 10:29:00 回复(0)