我正在上C++中的面向对象编程课程.在最近的一项任务中,我定义了一个成员函数struct.我的讲师解释说,尽管在结构体中使用成员函数是可编辑的,但他希望我们没有,为了向后兼容C,并且(特别是在这个初学者类中)实践良好的数据封装 - 我们应该使用a struct类型主要包含数据,以及class适用于更多程序封装的应用程序.他表示这种做法来自于C++中结构/类的历史,这是我想要了解的更多内容.
我知道除了默认的成员/继承访问之外,结构在功能上与类相同.我的问题是:
为什么结构和类包含在C++中?从我在C#中的背景,结构和类有重要区别,似乎struct在C++中只是用于定义具有默认public-ness的类的语法糖.是吗?
我不是在寻找关于何时/为什么应该使用而不是使用其他人的意见 -在这些结构之后我出生得很好,而且我正在寻找它们的历史.他们在一起构思了吗?如果是这样,为什么?如果没有,哪个是第一个,为什么第二个被添加?我意识到在这个社区中有许多古老的长者可能对这些特征的起源有所记忆,并且标准出版物的链接或代码的例子,其中一个或另一个首次出现,将增加答案的帮助.
请注意,这个问题不是:
作为我在C++标准ANSI ISO IEC 14882 2003上阅读厕所的一部分,我遇到了以下内容:
14.3.1.2:本地类型,没有链接的类型,未命名的类型或从这些类型中的任何类型复合的类型不得用作模板类型参数的模板参数.
虽然我得到的是本地类型和复合类型,但什么是未命名的类型?如果一个类型未命名,你怎么能尝试在模板中使用它,这促使标准口头排除它?
在诸如此类的情况下,在结构上使用类是否有任何优势?(注意:它只会保存变量,永远不会有函数)
class Foo {
private:
struct Pos { int x, y, z };
public:
Pos Position;
};
Run Code Online (Sandbox Code Playgroud)
与:
struct Foo {
struct Pos { int x, y, z } Pos;
};
Run Code Online (Sandbox Code Playgroud)
类似的问题:
假设我有:
struct Foo: public Bar {
....
}
Run Code Online (Sandbox Code Playgroud)
Foo没有推出新的会员变速器.Foo只介绍了一堆成员函数和静态函数.C++标准的任何部分现在都保证:
sizeof(Foo) == sizeof(Bar)
Run Code Online (Sandbox Code Playgroud)
?
谢谢!
可能重复:
C++中struct和class之间有什么区别
我完成了我的作业,并在谷歌上有不同的答案.有人说结构没有继承,有人说结构没有访问说明符,而有些人说它们都有.
那么有人可以澄清一下C和C++中结构和类之间的差异,以及C和C++中结构之间的区别.
在C结构中,可以指定另一个位长度,而不是类型的默认位长度,如下所示:
struct MyStruct{
int myVar : 1; //Size of myVar is 1 bit (so it can take values 0 or 1
int myOtherVar: 4; //Size of myOtherVar is 4 bits (so it can take values 0 to 15)
}
Run Code Online (Sandbox Code Playgroud)
这称为位字段.
我的问题是,是否也可以在C++类中执行此操作,如下所示:
class MyClass{
public:
//Some methods
private:
int m_myAttribute : 1;
int m_myOtherAttribute : 4;
}
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了这个,但我找到的所有比特字段的例子都使用了结构,而不是类.
我测试了这段代码并且编译得很好,但是我想知道属性的大小是否真的是指定的大小,或者编译器是否忽略了位字段并使用了标准int大小.
我们知道,struct并且class可以在语言的许多地方互换.令人困惑的是,关键字本身并不一定与标准中使用的语言相对应.例如,在草案标准N4567 [class]/10中,
甲POD结构109是一个非工会类既是琐碎类和一个标准布局类,和具有类型的非POD结构,非POD联合(或这些类型的阵列)的无非静态数据成员.类似地,POD联合是一个简单的类和标准布局类的联合,并且没有非POD结构类型的非静态数据成员,非POD联合(或这种类型的数组).甲POD类是一类可以是一个POD结构或一个POD结合.
在过于简化的术语,struct并且class是在以下情况下可以互换:
union但是,struct 显式不能在模板声明中用于引入类型模板参数:
template <struct T> // error
Run Code Online (Sandbox Code Playgroud)
我无法看到之间的任何显著差异struct和class,甚至在POD上面的例子,因为一个POD结构为界定标准,使用时请声明struct或class.
[class]/8 标准布局结构是使用类键结构或类键类定义的标准布局类.甲 标准布局联盟是与定义的标准布局类类键联合.
这引起了明显的不一致,这似乎相当多余和令人困惑.
我有两个问题:
是否有任何技术差异,我错过了明显区分struct和class?
这种笨拙背后的理由是什么?
我忽略了默认访问说明符之间的区别,因为每个人都已经知道了.
可能重复:
C++中struct和class之间有什么区别
http://www.cplusplus.com/reference/std/typeinfo/type_info/
我想我的"老师"并没有告诉我很多关于C++中struct和classes之间的区别.
我在其他一些问题中读到有关继承的问题,结构默认是公共的...我也猜测struct没有构造函数/析构函数...
那么其他的差异呢?他们这么重要吗?
在谈到私有/受保护的属性/方法时,它们在运行时是不可访问的,只是因为编译器在编译时告诉它并报告错误,对吧?然后将这些功能与类进行比较,"信息隐藏"真正为程序员带来了什么?是否在这里,当有人重用该类时,这个人不会滥用该类,因为编译器会报告私有/受保护的东西?
我仍然为信息隐藏的真正目的而苦苦挣扎,它仍然希望在我的脑海中发出声音,因为它为程序带来更多安全性,意味着更少的安全漏洞,但我真的很困惑这种设计在语言中的目标...... (而且我不打算以任何方式反对C++,我只是想了解在什么情况下这个功能可能有趣或不;如果不是,那不是问题,但我只是想知道...).
可能重复:
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'无法使用初始化列表初始化非聚合
所以,是的,我会问多次重复的问题(希望没有重复的答案!):
当然,如果你发现我在其他问题上遗漏了一些东西,我可以随意关闭它 - 我当然可以.但我没有看到在任何答案中都讨论过这个问题,所以我想我会问.
c++ ×10
class ×7
struct ×7
standards ×3
bit-fields ×1
inheritance ×1
taxonomy ×1
templates ×1
types ×1