`
rocky2com
  • 浏览: 40939 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C++ 中 struct 和 class 的联系和区别

 
阅读更多

struct vs class

在 C++ 中class 和 struct 只有两点主要区别:

  • 默认继承权限。默认情况下,class的继承是以private来继承而struct则是按照public进行继承。
  • 成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。

而其它的特性,struct和class基本上,甚至严格来说是一样的:

01 //一个不常见的示例,将 struct 直接改为class也能编译通过。
02 //编译环境为 GCC 4.4.1
03 #include <iostream>
04 #include <string>
05 usingnamespacestd;
06
07 structbar
08 {
09 private:// 访问权限修饰符
10 inty;
11 public:
12 bar(){};//无参构造函数
13 bar(inta){ y = a;}//带参数的构造函数
14 ~bar();//虚构函数
15 voidsay();
16 virtualvoidfunc1() = 0;//纯虚函数
17 };
18
19 structfoo:protectedbar// 继承
20 {
21 private:
22 intx;
23 public:
24 foo(){};
25 voidsay(string msg) {cout<<msg<<endl;}
26 virtualintfunc2();//虚函数
27
28 };
29
30 intmain() {
31 return0;
32 }

可以看到:

  • 都可以有成员函数:struct可以包含和class中一样的构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
  • 尽管默认访问权限不同,但都可以拥有public/private/protected修饰符;
  • 都可以进行复杂的继承和多重继承,一个struct可以继承自一个或多个class,反之亦可。
  • 注意这里与C语言并不相同,C 语言中的 struct 从本质上来说只是一个包装数据的语法机制。


Google C++编程风格指南中也声称:

仅当叧有数据时使用 struct,其它一概使用 class。

在 C++中,关键字struct和 class 几乎含义等同,我们为其人为添加语义,以便为定义的数据类型合理选择使用哪个关键字。

struct 被用在仅包含消极对象( passive objects)上,可能包括有关联的常量,但没有存取数据成员外的函数功能,而存取功能通过直接访问实现而无需方法调用,这儿提到的方法是指只用于数据成员的,如构造函数、析构函数、Initialize()、Reset()、Validate()。

如果需要更多的函数功能,class 更适合,如果不确定的话,直接使用 class。

如果不 STL结合,对于仿函数(functors)和特性(traits)可以不用 class 而是使用struct。

虽然一些C++专家声称可以不再使用struct关键字,而可以总是使用class { public:}来代替。但事实上,struct仍在代码中广泛使用,开发人员常使用struct(部分也是由于C语言的影响)来表示一个轻量级的并不需要严格封装的记录,例如,一个写入文件的记录或数据库表结构就常用struct来声明;而class则主要是用来进行面向对象编程。

在一般情况下,仍必须使用struct结构的主要原因是:

  • 开发维护遗留系统。
  • 需要与传统的API进行通讯。

当然,有时使用struct可以让代码看起来更简洁:

1 structCompare {booloperator() { ... } };
2 std::sort(collection.begin(), collection.end(), Compare());

C++ 中的高级特性和语法细节太多,因此遵循一定的编程规范还是很有必要的。

分享到:
评论

相关推荐

    如何在C++中struct与Class的的区别

    从语法上,在C++中(只讨论C++中)。class和struct做类型定义时... 不能因为学过C就总觉得连C++中struct和class都区别很大,下面列举的说明可能比较无聊,因为struct和class本来就是基本一样的东西,无需多说。但这些

    C++中struct和class的区别

    一、C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。  struct能包含成员函数吗? 能!  struct能继承吗? 能!!  struct能实现多态吗?...

    深入C++中struct与class的区别分析

    本篇文章是对C++中struct与class的区别进行了详细的分析介绍,需要的朋友参考下

    C++结构体struct和类class区别详解

    C++语言中,struct和class都是用于定义复杂数据类型的关键字,但是它们之间有着本质的区别。最重要的一点区别就在于默认的访问控制权限,struct默认的继承访问权限是public的,而class默认的继承访问权限是private的...

    EDA/PLD中的如何在C++中struct与Class的的区别

    在C++编程语言中,`struct`和`class`关键字主要用来定义自定义类型,但它们之间存在一些微妙的区别,特别是在EDA(电子设计自动化)和PLD(可编程逻辑器件)这样的领域,对代码的严谨性和效率有着严格要求。...

    浅析c与c++中struct的区别

    在C++中,`struct`和`class`主要的区别在于默认的访问修饰符。C++是面向对象的编程语言,它引入了`class`来实现封装、继承和多态等特性。当定义一个`class`时,其成员默认是`private`的,而定义一个`struct`时,成员...

    c++面向对象基础二(struct详解)

    在C++中,`struct`和`class`在功能上几乎是等价的,主要的区别在于默认的访问修饰符和通常的使用习惯。在实际编程中,选择`struct`还是`class`取决于设计需求和团队规范。如果希望成员默认为公共的,或者在代码风格...

    C++ 中的union、struct 和class 的异同

    本文中写的都是它们在C++中的异同,而非C 中的,因为在C 中无论是union还是stuct 都没有操作,也没有访问控制的概念。

    Desktop_struct与class的区别_

    在C++编程语言中,`struct`和`class`都是用于定义数据结构的关键词,但它们之间存在一些关键区别,这些区别主要体现在访问控制、默认成员访问修饰符和默认构造函数上。 首先,访问控制是两者最显著的区别。在`class...

    c++中STRUCT的使用技巧,编程练习题。.zip

    在C++编程中,`struct` 是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个单一的实体。这使得我们能够更有效地组织和管理数据。本篇将深入探讨`struct`在C++中的使用技巧,并提供一些编程练习题以帮助...

    C类class和结构体struct区别-C教程共3页.pd

    在C++编程语言中,`class`和`struct`都是用于定义自定义数据类型的关键词,但它们之间存在一些重要的区别。这份C++教程可能详细解释了这些差异,并提供了实例来帮助理解。虽然“赚钱项目”这个文件名似乎与主题不...

    C++面试题基础知识回顾

    2、C++中的 struct 和 class 有什么区别? 【参考答案】从语法上讲,class和struct做类型定义时只有两点区别: (一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照...

    hash_set c++总结(自定义类型struct、class)

    hash_set c++总结(自定义类型stuct、class)。总结自定义struct、class三个案例。find函数测试,hash_set迭代器。

    C++封装例程(class,struct,public,protected,private,friend)

    C++封装(class,struct,public,protected,private,friend)的博客例程。 https://blog.csdn.net/flysnow010/article/details/136907034

    c++通过socket udp模式传输struct数据到c++与python

    c++通过socket udp模式传输struct数据(各种类型数据:int double float char long long等)到c++与python。c++通过socket udp接收数据,python通过enum枚举进行接收并且通过赋值给class类,封装统一方法

Global site tag (gtag.js) - Google Analytics