来自Python,我注意到C ++中的东西往往有点复杂。一个很好的例子就是将数字提升到一个权力。在Python的数学库中,所需要的只是:
a = a**b
但是,在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 );
显然,C ++的创建者必须有充分的理由以这种方式实现,但作为一名新程序员,这些原因让我望而却步。这是否为答案提供了更大的灵活性?在权力方面,我在C ++中给出了哪些好处?
答案 0 :(得分:7)
您找到的多个声明是C ++的静态类型与Python 动态类型的结果。在Python中,当你在一个值上调用一个函数时,它可以在运行时确定你是在整数,浮点数还是一些更复杂的对象上调用它并采取适当的操作。在C ++中,您无法使用不同类型调用相同的函数,因此您必须为要支持的所有类型声明函数的不同版本。但是与C不同,您可以使用同名的函数,这些函数仅在参数签名方面有所不同(如Untitled123所示,这称为函数重载)。这实际上让您的生活更轻松,因为您只需调用pow(a,b)
而无需担心要为您想要的类型调用哪个特殊函数(例如pow_float_int(a,b)
或pow_float_float(a,b)
),编译器将调用基于参数类型的正确版本。
答案 1 :(得分:4)
python中的数字没有限制。由此产生的一些后果是程序往往较慢,因为python不是静态类型的,并且由于它不知道数字是否在某个范围内而具有更多的开销。简而言之,以这种方式使用重载函数的主要原因是出于速度目的,并且更容易推断发生在幕后的事情。 Python提供了很多便利,但有时候很难推理。
其次,大多数语言都有math.pow函数(例如Java),虽然它有点冗长,但我认为它仍然很容易理解。请注意,当您在C ++中调用pow()时,编译器将确定应调用哪个pow(某些数据类型,某些数据类型),并且无需担心多个定义。
答案 2 :(得分:3)
具有多个功能签名的好处在于编译时优化与运行时决策。
在Python中,**
操作在运行时查看其参数,并决定应用哪种算法。整数指数与理性指数相对于任意浮点无限精度指数与复指数相比其他任何指数。这个决定需要时间。
在C ++中,当编译器看到pow(x, y)
时,它在编译时知道x
和y
的类型,因此它可以选择最匹配的pow()
。反过来,这允许编译器避免任何类型的运行时决策。根据头的编写方式和/或整个程序优化的存在,编译器甚至可以内联调用并避免任何类型的运行时开销,而不是实际计算功率。
这通常无关紧要。但是,如果您的pow()
调用处于数百次迭代的紧密循环中,则可能非常重要。
答案 3 :(得分:1)
正如您在c ++中所知,我们使用Power而不是运算符(如python)
你可以像上面的例子一样使用pow。有几种使用此功能的模式,每次向其发送不同的变量时,系统决定选择哪种模式。 pow(float base,float exp); 和 pow(double base,double exp); 不一样,每个都是一个单独的函数
现在,当你进入Python时,状态完全相同。 **运算符就像具有不同模式的C ++函数。就像the operators in C++
的定义一样我希望你理解我的提示