关于 return 和参数类型的困惑
Confusion about return and parameter types
我真的是 c++ 的新手,刚刚尝试了一些代码,但有些东西我似乎并没有真正理解:
#include<iostream>
using namespace std;
int f (const long& i) {
return i+1;
}
void g (long& i) {
f (i);
}
int main () {
long la = 0;
int a = 0;
int b = f (a);
long c = f (7);
la = f (la);
cout << "la = " << la << " a = " << a << endl;
cout << "b = " << b << " c = " << c << endl;
}
所以我不明白的是:为什么函数 f 接受 int 类型的变量? a 显然不是 long,但它仍然接受它。我不明白。另外,由于 f 的 return 类型是 int,它会自动将 return 结果从 long 转换为 int 吗?我真的不明白这里发生了什么。
C++ 允许某些类型之间的隐式转换。所有数字 built-in 类型都可以相互转换,因此编译器可以自由地在 int/long/short/long long 和它们的无符号等价物之间进行任何转换。有关类型转换的详细信息,请参阅 cppreference
参数使用了so-called通常的算术转换。类型 int
的对象隐式转换为类型 long
,因为类型 long
的等级高于类型 int
的等级。即 long
类型的对象可以容纳 int
.
类型的任何值
至于 return 类型则可以获得无效结果,因为类型 int
的对象不一定可以容纳类型 long
的值.
请注意,如果您不希望该函数接受一个 int 类型的对象作为参数,您可以使用 int
类型的参数定义相应的函数作为删除。
例如
#include <iostream>
int f (const long& i) {
return i+1;
}
int f( const int & ) = delete;
int main()
{
int a = 0;
f( a );
return 0;
}
程序编译不通过,因为int
类型参数的函数被定义为删除
我真的是 c++ 的新手,刚刚尝试了一些代码,但有些东西我似乎并没有真正理解:
#include<iostream>
using namespace std;
int f (const long& i) {
return i+1;
}
void g (long& i) {
f (i);
}
int main () {
long la = 0;
int a = 0;
int b = f (a);
long c = f (7);
la = f (la);
cout << "la = " << la << " a = " << a << endl;
cout << "b = " << b << " c = " << c << endl;
}
所以我不明白的是:为什么函数 f 接受 int 类型的变量? a 显然不是 long,但它仍然接受它。我不明白。另外,由于 f 的 return 类型是 int,它会自动将 return 结果从 long 转换为 int 吗?我真的不明白这里发生了什么。
C++ 允许某些类型之间的隐式转换。所有数字 built-in 类型都可以相互转换,因此编译器可以自由地在 int/long/short/long long 和它们的无符号等价物之间进行任何转换。有关类型转换的详细信息,请参阅 cppreference
参数使用了so-called通常的算术转换。类型 int
的对象隐式转换为类型 long
,因为类型 long
的等级高于类型 int
的等级。即 long
类型的对象可以容纳 int
.
至于 return 类型则可以获得无效结果,因为类型 int
的对象不一定可以容纳类型 long
的值.
请注意,如果您不希望该函数接受一个 int 类型的对象作为参数,您可以使用 int
类型的参数定义相应的函数作为删除。
例如
#include <iostream>
int f (const long& i) {
return i+1;
}
int f( const int & ) = delete;
int main()
{
int a = 0;
f( a );
return 0;
}
程序编译不通过,因为int
类型参数的函数被定义为删除