Why are C++ classes allowed to have zero data members?

前端 未结 6 2080
遥遥无期
遥遥无期 2020-12-20 16:46

question about c++ why minimal number of data members in class definition is zero

i think it should be one , i.e pointer to virtual table defined by compiler

6条回答
  •  囚心锁ツ
    2020-12-20 17:48

    question about c++ why minimal number of data members in class definition is zero

    It is zero because you have various cases of classes that should have no members:

    You can implement traits classes containing only static functions for example. These classes are the equivalent of a namespace that is also recognizable as a type. That means you can instantiate a template on the class and make sure the implementation of that template uses the functions within the class. The size of such a traits class should be zero.

    Example:

    class SingleThreadedArithmetic
    {
        static int Increment(int i) { return ++i; }
        // other arithmetic operations implemented with no thread safety
    }; // no state and no virtual members -> sizeof(SingleThreadedArithmetic) == 0
    
    class MultiThreadedArithmetic
    {
        static int Increment(int i) { return InterlockedIncrement(i); }
        // other arithmetic operations implemented with thread safety in mind
    }; // no state and no virtual members -> sizeof(MultiThreadedArithmetic) == 0
    
    template class SomeClass
    {
    public:
        void SomeFunction()
        {
            // some operations
            ThreadingModel::Increment(i);
            // some other operations
        }
    };
    
    typedef SomeClass SomeClassST;
    typedef SomeClass  SomeClassMT;
    

    You can define distinct class categories by implementing "tag" classes: classes that hold no interface or data, but are just used to differentiate between separate "logical" types of derived classes. The differentiation can be used in normal OOP code or in templated code. These "tag" classes have 0 size also. See the iterators tags implementation in your current STL library for an example.

    I am sure there are other cases where you can use "zero-sized" classes.

提交回复
热议问题