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

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

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

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

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


当前回答

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

其他回答

您可以将此作为何时使用struct或class的指导方针,https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx。

的实例,考虑定义一个结构体而不是类 类型小,通常寿命短或通常嵌入 其他对象。 避免定义结构体,除非该类型具有所有的 以下特点: 它在逻辑上代表一个值, 类似于基本类型(int, double等)。 它有一个实例 大小小于16字节。 它是不可变的。 它不必被装箱 频繁。

类的成员默认为private, struct的成员默认为public。

例如,程序1编译失败,程序2运行正常。

// Program 1
#include <stdio.h>
 
class Test {
    int x; // x is private
};

int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
// Program 2
#include <stdio.h>
 
struct Test {
    int x; // x is public
};

int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

从类/结构派生结构时,基类/结构的默认访问说明符为public。派生类时,默认访问说明符为private。

例如,程序3编译失败,程序4工作正常。

// Program 3
#include <stdio.h>
 
class Base {
public:
    int x;
};
 
class Derived : Base { }; // is equivalent to class Derived : private Base {}
 
int main()
{
  Derived d;
  d.x = 20; // compiler error because inheritance is private
  getchar();
  return 0;
}
// Program 4
#include <stdio.h>
 
class Base {
public:
    int x;
};
 
struct Derived : Base { }; // is equivalent to struct Derived : public Base {}
 
int main()
{
  Derived d;
  d.x = 20; // works fine because inheritance is public
  getchar();
  return 0;
}

另一个主要区别是模板。据我所知,你可以在定义模板时使用类,但不能定义结构。

template<class T> // OK
template<struct T> // ERROR, struct not allowed here

类的成员默认为private。Struct的成员默认为public。除此之外,没有其他区别。还有这个问题。

类只有在软件工程上下文中才有意义。在数据结构和算法的上下文中,类和结构并没有那么大的不同。没有任何规则限制必须引用类的成员。

当与大量的人一起开发大型项目时,你可能最终会得到复杂的耦合代码,因为每个人都使用他们想要的函数和数据。类提供权限控制和固有属性,以增强代码的解耦和重用。

如果您阅读了一些软件工程原理,就会发现没有类,大多数标准都无法轻松实现。例如: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

顺便说一句,当一个struct分配了大量内存并包含了几个变量时,值类型变量表示值嵌入到struct分配的位置。相比之下,引用类型变量的值是外部的,由一个指针引用,该指针也嵌入在struct分配的地方。