c****s 发帖数: 241 | 1 听来的一道c++题,大家看看
class A{
public A(int t){};
};
void f1(A a){...}
void f2(A& a) {...}
void f3(const A& a) {...}
下面的函数调用,哪些能工作,哪些不能,为什么?
f1(5);
f2(5);
f3(5); |
j***i 发帖数: 1278 | 2 f3 不行吧 有2次type conversion
【在 c****s 的大作中提到】 : 听来的一道c++题,大家看看 : class A{ : public A(int t){}; : }; : void f1(A a){...} : void f2(A& a) {...} : void f3(const A& a) {...} : 下面的函数调用,哪些能工作,哪些不能,为什么? : f1(5); : f2(5);
|
P*******e 发帖数: 1353 | 3 g++试了一下,一三可以,二不行。。。
我一开始也觉得三不行。。。
【在 c****s 的大作中提到】 : 听来的一道c++题,大家看看 : class A{ : public A(int t){}; : }; : void f1(A a){...} : void f2(A& a) {...} : void f3(const A& a) {...} : 下面的函数调用,哪些能工作,哪些不能,为什么? : f1(5); : f2(5);
|
c****s 发帖数: 241 | 4 是啊,我在vs试也是一样的结果。
【在 P*******e 的大作中提到】 : g++试了一下,一三可以,二不行。。。 : 我一开始也觉得三不行。。。
|
c**********e 发帖数: 2007 | 5 f2 need a reference as input. |
g***j 发帖数: 1275 | 6 f1() is fine since the constructor is not explict. If you declare
explict A(int t){}
f1(5) will not work.
void f2(A& a) takes a non-const parameter, but in f2(5), the parameter is a
constant. It's invalid to convert a const to a non-const.
f3(5) is fine. If you declare
explicit A(int t) {}
f3(5) will not work.
【在 c****s 的大作中提到】 : 听来的一道c++题,大家看看 : class A{ : public A(int t){}; : }; : void f1(A a){...} : void f2(A& a) {...} : void f3(const A& a) {...} : 下面的函数调用,哪些能工作,哪些不能,为什么? : f1(5); : f2(5);
|
a****l 发帖数: 245 | 7 f3(5)行,f2(5)不行的原因在more effective c++有提到过。
如果define int i=5, 再call f2(i)还是不行,所以不是由于parameter is a const.
f2(A& a) expects a reference which means "a" may be modified in the function
, but f2(5) or f2(i) will create a temporary object of type A. The
modification will occur on the temporary object and it is not what the
programmer expected. "Implicit type conversion for references-to-non-const
objects, then, would allow temporary objects to be changed when programmers
expected non-temporary objects
【在 g***j 的大作中提到】 : f1() is fine since the constructor is not explict. If you declare : explict A(int t){} : f1(5) will not work. : void f2(A& a) takes a non-const parameter, but in f2(5), the parameter is a : constant. It's invalid to convert a const to a non-const. : f3(5) is fine. If you declare : explicit A(int t) {} : f3(5) will not work.
|