C++ Bar类合法构造方式判断的考试题目咨询
关于Bar类合法构造调用的验证与纠正
给定Bar类的定义:
class Bar{ public: Bar(std::string); Bar(int a=10,double b=7.10, char c='e'); };
先直接给出结论:你的判断有误,合法的构造选项是a和c,d选项无法完成构造,下面逐个拆解分析:
选项a) Bar{4,2,6};
完全合法。这个调用会匹配第二个带默认参数的构造函数:
- 4作为int直接匹配第一个参数
int a; - 2是int,可隐式转换为
double b; - 6是int,可隐式转换为
char c(对应ASCII码为6的控制字符)。
C++允许这些基础类型之间的隐式转换,因此构造有效。
选项b) Bar{"xyz",2};
不合法。有两个匹配方向都走不通:
- 若尝试匹配
Bar(std::string)构造函数,它只接受一个参数,但这里传了两个,参数数量不匹配; - 若尝试匹配第二个构造函数,
"xyz"是const char*,C++不允许指针隐式转换为int,因此没有合适的构造函数可用。
选项c) Bar(true,false);
合法。bool类型可以隐式转换为int和double:
true会被转换为int值1,对应int a;false会被转换为double值0.0,对应double b;- 第三个参数使用构造函数的默认值
'e'。
完全符合第二个构造函数的参数要求,构造有效。
选项d) Bar{5,"abc"};
不合法。尝试匹配第二个构造函数时,第二个参数"abc"是const char*,C++不允许指针类型隐式转换为double;同时也无法匹配单参数的Bar(std::string)(参数数量不对),因此没有可用的构造函数,编译会报错。
选项e) Bar();
单独出现时,这是一个函数声明(声明一个返回Bar类型的无参函数),而非构造Bar对象的语句。只有在表达式语境中(比如auto obj = Bar();)才会调用构造函数,但题目中的写法不属于合法的对象构造方式。
内容的提问来源于stack exchange,提问作者Xavi
相关产品推荐
相关产品推荐

