Jes*_*ess 5 c++ function operator-overloading operators
来自Python,我注意到C++中的东西往往有点复杂.一个很好的例子就是将数字提升到一个权力.在Python的数学库中,所需要的只是:
a = a**b
Run Code Online (Sandbox Code Playgroud)
但是,在C++中我发现在线文档中的解释如.....
//float
pow( float base, float exp );
//double
pow( double base, double exp );
//long double
pow( long double base, long double exp );
//float
pow( float base, int iexp );
//double
pow( double base, int iexp );
//long double
pow( long double base, int iexp );
//promoted
pow( Arithmetic1 base, Arithmetic2 exp );
Run Code Online (Sandbox Code Playgroud)
显然,C++的创建者必须有很好的理由以这种方式实现,但作为一个新的程序员,这些原因使我望而却步.这是否为答案提供了更大的灵活性?在权力方面,我在C++中给出了哪些好处?
您找到的多个声明是C++具有静态类型与Python 动态类型的结果.在Python中,当你在一个值上调用一个函数时,它可以在运行时确定你是在整数,浮点数还是一些更复杂的对象上调用它并采取适当的操作.在C++中,您不能使用不同类型调用相同的函数,因此您必须为要支持的所有类型声明函数的不同版本.但是与C不同,您可以使用同名的函数,这些函数仅在参数签名方面有所不同(如Untitled123所指出的,这称为函数重载).这实际上使您的生活更轻松,因为您可以在pow(a,b)不必担心调用哪种特殊函数来调用您想要的类型(例如pow_float_int(a,b)或者pow_float_float(a,b)),编译器将根据参数的类型为您调用正确的版本.
python中的数字没有限制。由此产生的一些后果是,程序往往会变慢,因为 python 不是静态类型的,并且由于它不知道数字是否在某个范围内,因此开销更大。简而言之,以这种方式使用重载函数的主要原因是为了速度目的,并且更容易推断幕后发生的事情。Python提供了很多便利,但有时变得非常难以推理。
其次,大多数语言都有 math.pow 函数(例如 Java),虽然有点冗长,但我认为它仍然很容易理解。请注意,当您在 C++ 中调用 pow() 时,编译器会计算出应该调用哪个 pow(某些数据类型、某些数据类型),而无需担心多个定义。