在Python3中,我有一个带有方法Resistorseries(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);

09-25 18:30