首页 > 试题广场 >

有如下程序段,则程序输出是?

[单选题]
有如下程序段:
#include <stdio.h>
class A {
  public:
    A() { printf("0"); }
    A(int a) { printf("1"); }
    A &operator=(const A &a) {
        printf("2");
        return (*this);
    }
};
int main() {
    A al;
    al = 10;
}

则程序输出是:
  • 02
  • 012
  • 01
  • 以上都不对
推荐
答案 B
解释:
 A al; //调用构造函数A()

 al=10; //10转成A对象,调用A(int)构造函数,然后调用赋值构造函数。 

编辑于 2015-02-04 20:11:30 回复(5)
A a1; //调用A默认构造函数
a1=10; //类型不匹配,调用构造函数A(int)进行隐式转化,之后将引用传给operator=()

发表于 2015-06-06 23:50:47 回复(1)
class A{};例子中类的声明缺少分号,选D,以上都不对
发表于 2016-09-18 10:51:20 回复(6)
012
A a1;调用构造函数A(){}。
a1=10;因为赋值构造函数的参数是A的对象,所以要先把10转化成对象需调用A(int a){}函数,最后调用 赋值构造函数。
发表于 2015-10-26 11:58:54 回复(0)

选D,class 后面少了分号

发表于 2017-09-06 15:10:48 回复(0)
首先创建a1对象,调用无参构造函数,输出0
接着啊a1=10;因为一参构造函数只有一个int形参,触发转换构造函数,输出1
接着返回时,*this将赋值给临时对象,输出2
欢迎指正!
发表于 2017-05-05 21:43:25 回复(0)
B:
A a1;    ///调用默认构造函数
A = 10;  ///准备调用,= 的赋值运算符函数,发现10不是类A的对象,则调用转换构造函数:A(int) 来实现隐式的类型转化
最后进入赋值运算符重载函数。
所以输出: 012

发表于 2017-09-24 10:12:56 回复(0)
常数调用构造函数
发表于 2015-08-08 20:33:33 回复(0)
A a1调用无参的构造函数,则print 0;
a1 = 10;赋值出现错误,左边是一个对象,右边一个常数,正确赋值应该将10强制转换成A类型后,才能完成赋值,所以我认为编译就会出错

发表于 2015-07-21 16:26:06 回复(0)
这个=重载函数是不是写错了?
发表于 2018-02-01 23:43:43 回复(0)
a=10语句,先将10转换成A类对象,调用有参的构造函数,然后再将其赋值给另一个对象,这时调用赋值构造函数。
发表于 2016-05-23 20:34:48 回复(0)
A a1; //调用A默认构造函数 a1=10; //类型不匹配,调用构造函数A(int)进行隐式转化,之后将引用传给operator=()
发表于 2018-12-17 20:19:38 回复(0)

声明是调用构造函数的


发表于 2018-07-05 10:32:54 回复(0)
注意构造函数参数为int的隐式转换构造函数。若构造函数为noexcept则出错。
发表于 2018-06-01 11:52:19 回复(0)
=作为成员函数重载的,各位不觉得这个如果是调用重载后的运算符方式错了吗???
发表于 2018-05-14 11:25:12 回复(0)
先mark
发表于 2018-04-22 12:16:57 回复(0)
形参的转换
发表于 2018-04-16 16:47:08 回复(0)
A a1;    //调用A()
a1 = 10;    //调用A(int),再调用=
发表于 2017-11-07 22:25:14 回复(0)
A a1; //调用A默认构造函数 a1=10; //类型不匹配,调用构造函数A(int)进行隐式转化,之后将引用传给operator=()
发表于 2017-09-16 08:57:32 回复(0)

单形参的构造函数会隐式将形参类型转向类类型,因此为了防止这种转换,单形参构造函数一般会在前面加上explicit。

发表于 2017-06-19 21:38:58 回复(0)
不会产生一个外部的临时对象来保存最后的结果吗?(局部变量一出函数一结束就消失),还是因为赋值运算符重载函数返回this指针,已经保存了最后结果
发表于 2016-07-30 22:30:31 回复(0)