2009-11-10 13 views
3

虽然“标准”是喜欢​​,是否有任何情况下,其中sizeof(*this)容易出错的或以某种方式不期望的?的sizeof(*此)在首标唯一的构造实施

我第一眼看不到任何东西,但如果是的话,为什么用简短的解释会有帮助。

+0

为标签欢呼和编辑。 – 2009-11-10 22:21:43

+0

标题是一个名词短语;它不会问一个问题,它当然不会“说出来”。标题与什么有关?你真的在问什么? – 2009-11-11 01:27:21

+0

好的,让我们挑选。问题是一个问题,问题。标题是一个特定的上下文。 'header'是一个黑暗的.h坑,有人,任何人都会看一些代码,并且遇到这个构造并想知道它的用法。虽然具体的情况,可以忽略它,并看到其他一些观点。第三,事实上英语不是地球上唯一的语言应该允许一些宽大。而我真正要问的是从''开始,并超越斜体部分到该段的结尾。我会编辑标题,但如果它可以变得更好,请让我再次知道。 – 2009-11-11 09:59:05

回答

10

我能想到的避免sizeof(*this)的唯一原因是它可能被误解为实际对象(例如派生类)的大小。

8

我更喜欢sizeof(variable)而不是sizeof(type),如果可能的话,因为它不太容易出错,以防您的变量更改类型。

3

我的观点是sizeof(type)比sizeof(variable)更可取,以排除歧义。以下示例显示了通过基类指针引用的派生类的实例。 size方法返回sizeof(Derived),所以sz1 == sz3 == sz4。如果调用者没有洞察实现,则可以合理地期望sizeof(Base)。

class Base 
{ 
    public: 
    virtual size_t size(void) 
    { 
     return sizeof(*this) ; 
    } 
    private: 
    int a ; 
    double b ; 
} ; 

class Derived : public Base 
{ 
    public: 
    virtual size_t size(void) 
    { 
     return sizeof(*this) ; 
    } 
    private: 
    long c ; 
    } ; 

int main(int argc , char * argv[]) 
{ 
    Base b ; 
    Derived d ; 

    size_t sz0 = sizeof(Base) ; 
    size_t sz1 = sizeof(Derived) ; 
    size_t sz2 = b.size() ; 
    size_t sz3 = d.size() ; 

    Base * pb = &d ; 
    size_t sz4 = pb->size() ; 
} 
+0

但是,知道真实类型的大小可能会更有用吗? - P.S'reinterpret_cast'看起来很可疑,如果它做得对 - 将派生的'* pb'的类型保留下来? - 完全不需要上传。 – UncleBens 2009-11-10 22:59:54

+0

当需要真实类型的大小时,您必须使用sizeof(变量)。重点在于最好使用sizeof(type)来获取特定类的大小以避免这种影响。 (你是对的,演员是多余的,我编辑了出来) – 2009-11-11 15:52:41