C和C++中struct的区别

本文探讨了C++中struct与class的区别,主要集中在默认继承权限和成员访问权限的不同。此外,文章还讨论了struct在C++与C兼容性方面的应用,并详细解释了struct与class在语法上的相似之处。

c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private


关于使用大括号初始化
class和struct如果定义了构造函数的话,都不能用大括号进行初始化
如果没有定义构造函数,struct可以用大括号初始化。
如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化。

关于默认访问权限
class中默认的成员访问权限是private的,而struct中则是public的。

关于继承方式
class继承默认是private继承,而struct继承默认是public继承。

 

为什么在C++中存在struct?很多人都会想到这是为了让C++和C兼容,那么问题就是如何使用C++中的struct和C兼容起来

把C++要交换到C程序的数据在C++程序中声明成一个struct,然后根据C++中程序的语意选择继承或者聚合这个struct,然后在使用的时候就 可以把这个struct封装起来传递到C中或者从C中传递到C++。(注:在深入探索C++对象模型中建议使用聚合,而不是继承,原因是为了和C语言的空 间分布兼容,因为在C++引入虚函数,虚继承导致了派生类的空间包括struct的空间和vptr、vbtl,而且vptr、vbtl存放在哪里由编译器 自己决定,C++标准中没有定义)。

给出一个从C++到C语言的一个简单的例子:

//C++头文件moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

struct person
{
       int age;
       char name[20];
};

class male
{
      private:
              int wife;
              struct person per;

      public:
             int getAge()
             {
                return per.age; 
              }

};

extern "C" void print(person );

#endif

//C++的实现文件

#include "moduleA.h"

#include <stdio.h>

void print(person per)
{
        printf("age :%d, /n",per.age);
        return ;
}

/*待处理的C语言文件*/

#include <stdio.h>

extern "C"
{
       #include "moduleA.h" //或者只要这个也能通过编译
}

int main(void)
{
       person per;
       per.age = 18;
       print(per);
       return 0;

}

讨论一下结构(struct)与类(class)的区别,你认为结构(struct)有些什么作用,可以完全用类(class)取代么??
---------------------------------------------------------------

首先,讨论这个问题应该仅从语法上讨论,如果讨论不同人之间编程风格上的差异,那这个问题是没有答案的。毕竟不同的人偏好不同。

从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别:
(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。

不能因为学过C就总觉得连C++中struct和class都区别很大,下面列举的说明可能比较无聊,因为struct和class本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于struct和class的错误认识:
(1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
(2)都可以有一大堆public/private/protected修饰符在里边;
(3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:A a = {1, 2, 3};不管A是个struct还是个class,前提是这个类/结构足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的构造函数。
(4)都可以进行复杂的继承甚至多重继承,一个struct可以继承自一个class,反之亦可;一个struct可以同时继承5个class和5个struct,虽然这样做不太好。
(5)如果说class的设计需要注意OO的原则和风格,那么没任何理由说设计struct就不需要注意。
(6)再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也只是个包装数据的语法机制。
---------------------------------------------------------------

最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。

### C语言中的 structC++中的 struct区别 #### 成员函数支持 C语言中的 `struct` 只能包含数据成员,不能包含函数。操作这些数据成员需要通过外部函数。相比之下,C++中的 `struct` 可以同时包含数据成员成员函数,这使得 `struct` 在 C++中更接近于 `class`,尽管其成员的默认访问权限是公共的(public)[^1]。 ##### 示例代码 ```c // C语言示例 typedef struct { int x; int y; } Point; void printPoint(Point p) { printf("Point(%d, %d)\n", p.x, p.y); } ``` ```cpp // C++示例 struct Point { int x; int y; void print() { std::cout << "Point(" << x << ", " << y << ")" << std::endl; } }; ``` #### 访问修饰符 C语言中的 `struct` 不支持访问修饰符(如 `public`、`private`)。而在 C++中,`struct` 支持 `public`、`protected` `private` 访问修饰符,允许更精细地控制成员的可见性[^1]。 ##### 示例代码 ```cpp struct MyClass { private: int secret; public: void setSecret(int s) { secret = s; } int getSecret() { return secret; } }; ``` #### 定义变量时的语法 在 C语言中,定义 `struct` 变量时必须使用 `struct` 关键字。而在 C++中,可以直接使用结构体名定义变量,省略 `struct` 关键字[^1]。 ##### 示例代码 ```c // C语言示例 typedef struct { int x; int y; } Point; Point p1; // 直接使用结构体名定义变量 ``` ```cpp // C++示例 struct Point { int x; int y; }; Point p1; // 不需要使用 struct 关键字 ``` #### 继承支持多态 C语言中的 `struct` 不能继承,也不支持多态。而 C++中的 `struct` 支持继承多态,可以作为基或派生[^1]。 ##### 示例代码 ```cpp struct Base { virtual void show() { std::cout << "Base class" << std::endl; } }; struct Derived : public Base { void show() override { std::cout << "Derived class" << std::endl; } }; ``` #### 同名函数冲突 在 C语言中,`struct` 同名函数不冲突。而在 C++中,如果存在同名的函数 `struct`,定义 `struct` 变量时必须加 `struct` 关键字[^1]。 ##### 示例代码 ```cpp // C++示例 struct Point { int x; int y; }; void Point() { // 函数与 struct 同名 } int main() { struct Point p1; // 必须加 struct 关键字 return 0; } ``` #### 默认访问权限 C语言中的 `struct` 成员默认是公共的(public)。在 C++中,`struct` 成员的默认访问权限也是公共的(public),而 `class` 成员的默认访问权限是私有的(private)[^3]。 ##### 示例代码 ```cpp struct MyStruct { int publicVar; // 默认 public }; class MyClass { int privateVar; // 默认 private }; ``` --- ### 总结 C语言中的 `struct` C++中的 `struct` 在功能上有显著的区别。C语言的 `struct` 主要用于数据聚合,只能包含数据成员,不能包含函数,且不支持访问修饰符继承。C++中的 `struct` 更加灵活,可以包含成员函数,支持访问修饰符继承,使得 `struct` 在 C++中更接近于 `class`,尽管它们的默认访问权限不同[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值