C ++中的struct和class有什么区别?

这个问题已经在C#/。Net上下文中提出过程序员

如今,我想学习C ++中的结构和类之间的区别。 请讨论技术差别以及在OO设计中选择一个或另外一个的缘由。 ide

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

  • 若是您未指定public:private: :,则结构的成员默认为public; 默认状况下,类的成员是私有的。

我确信在C ++规范的晦涩之处能够找到其余差别。 学习


#1楼

  1. 默认状况下,结构的成员是公共的,而默认状况下,类的成员是私有的。
  2. 从另外一个结构或类的结构的默认继承是公共的。从另外一个结构或类的结构的默认继承是私有的。
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上。 spa


#2楼

  • 。 在类中,默认状况下全部成员都是私有的,而在结构中默认状况下全部成员都是公共的。 设计

    1. 对于结构,没有像构造函数和析构函数这样的术语,可是对于类编译器,若是不提供,则会建立默认值。 指针

    2. 空类的Sizeof结构为0字节,而空类的Sizeof为1字节结构的默认访问类型为public。 一般应将结构用于分组数据。 code

    类的默认访问类型为private,继承的默认模式为private。 应该使用一个类对数据和对该数据进行操做的方法进行分组。 对象

    简而言之,约定是在将数据分组时使用struct,而在咱们须要数据抽象甚至继承的状况下使用类。 继承

    在C ++中,除非明确取消引用,不然结构和类将按值传递。 在其余语言中,类和结构可能具备不一样的语义-即。 对象(类的实例)能够经过引用传递,而结构能够经过值传递。 注意:有与此问题相关的评论。 请参阅讨论页添加到对话。


#3楼

C ++中structclass关键字之间的区别在于,当在特定的复合数据类型上没有特定的说明符时,默认状况下structunion是仅考虑数据隐藏的public关键字,而class是考虑程序隐藏的private关键字。代码或数据。 老是有些程序员为了代码而使用struct来存储数据和使用 。 有关更多信息,请联系其余来源。


#4楼

从全部这些因素中,能够得出结论,概念类很是适合表示现实世界的对象,而不是“结构”。很大程度上,由于类中使用的OOP概念在解释现实世界场景时很是实用,所以更容易将它们合并为现实。例如,默认继承是结构的公共属性,可是若是将此规则应用于现实世界,这是很荒谬的。可是在类中,默认继承是private,这是更现实的作法。

不管如何,我须要证实的是,类是一个更普遍的,在现实世界中适用的概念,而结构是一个内部组织较差的原始概念(Eventhough结构遵循OOP概念,它们的含义不好)。


#5楼

类是引用类型,结构是值类型。
当我说类是引用类型时,
基本上,它们将包含实例变量的地址。

例如:

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

在主要方法中
我可使用为该类分配内存的新运算符建立该类的实例
并将其基地址存储到MyClass类型变量(_myClassObject2)中。

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

在上面的程序中,MyClass _myClassObject2 = _myClassObject1; 指令指示两个MyClass类型的变量

  1. myClassObject1
  2. myClassObject2

并将指向相同的内存位置。
它基本上将相同的内存位置分配给另外一个相同类型的变量。

所以,若是咱们对MyClass类型的任何一个对象进行的任何更改都会对另外一个对象产生影响
由于二者都指向相同的存储位置。

“ _myClassObject1.DataMember = 10;” 在此行,对象的两个数据成员都将包含值10。
“ _myClassObject2.DataMember = 20;” 在此行,对象的数据成员都将包含值20。
最终, 咱们经过指针访问对象的数据成员。

与类不一样,结构是值类型。 例如:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

在上面的程序中
使用new运算符实例化MyStructure类型的对象
将地址存储到MyStructure类型的_myStructObject变量中,并
使用“ _myStructObject1.DataMember = 10”将值10分配给结构的数据成员。

在下一行中
我声明了另外一个MyStructure类型的变量_myStructObject2,并将_myStructObject1分配给它。
.NET C#编译器在这里建立_myStructureObject1对象的另外一个副本,并
将该内存位置分配给MyStructure变量_myStructObject2。

所以,不管咱们对_myStructObject1进行的更改如何,都永远不会对MyStructrue类型的另外一个变量_myStructObject2产生影响。
这就是为何咱们说结构是值类型。

所以,该类的直接基类是Object,而Structure的直接基类是ValueType,它从Object继承。
类将支持继承,而结构则不支持。

咱们怎么说呢?
那是什么缘由呢?
答案是班级。

它能够是抽象的,密封的,静态的和部分的,而且不能是私有的,受保护的和受保护的内部。

相关文章
相关标签/搜索