一、前言
- C++中的struct结构体和C语言中的struct结构体差异较大。
- C++中的struct结构体和C++中的class类极为相似。
二、C++的struct和class
1.相同点
(1)成员
struct和class都可以在主体中定义成员变量和成员函数!两者在定义成员变量和成员函数上的方式完全一致。
struct S
{
int x;
void f()
{
//函数体
}
};
/***************************************************************************/
class C
{
int x;
void f()
{
//函数体
}
};
(2)构造函数和析构函数
struct
和class
都可以有构造函数、析构函数、拷贝构造函数、移动构造函数等。它们的使用方法完全一致。
struct S
{
S()
{
//构造函数
}
~S()
{
//析构函数
}
};
/***************************************************************************/
class C
{
C()
{
//构造函数
}
~C()
{
//析构函数
}
};
(3)封装
struct和class都具有封装特性,都可以通过访问修饰符public、protected和private来控制外界的访问权限。
struct S
{
public:
/*公有区域*/
protected:
/*受保护区域*/
private:
/*私有区域*/
};
/***************************************************************************/
class C
{
public:
/*公有区域*/
protected:
/*受保护区域*/
private:
/*私有区域*/
};
(4)继承
struct
和 class
都支持继承,可以使用单继承或多继承。
struct A : public B, protected C, private D
{
//结构体A继承自B、C、D
};
/***************************************************************************/
class E : public F, protected G, private H
{
//类E继承自F、G、H
};
(5)多态
struct和class都支持多态,可以使用virtual关键字声明虚函数。
struct S
{
virtual void f()
{
}
};
/***************************************************************************/
class C
{
virtual void f()
{
}
};
(6)运算符重载
struct
和class
都支持运算符重载,这让结构体和类可以像内置类型一样参与运算。例如,重载+
运算符,使得两个结构体或者两个类可以相加:
struct S
{
int x, y;
S operator+(const S& other_S)
{
return {x + other_S.x, y + other_S.y};
}
};
/***************************************************************************/
class C
{
int x, y;
C operator+(const C& other_C)
{
return {x + other_C.x, y + other_C.y};
}
};
(7)模板支持
struct和class都
可以与模板结合使用,从而创建泛型数据结构。
template<typename T>
struct Pair
{
T first, second;
Pair(T a, T b) : first(a), second(b) {} //带初始化列表的构造函数
};
Pair<int> intPair(1, 2); //定义一个Pair结构体
/***************************************************************************/
template<typename T>
class Pair
{
T first, second;
Pair(T a, T b) : first(a), second(b) {} //带初始化列表的构造函数
};
Pair<int> intPair(1, 2); //定义一个Pair对象
2.异同点
(1)封装
class成员的默认访问权限是private,而struct成员的默认访问权限是public。
struct S
{
/*公有区域*/ //不同点
public:
/*公有区域*/
protected:
/*受保护区域*/
private:
/*私有区域*/
};
/***************************************************************************/
class C
{
/*私有区域*/ //不同点
public:
/*公有区域*/
protected:
/*受保护区域*/
private:
/*私有区域*/
};
(2)继承
class的默认继承方式是private,而struct的默认继承方式是public。
struct Base_S
{
};
struct Derived_S : Base_S
{
//未指定继承方式,默认是 public 继承
};
/***************************************************************************/
class Base_C
{
};
class Derived_C : Base_C
{
//未指定继承方式,默认是 private 继承
};
3.总结
C++中,struct和class几乎完全相同, 只有成员的默认访问权限和继承时的默认继承方式不同。从技术角度来说,struct
和 class
可以做同样的事情。
C++ 中,struct
通常用于表示简单的数据结构,更像是 C 语言中的struct
,仅包含数据成员,少量或不包含成员函数。
C++中,class则通常用于表示具有更多功能的复杂对象,不仅包含数据成员,还有操作这些数据的成员函数,以及面向对象的特性,如封装、继承和多态。
当然了,这只是一种约定俗成的用法。在实际开发中,struct
和 class
之间的选择通常是基于习惯和上下文的,而非硬性规则。
三、C++的struct和C的struct
1.相同点
(1)基本语法
C++的struct和C的struct的基本定义语法和使用语法一样 ,如:
struct Point //结构体定义
{
int x;
int y;
};
Point p; //结构体使用
p.x = 10;
p.y = 20;
(2)成员
C++的struct和C的struct都可以包含数据成员。这些数据成员可以是任意基本数据类型(例如int
、float
、char
等),或者是其他复杂类型。
(3)支持指针操作
C++的struct和C的struct的指针操作也是相同的。可以定义一个指向struct
的指针,并通过指针访问结构体的成员。
struct Point
{
int x;
int y;
};
Point p1 = {10, 20};
Point* p = &p1;
p->x = 30; // 通过指针访问成员
(4)支持数组
C++的struct和C的struct都
可以包含数组成员,或被定义为一个数组类型。
2.异同点
(1)成员
在C++中,struct
不仅可以包含数据成员,还可以包含函数成员。这使得C++中的struct
更像是class
,具备面向对象的能力。 在C中,struct
只能包含数据成员,不能包含函数成员。
(2)构造函数和析构函数
在C++中,struct
可以定义构造函数和析构函数,用于对象的初始化和销毁。在C中,struct
不支持这些特性,结构体的初始化必须通过手动赋值来完成。
(3)封装
在C++中,struct
支持访问修饰符(public
、protected
、private
)。在C中,不存在这种访问控制机制。C的struct
成员默认都是public
(可以从外部访问),而C++中的struct
默认也是public
,但可以通过访问控制符号修改其成员的访问权限。
(4)继承
在C++中,struct
可以像class
一样,支持继承,允许从一个struct
继承另一个struct。在C中,struct不支持继承。
(5)多态
在C++中,struct
可以像class
一样,支持多态,可以使用虚函数,对虚函数进行重写。在C中,struct不支持多态
(6)运算符重载
在C++中,struct
可以像class
一样,支持运算符重载,这让结构体可以像内置类型一样参与运算。在C中,struct不支持运算符重载。
(7)模板支持
在C++中,struct
可以与模板结合使用,从而创建泛型数据结构。在C中,没有模板的概念,struct自然也不支持模板。
3,总结
C中的struct主要用于聚合不同的数据类型,类似于容器,用于存储和管理数据,但不具备任何面向对象的功能。
C++中的struct不仅可以像C语言一样使用,还具备了面向对象的特性,可以定义成员函数、构造函数、继承和多态等高级功能。
标签:struct,异同,成员,C++,class,public,构造函数 From: https://blog.csdn.net/han2205277149/article/details/142631701