这个问题已经在c# /. net上下文中提出过了。
现在我想学习c++中结构体和类的区别。请讨论在OO设计中选择一种或另一种的技术差异以及原因。
我将从一个明显的区别开始:
如果没有指定public:或private:,结构体的成员默认为public;默认情况下,类的成员是私有的。
我敢肯定,在c++规范的晦涩角落里还会发现其他不同之处。
这个问题已经在c# /. net上下文中提出过了。
现在我想学习c++中结构体和类的区别。请讨论在OO设计中选择一种或另一种的技术差异以及原因。
我将从一个明显的区别开始:
如果没有指定public:或private:,结构体的成员默认为public;默认情况下,类的成员是私有的。
我敢肯定,在c++规范的晦涩角落里还会发现其他不同之处。
当前回答
类是引用类型,结构是值类型。 我说类是引用类型, 基本上,它们将包含实例变量的地址。
例如:
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.
}
在主要方法中, 我可以使用new操作符创建该类的实例,为该类分配内存 并将其基址存储到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类型的变量
myClassObject1 myClassObject2
并将指向相同的内存位置。 它基本上将相同的内存位置分配给另一个相同类型的变量。
如果我们在MyClass类型的任何一个对象中做的任何改变都会对另一个产生影响 因为两者都指向相同的内存位置。
“_myClassObject1。在这一行,对象的两个数据成员都包含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 "将值10赋给结构的数据成员。DataMember = 10”。
下一行, 我声明了另一个MyStructure类型的变量_myStructObject2,并将_myStructObject1赋值给它。 这里。net c#编译器创建了_myStructureObject1对象的另一个副本 将该内存位置分配给MyStructure变量_myStructObject2。
因此,无论我们对_myStructObject1做了什么改变,都不会对另一个MyStructrue类型的变量_myStructObject2产生影响。 这就是为什么我们说结构是值类型。
class的直接基类是Object而Structure的直接基类是继承自Object的ValueType。 类将支持继承,而结构则不支持。
我们怎么能这么说呢? 这背后的原因是什么? 答案是类。
它可以是抽象的、密封的、静态的和局部的,不能是私有的、受保护的和内部的。
其他回答
类是引用类型,结构是值类型。 我说类是引用类型, 基本上,它们将包含实例变量的地址。
例如:
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.
}
在主要方法中, 我可以使用new操作符创建该类的实例,为该类分配内存 并将其基址存储到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类型的变量
myClassObject1 myClassObject2
并将指向相同的内存位置。 它基本上将相同的内存位置分配给另一个相同类型的变量。
如果我们在MyClass类型的任何一个对象中做的任何改变都会对另一个产生影响 因为两者都指向相同的内存位置。
“_myClassObject1。在这一行,对象的两个数据成员都包含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 "将值10赋给结构的数据成员。DataMember = 10”。
下一行, 我声明了另一个MyStructure类型的变量_myStructObject2,并将_myStructObject1赋值给它。 这里。net c#编译器创建了_myStructureObject1对象的另一个副本 将该内存位置分配给MyStructure变量_myStructObject2。
因此,无论我们对_myStructObject1做了什么改变,都不会对另一个MyStructrue类型的变量_myStructObject2产生影响。 这就是为什么我们说结构是值类型。
class的直接基类是Object而Structure的直接基类是继承自Object的ValueType。 类将支持继承,而结构则不支持。
我们怎么能这么说呢? 这背后的原因是什么? 答案是类。
它可以是抽象的、密封的、静态的和局部的,不能是私有的、受保护的和内部的。
类的成员默认为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;
}
你忘记了类和结构之间棘手的第二个区别。
引用标准(§11.2.2在c++ 98到c++ 11):
在没有访问说明符时 对于基类,假定为public 当声明派生类时 Struct和private在类声明为class时被假设。
为了完整起见,更广为人知的class和struct之间的区别定义在(11.2)中:
类定义的类的成员 关键字类private by 违约。定义的类的成员 使用关键字struct或union 默认为public。
另一个区别是:关键字class可以用来声明模板参数,而struct关键字不能这样使用。
类的成员默认为private。Struct的成员默认为public。除此之外,没有其他区别。还有这个问题。
类只有在软件工程上下文中才有意义。在数据结构和算法的上下文中,类和结构并没有那么大的不同。没有任何规则限制必须引用类的成员。
当与大量的人一起开发大型项目时,你可能最终会得到复杂的耦合代码,因为每个人都使用他们想要的函数和数据。类提供权限控制和固有属性,以增强代码的解耦和重用。
如果您阅读了一些软件工程原理,就会发现没有类,大多数标准都无法轻松实现。例如: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29
顺便说一句,当一个struct分配了大量内存并包含了几个变量时,值类型变量表示值嵌入到struct分配的位置。相比之下,引用类型变量的值是外部的,由一个指针引用,该指针也嵌入在struct分配的地方。