pal*_*m3D 427 c++ oop struct class c++-faq
这个问题已在C#/ .Net的背景下提出.
现在我想学习C++中结构和类之间的区别.请讨论技术差异以及在OO设计中选择其中一个的原因.
我将从一个明显的区别开始:
public:or private:,则结构的成员默认是公共的; 默认情况下,类的成员是私有的.我确信在C++规范的模糊角落中还有其他差异.
Ass*_*vie 456
你忘记了类和结构之间棘手的第二个区别.
标准(C++ 98到C++ 11中的第11.2.2节):
在不存在的访问说明符 为基类,当派生的类声明,假定公共 结构,并且假定私人当类被声明类.
为了完整起见,在(11.2)中定义了类和结构之间更广为人知的区别:
默认情况下,使用关键字class定义的类的成员是私有的.默认情况下,使用关键字struct或union定义的类的成员 是公共的.
附加差异:关键字class可用于声明模板参数,而struct关键字不能如此使用.
Rob*_*obᵩ 160
引用C++常见问题解答,
[7.8]关键字struct和class之间有什么区别?
结构的成员和基类默认是公共的,而在类中,它们默认为private.注意:您应该明确公开,私有或保护基类,而不是依赖于默认值.
结构和类在功能上是等同的.
好的,足够的那个干净的技术谈话.在情感上,大多数开发人员在类和结构之间做出了很强的区分.结构只是感觉像一堆开放的位,几乎没有封装或功能.课程感觉像是一个生活和负责任的社会成员,拥有智能服务,强大的封装屏障和明确的界面.既然这是大多数人已经拥有的内涵,那么你应该使用struct关键字,如果你有一个只有很少的方法并且有公共数据的类(这样的东西确实存在于设计良好的系统中!),否则你应该使用这个类关键词.
Jon*_*nna 121
值得记住C++的起源和与C的兼容性.
C有结构,它没有封装的概念,所以一切都是公开的.
在采用面向对象的方法时,默认情况下公开通常被认为是一个坏主意,所以在制作一种本身有利于OOP的C形式(你可以在C中做OO,但它不会帮助你),这是在C++中的想法(最初是"C With Classes"),默认情况下将成员设为私有是有意义的.
另一方面,如果Stroustrup改变了语义struct,使其成员默认是私有的,那么它就会破坏兼容性(它不再像标准分歧那样经常出现,但所有有效的C程序都是有效的C++程序,这对于给予C++立足点有很大的影响.
因此,class引入一个新的关键字就像一个结构,但默认是私有的.
如果C++是从头开始的,没有历史记录,那么它可能只有一个这样的关键字.它也可能不会产生影响.
一般来说,人们在做C语言中如何使用结构时会倾向于使用struct; 公共成员,没有构造函数(只要它不在联合中,你可以在结构中使用构造函数,就像类,但人们倾向于不使用),没有虚拟方法等等.因为语言与通信一样多人们阅读代码以指示机器(或者我们坚持使用汇编和原始VM操作码),坚持使用它是个好主意.
64B*_*Bob 10
STRUCT是一种抽象数据类型,它根据结构规范划分给定的内存块.结构在文件序列化/反序列化中特别有用,因为结构通常可以逐字写入文件.(即获取指向结构的指针,使用SIZE宏计算要复制的字节数,然后将数据移入或移出结构.)
类是一种尝试确保信息隐藏的不同类型的抽象数据类型.在内部,可以有各种阴谋,方法,临时变量,状态变量.等等,它们都用于向希望使用该类的任何代码提供一致的API.
实际上,结构是关于数据的,类是关于代码的.
但是,您需要了解这些仅仅是抽象.完全可以创建看起来很像类和类看起来很像结构的结构.事实上,最早的C++编译器只是将C++代码转换为C的预编译器.因此,这些抽象是逻辑思维的一个好处,不一定是计算机本身的资产.
除了每种都是不同类型的抽象之外,Classes还为C代码命名难题提供了解决方案.由于您不能使用相同名称公开多个函数,因此开发人员习惯遵循_()模式.例如mathlibextreme_max().通过将API分组到类中,类似的函数(这里我们称之为"方法")可以组合在一起并保护其免受其他类中方法的命名.这允许程序员更好地组织他的代码并增加代码重用.从理论上讲,至少.
Sur*_*mas 10
1)默认情况下,类的成员是私有的,struct的成员是公共的.
例如,程序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;
}
Run on IDE
// 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;
}
Run Code Online (Sandbox Code Playgroud)
2)从类/结构派生结构时,基类/结构的默认访问说明符是公共的.在派生类时,默认访问说明符是私有的.
例如,程序3在编译时失败,程序4工作正常.
// Program 3
#include <stdio.h>
class Base {
public:
int x;
};
class Derived : Base { }; // is equilalent to class Derived : private Base {}
int main()
{
Derived d;
d.x = 20; // compiler error becuase inheritance is private
getchar();
return 0;
}
Run on IDE
// Program 4
#include <stdio.h>
class Base {
public:
int x;
};
struct Derived : Base { }; // is equilalent to struct Derived : public Base {}
int main()
{
Derived d;
d.x = 20; // works fine becuase inheritance is public
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
class和之间struct的区别是关键字之间的区别,而不是数据类型之间的区别。这两个
struct foo : foo_base { int x;};
class bar : bar_base { int x; };
Run Code Online (Sandbox Code Playgroud)
两者都定义了一个类类型。这个上下文中关键字的不同是默认访问不同:
foo::x是公开的并且foo_base是公开继承的bar::x是私有的并且bar_base是私有继承的小智 5
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;
}
Run Code Online (Sandbox Code Playgroud)
这是在 VS2005 上。
用关键字定义的类的成员class是private默认的。默认情况下,使用关键字struct(或union)定义的类的成员是public。
在不存在访问说明符为基类的,public当假设派生类被声明struct和private所述类被声明当假定class。
您可以声明 anenum class但不能声明enum struct.
您可以使用template<class T>但不能使用template<struct T>.
另请注意,C++ 标准允许您将类型前向声明为 a struct,然后class在声明类型时使用,反之亦然。另外,std::is_class<Y>::value是true对Y的一方为struct和class,而是false一个enum class。
| 归档时间: |
|
| 查看次数: |
336681 次 |
| 最近记录: |