这个问题已经在c# /. net上下文中提出过了。

现在我想学习c++中结构体和类的区别。请讨论在OO设计中选择一种或另一种的技术差异以及原因。

我将从一个明显的区别开始:

如果没有指定public:或private:,结构体的成员默认为public;默认情况下,类的成员是私有的。

我敢肯定,在c++规范的晦涩角落里还会发现其他不同之处。


当前回答

其他答案提到了private/public默认值(但请注意,struct是类是struct;它们不是两个不同的项目,只是同一项目的两种定义方式)。

值得注意的是(特别是因为请求者提到“非托管”c++,所以很可能正在使用msvc++),在某些情况下,如果一个类用class声明,然后用struct定义(或者可能相反),visualc++会抱怨,尽管标准说这是完全合法的。

其他回答

我发现了另一个不同。如果在类中没有定义构造函数,编译器将定义一个。但是在struct中,如果你没有定义构造函数,编译器也不会定义构造函数。因此,在某些情况下,我们确实不需要构造函数,struct是一个更好的选择(性能技巧)。 对不起,我的英语不好。

结构的成员默认为public,类的成员默认为private。 结构从另一个结构或类的默认继承是公共的。类从其他结构或类的默认继承是私有的。

class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

这是在VS2005上。

你忘记了类和结构之间棘手的第二个区别。

引用标准(§11.2.2在c++ 98到c++ 11):

在没有访问说明符时 对于基类,假定为public 当声明派生类时 Struct和private在类声明为class时被假设。

为了完整起见,更广为人知的class和struct之间的区别定义在(11.2)中:

类定义的类的成员 关键字类private by 违约。定义的类的成员 使用关键字struct或union 默认为public。

另一个区别是:关键字class可以用来声明模板参数,而struct关键字不能这样使用。

默认情况下,用关键字class定义的类的成员为private。用关键字struct(或union)定义的类的成员默认是公共的。 在基类没有访问说明符的情况下,当派生类声明为struct时假定为public,当类声明为class时假定为private。 你可以使用模板<类T>,但不能使用模板<结构T>。

还要注意,c++标准允许将类型前向声明为struct,然后在声明类型时使用class,反之亦然。同样,std::is_class<Y>::value对于Y是一个结构和类是true,但是对于枚举类是false。

c++的起源和与C的兼容性是值得记住的。

C语言有结构体,它没有封装的概念,所以一切都是公共的。

在采用面向对象的方法时,默认为public通常被认为是一个坏主意,所以在编写一种原生有利于OOP(你可以在C中做OO,但它不会帮助你)的C形式时,这是c++(最初是“C With Classes”)的想法,默认为private成员是有意义的。

另一方面,如果Stroustrup改变了struct的语义,使其成员默认为私有,那么就会破坏兼容性(随着标准的分歧,这种情况不再经常发生,但所有有效的C程序也是有效的c++程序,这对c++的立足点有很大影响)。

因此引入了一个新的关键字class,它与struct完全相似,但默认为private。

如果c++从零开始,没有历史,那么它可能只有一个这样的关键字。它也可能不会产生这样的影响。

一般来说,人们在做类似C语言中使用结构体的事情时,会倾向于使用结构体;公共成员,没有构造函数(只要它不在联合中,你可以在结构中有构造函数,就像类一样,但人们倾向于不这样做),没有虚方法,等等。因为语言既可以用来指导机器,也可以用来与阅读代码的人交流(否则我们就会坚持使用汇编和原始VM操作码),所以坚持使用它是个好主意。