在Python3中,我有一个带有方法Resistor
的series(self, other)
类,该方法返回一个新的Resistor
实例,其实例的电阻等于self和other的串联电阻。
class Resistor(object):
# a class to model a resistor
def __init__(self, res=0) :
# default is "typical" value
self.resistance = res
return
def series(self, other) :
# Returns a Resistor object with resistance equal to self + other
sum = self.resistance + other.resistance
return Resistor(sum)
由于变量是对对象的引用,因此这在Python中是有效的,并且似乎是一个习惯用法。类比是Python字符串串联,其中
newstr = str1 + str2
操作产生一个新的字符串对象newstr
。如果我将字面上转换为C++,则可以:
class Resistor
{
public:
// data members
double resistance;
// member functions
Resistor( double res = 1000.0);
Resistor series(Resistor other);
};
Resistor::Resistor(double res)
{
resistance = res;
}
Resistor Resistor::series(Resistor other)
{
Resistor r = Resistor( resistance + other.resistance);
return r;
}
最后是我的问题...这种文字翻译对我安全吗?当局部变量
Resistor
超出范围时,新的r
实例会怎样?我会造成内存泄漏吗?我应该使用指针(我从C知道是危险的)吗?提前致谢
最佳答案
您不会造成内存泄漏,因为Resistor::series
函数将在返回时创建Resistor
对象的副本并销毁现有对象(除非经过编译器优化,这种情况很可能会发生)。
如果此类足够大/复杂,那么在每次调用时进行复制肯定是效率低下的。但是,您的类唯一具有的是double
字段,该字段(取决于弓)的大小可能与指针的大小相同。因此(即使无法执行复制优化),切换到指针可能不会给您带来任何好处,除了潜在的内存泄漏。恰好相反,是吗? :)
但是,如果类实际上更大,则应考虑使用指针。围绕大型对象复制(最终会发生)并不是您真正想要的。但是什么时候该发生呢?这是一个非常微妙的问题,您将无法获得直接答案。您可以尝试不同的方法并进行几次测试以确保。
旁注:通过值将参数传递给函数也将其复制。但是这次与以前的情况不同,除非是临时的,否则不允许编译器对进行优化。因此考虑通过引用传递:
Resistor series(Resistor &other);