可能重复:
C++中struct和class之间有什么区别
我使用到想的只有 C++类之间的差异是私营的默认类成员访问修饰符和悠闲的出样-C的保证.
事实证明我错了,因为这段代码不能编译:
class { int value; } var = { 42 };
Run Code Online (Sandbox Code Playgroud)
这样做:
struct { int value; } var = { 42 };
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么会有区别,但显然在Visual C++ 2008中:
错误C2552 ::
'var'无法使用初始化列表初始化非聚合
所以,是的,我会问多次重复的问题(希望没有重复的答案!):
当然,如果你发现我在其他问题上遗漏了一些东西,我可以随意关闭它 - 我当然可以.但我没有看到在任何答案中都讨论过这个问题,所以我想我会问.
或者是吗?
面向对象的设计是否应该使用默认情况下公开成员数据的语言结构,如果有一个同样有用的结构可以正确隐藏数据成员?
编辑:其中一个响应者提到,如果没有不变量,可以使用结构.这是一个有趣的观察结果:结构是一种数据结构,即它包含相关数据.如果结构中的数据成员是相关的,那么总是存在不变量吗?
你能保证我,如果在所有访问修饰符(包括继承)struct是public?
换句话说:那些是平等的吗?
class C: public B, public A { public:
C():A(1),B(2){}
//...
};
Run Code Online (Sandbox Code Playgroud)
和
struct C: B, A {
C():A(1),B(2){}
//...
};
Run Code Online (Sandbox Code Playgroud) 可能的重复:
C++ 中的结构和类有什么区别
这个问题已经被问了很多次,也得到了很多回答,但每隔一段时间我就会遇到一些令人困惑的事情。
总而言之,C++ 结构和类之间的区别是著名的默认公共访问与私有访问。除此之外,C++ 编译器对待结构的方式与对待类的方式相同。结构体可以有构造函数、复制构造函数、虚函数。等等。结构的内存布局与类的内存布局相同。C++ 拥有结构体的原因是为了向后兼容 C。
现在,由于人们对使用结构体或类感到困惑,因此经验法则是,如果您只有普通的旧数据,请使用结构体。否则使用一个类。我读到结构在序列化方面很好,但不知道它来自哪里。
然后有一天我看到这篇文章:http://www.codeproject.com/Articles/468882/Introduction-to-a-Cplusplus-low-level-object-model
它说如果我们有(直接引用):
struct SomeStruct
{
int field1;
char field2;
double field3;
bool field4;
};
Run Code Online (Sandbox Code Playgroud)
那么这个:
void SomeFunction()
{
SomeStruct someStructVariable;
// usage of someStructVariable
...
}
Run Code Online (Sandbox Code Playgroud)
和这个:
void SomeFunction()
{
int field1;
char field2;
double field3;
bool field4;
// usage of 4 variables
...
}
Run Code Online (Sandbox Code Playgroud)
是相同的。
它表示,如果我们有一个结构体或只写下函数内的变量,生成的机器代码是相同的。当然,这仅适用于您的结构是 POD 的情况。
这就是我感到困惑的地方。Scott Meyers 在《Effective C++》中说,不存在空类这样的东西。
如果我们有:
class EmptyClass { };
Run Code Online (Sandbox Code Playgroud)
它实际上是由编译器布局的,例如:
class EmptyClass
{
EmptyClass() {}
~EmptyClass() {}
...
};
Run Code Online (Sandbox Code Playgroud)
所以你不会有一个空的班级。 …
我正在寻找一个可以维护一维范围列表的C++类.
每个范围都定义为一(start,len)对.
我希望能够向列表中添加其他扩展区并自动合并它们.也就是说,如果我们拥有(0,5)并(10,5)在列表中,并(5,5)加入,新的列表应该只包含(0,15).
永远不会从列表中删除范围.
有这样的事吗?
谢谢.
我对C++并不是很熟悉,当我尝试一些测试程序时,我想到了一个关于最好的问题,如果我可以这样说,在C++代码中定义一些原始元素.
我们来看一个描述矩形的类.它会创建它们,绘制它们,旋转它们,调整大小等等...现在在大多数情况下我们必须处理画布上的点.其自身的矩形由2个点描述:左上角和右下角.另外,为了旋转它,您需要一个角度和一个点(锚点).或者可能要移动它,您需要一个给定矩形的新锚点.我想我已经说明了使用积分.那么什么更有效?将此原始点定义为类还是结构?
class cPoint
{
public:
int X;
int Y;
};
Run Code Online (Sandbox Code Playgroud)
要么
typedef struct
{
int X;
int Y;
}sPoint;
Run Code Online (Sandbox Code Playgroud) 我(非常)是C++的新手,我遇到了一些理解结构的问题.我正在使用课程中的示例代码,所以我有:
struct Point {
int x;
int y;
}
Run Code Online (Sandbox Code Playgroud)
在另一段代码中,我想写下面的内容:
drawLine(point1, new Point(x, y));
Run Code Online (Sandbox Code Playgroud)
这不起作用,我理解我试图声明一个结构就好像它是一个类,但有没有办法做到这一点?我目前编写了一个辅助函数,它从x,y返回一个Point,但这看起来很迂回.
可能重复:
C++中struct和class之间有什么区别
如果结构和类之间的唯一区别是默认访问说明符(在C++中),那么为什么C++也有类?
所以我刚刚学习了scala案例类,并且我被告知他们习惯于围绕一堆属性提供一个简单的包装器,以便更容易测试相等性.但现在我有两个问题:
我有一个任务,我需要将一些Ada代码转换为C++代码,使其尽可能与Ada代码相似.Ada代码如下
type Shape is (Circle, Triangle, Rectangle);
type Colors is (Red, Green, Blue);
type Figure(Form: Shape := Circle) is
record
Filled: Boolean;
Color: Colors;
case Form is
when Circle =>
Diameter: Float;
when Triangle =>
Left_Side: Integer;
Right_Side: Integer;
Angle: Float;
when Rectangle =>
Side_1: Integer;
Side_2: Integer;
end case;
end record;
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用一个class但是根据问题的语言和老师的个性来判断我认为他正在寻找一个struct.我不清楚如何创建一个内部不同情况所需的逻辑struct.老师非常特别,所以我认为需要最小的内存占用.
我是CSc的学生,如果解决方案很简单,请原谅我.谢谢!
更新:所以最终答案比我想象的要简单.
enum Shape {Circle, Triangle, Rectangle};
enum Colors {Red, Green, Blue};
struct Figure {
bool Filled;
Colors Color;
Shape Form; …Run Code Online (Sandbox Code Playgroud) c++ ×9
struct ×7
class ×4
ada ×1
algorithm ×1
case-class ×1
inheritance ×1
oop ×1
scala ×1
typedef ×1