C++ class和struct到底有什么区别详解

C++中的class和struct定义方式非常相似,都可以包含成员变量和成员函数,甚至可以互相继承。但实际上,class和struct还是存在一些差别的。下面从以下三个方面对它们进行详细的比较:

定义语法

在定义上,class和struct的语法非常相似,但是有一个小差别:

// 定义class
class MyClass {
public:
    int a;
    void func();
};

// 定义struct
struct MyStruct {
public:
    int a;
    void func();
};

可以看到,它们的定义上没有本质上的区别,仅仅是关键字不同而已。

但是,由于历史原因,C++中结构体的默认访问控制是public,而class的默认访问控制是private。因此,我们通常将struct用于只包含数据的简单结构体、class用于更为复杂的对象。

继承方式

在继承上,class默认继承方式为private,而struct默认继承方式为public。具体的说明可以看下面的示例:

class BaseClass {
public:
    int pub_a;
protected:
    int pro_a;
private:
    int pri_a;
};

class DerivedClass : private BaseClass {
    // 在此处的继承方式为private
public:
    int pub_b;
};

struct BaseStruct {
public:
    int pub_a;
protected:
    int pro_a;
private:
    int pri_a;
};

struct DerivedStruct : BaseStruct {
    // 在此处的继承方式为public
public:
    int pub_b;
};

在示例中,BaseClass和BaseStruct都包含三个访问控制符,分别为public、protected、private。其中,DerivedClass和DerivedStruct都继承自BaseClass和BaseStruct,但不同的是,在DerivedClass中,继承方式为private;而在DerivedStruct中,继承方式为public。

内存对齐

在内存对齐上,由于历史原因,C++中的struct有一个默认的内存对齐方式,而class没有。

具体来说,struct默认情况下以最长的成员变量的大小为对齐单位,而class默认情况下以最严格的对齐方式为对齐单位。这也是为什么struct的大小一般会比class大一些的原因。

下面看一个示例来具体说明:

struct MyStruct {
    char c1;
    int i;
    char c2;
    double d;
};

class MyClass {
    char c1;
    int i;
    char c2;
    double d;
};

int main() {
    cout << "sizeof(MyStruct) = " << sizeof(MyStruct) << endl;
    cout << "sizeof(MyClass) = " << sizeof(MyClass) << endl;
    return 0;
}

在上面的代码中,我们分别定义了一个struct和class,它们包含了四个成员变量:一个字符、一个整数、一个字符、一个双精度浮点数。可以看到,输出结果的大小是不同的,前者是16,后者是24。

综上所述,C++中的class和struct在语法上并没有太大的区别,主要是在默认的访问控制、继承方式和内存对齐上有一些小差别。我们一般将struct用于简单的数据结构,而将class用于复杂的对象定义,以便于对它们进行更严格的访问控制和封装。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ class和struct到底有什么区别详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • win7系统提示Explorer.exe应用程序错误0xc0000142错误窗口的三种解决方法

    下面我介绍一下“win7系统提示Explorer.exe应用程序错误0xc0000142错误窗口的三种解决方法”。 问题描述 在win7系统中,当我们打开Windows资源管理器时,有时会遇到“Explorer.exe应用程序错误0xc0000142”窗口的提示。这个错误提示窗口会阻止我们正常使用资源管理器,造成很大的不便。 解决方法 出现该错误窗口时,可以…

    C 2023年5月23日
    00
  • C程序 通过创建一个函数来检查素数

    创建一个函数来检查素数是一个常见的C语言编程问题。下面是一个步骤指南和示例示范。 步骤指南 步骤如下: 定义函数的名称和返回类型。由于函数检查一个数字是否为素数,因此我们可以定义函数为 isPrime(),且函数返回类型为 int,因为我们需要返回0或1。 在函数内部定义一个整数 i 用于循环。我们需要从2到输入数字的平方根进行循环,判断输入数字是否能被整除…

    C 2023年5月9日
    00
  • 一文搞懂C++中继承的概念与使用

    一文搞懂C++中继承的概念与使用 1. 继承的概念 继承是指在定义一个类时,可以在新的类中直接引用一个已有的父类的属性和行为,新的类称为子类或派生类,已有的类称为父类或基类。 子类会继承父类的公有成员和保护成员,但不会继承父类的私有成员。同时子类可以访问父类的公有成员和保护成员,但无法访问私有成员。 2. 继承的语法 继承语法如下所示: class Chil…

    C 2023年5月22日
    00
  • php通过文件头判断格式的方法

    当我们通过PHP对一个文件进行处理的时候,有时候我们需要判断该文件的格式,从而进一步进行处理。在PHP中,我们可以通过文件头来判断文件的格式。 文件头,也称为魔数(Magic Number),是一个文件开头的特定几个字节,常用来标识文件类型。每种文件类型都有自己的魔数,根据不同的魔数来判断文件的类型,可以防止拓展名被篡改的情况下被误判。 判断文件类型的方法:…

    C 2023年5月23日
    00
  • C++深复制和浅复制讲解

    C++中的复制操作包含深复制和浅复制两种方式。简单来说,浅复制只复制指针而不复制指针指向的内存空间,而深复制会复制指针和指针指向的内存空间。 一般情况下,我们需要使用深复制,以避免浅复制造成指针指向错误的情况。 深复制的实现方式 在C++中,可以通过使用拷贝构造函数和赋值操作符实现深复制。 拷贝构造函数 拷贝构造函数是一种特殊的构造函数,用于在创建对象时,用…

    C 2023年5月23日
    00
  • Java 常量池详解之字符串常量池实现代码

    下面是“Java 常量池详解之字符串常量池实现代码”的完整攻略。 什么是常量池? Java 中的常量池(Constant Pool)是指类和接口中所使用的常量的集合。其中包括了基本数据类型(如 byte、short、int、long、float、double、char、boolean)、字符串以及对其他类型(如 Class 对象和方法句柄)的引用。 什么是字…

    C 2023年5月23日
    00
  • C++ OpenMP简单介绍

    C++ OpenMP简单介绍 什么是OpenMP? OpenMP是一种可以实现线程并行的编程模型。它使用C/C++/Fortran这样的语言来编写程序,而不需要使用任何特定的库或API。OpenMP旨在提高程序的并行性,从而提高应用程序的性能。 如何使用OpenMP? 在C++中,OpenMP使用“pragma”来指定并行计算。这个指令告诉编译器何时开始并行…

    C 2023年5月23日
    00
  • Lua教程(二十一):编写C函数的技巧

    Lua教程(二十一):编写C函数的技巧 在Lua的扩展开发中,编写C函数是非常必要的。本篇文章将介绍一些编写C函数时需要掌握的技巧。 捕获Lua栈 当我们需要在C中调用Lua函数并获得Lua栈中的值时,我们需要使用Lua_API中提供的函数来实现这一目标。我们可以通过以下示例实现: int my_function(lua_State* L) { int ar…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部