c 和c++ struct之间的区别

本文探讨了C语言和C++中struct的不同之处。在C语言中,struct主要用于定义结构体类型,不具备访问控制特性;而在C++中,struct可以拥有成员函数,并支持继承与多态等特性。

一直以来对struct 结构体用的不多,但是最近看了一点关于struce的资料,自己动手试了下感觉C 和C++ 之间struct的区别还是蛮大的。


先介绍一般的struct的结构: 

struct 结构体名{

.....

} 结构体变量名;

这里 结构体名和结构体变量名之间的区别。就是你可以直接使用结构体变量名当做实例。结构体名是来定义结构体的。

比如:

struct student {
    char* name;
 //    int num;
} stu1,stu2;
int main()
{
 struct student  stu;
 stu.name; // 必须先定义
 stu1.name; //直接使用
 return 0;
} 


C语言中因为没有对象的概念,所以没有任何private public protected 的概念.  而struct成员 的默认使用权限就是类似于public.并且是没有成员函数的,只有成员变量.

而C++ 中 struct 可以这么用:

#include <iostream>
using std::cout;
using std::endl;  
struct school
  {
protected: 
  //  virtual  void iname() const =0;
   virtual  void iname() const{}// 虚函数必须定义 纯虚函数可以只声明  
};
 struct student :public school
{
       void iname(){
       cout<<"i named virtual!"<<endl;}
}stu1;

int main(){
     stu1.iname();
     return 0;
}



这样感觉 struct和class相比的话,差别并不是很大。struct也可以定义虚函数和继承,但是这里定义纯虚函数的struct student 好像不可以实例化。 难道是抽象类的影响??不知道.这是一个问题

这里是对struct知识的一个小小的整理吧。 

顺便补充一个小知识点:

string类是C++中才定义的,#include<string>.所以C 中是没有string的,

而C中可以使用 typedef char* string; 来使用string.



<think>好的,我现在需要回答用户关于C++structclass差异的问题。首先,我得回顾一下自己之前学过的相关知识,确保信息的准确性。记得在C++中,structclass的主要区别在于默认的访问权限继承权限。struct默认是public的,而class默认是private的。这一点是最基本的区别,应该放在最前面说明。 接下来,用户提供的引用中有提到structC++中会建立作用域,而C中不会,这点可能涉及到成员变量嵌套结构的作用域问题。需要确认一下,C++struct是否允许成员枚举嵌套结构,而C中的struct是否有不同的行为。引用[2]提到在C中,嵌套的结构体会逃逸到父结构体所在的函数作用域中,而C++则保持它们的作用域在struct内部。这可能是一个重要的差异点,但用户主要关心的是C++中的structclass,所以可能需要简要提到这一点,但重点放在C++上。 然后,引用[3]指出class是用户定义的类型,具有数据函数,而struct在C中更多是数据集合。但在C++中,struct同样可以包含成员函数、构造函数、继承等,几乎class一样的功能。所以需要强调两者在功能上的相似性,以及默认访问权限的不同。 引用[4][1]都提到了类结构体之间的差异,除了默认访问权限外,还有继承时的默认访问权限不同。例如,struct继承时默认是public继承,而class默认是private继承。这一点也是关键区别,需要详细说明。 另外,模板参数中使用classstruct区别,比如template<typename T>template<class T>是否等价。根据之前的了解,它们是等价的,但可能在某些情况下有不同的习惯用法,需要确认这一点是否正确。 用户的问题还可能涉及到使用场景的建议,比如何时使用struct,何时使用class。根据惯例,struct通常用于数据聚合,没有复杂的成员函数,而class用于需要封装复杂行为的对象。需要提到这些惯例,并引用相关的资料来支持。 还需要注意语法上的其他差异,比如定义构造函数时是否需要public声明,或者在继承时的默认访问控制。例如,struct D : Base 默认是public继承,而class D : Base 默认是private继承。 此外,模板元编程中是否倾向于使用struct,因为其成员默认public,可能更方便模板特化时的访问。这也是一个使用场景的区别。 最后,要确保回答的结构清晰,分点列出主要差异,并给出使用建议。同时,按照用户的要求,生成相关问题,帮助用户进一步学习。 总结需要涵盖的要点: 1. 默认访问权限:struct的成员继承默认public,class默认private。 2. 继承时的默认访问权限差异。 3. 使用习惯:struct用于数据聚合,class用于对象封装。 4. 模板参数中的使用习惯。 5. 其他语法差异,如构造函数是否需要public。 6. 模板元编程中的应用场景。 需要验证这些信息是否正确,尤其是关于继承默认权限模板参数的部分。比如,struct继承时确实是public,而class继承是private,这点需要确认。模板参数中,classtypename可以互换,而struct不能作为模板参数的关键字,可能记错了。实际上,template<typename T>template<class T>是等价的,而struct不是用于模板参数声明的,所以这里可能需要修正。 在生成回答时,要确保每个差异点都有引用支持,如引用[3]提到class的数据函数,引用[4]提到继承默认权限的不同。 最后,生成的相关问题要围绕structclass的差异、使用场景、历史演变等方面,帮助用户深入理解。</think>### C++structclass的差异分析 在C++中,`struct``class`的核心差异主要体现在**默认访问权限****继承行为**上,同时两者在代码风格使用场景上也有不同惯例。 #### 1. 默认访问权限 - **`struct`**:成员变量成员函数默认是`public`的。例如: ```cpp struct Point { int x; // 默认为public int y; }; ``` - **`class`**:成员变量成员函数默认是`private`的。例如: ```cpp class Circle { double radius; // 默认为private public: double getArea() { return 3.14 * radius * radius; } }; ``` 这一差异直接影响代码的封装性设计[^3][^4]。 #### 2. 继承时的默认权限 - **`struct`派生**:默认采用`public`继承。例如: ```cpp struct Derived : Base { /* 默认public继承 */ }; ``` - **`class`派生**:默认采用`private`继承。例如: ```cpp class Derived : Base { /* 默认private继承 */ }; ``` 若需其他权限,需显式声明(如`class Derived : public Base`)[^4]。 #### 3. 使用场景与惯例 - **`struct`**: - 适用于**数据聚合**(如坐标点、配置参数)。 - 模板元编程中,因默认`public`权限便于操作成员[^2]。 - 与C语言兼容时优先使用。 - **`class`**: - 强调**封装性****复杂行为**(如银行账户、图形对象)。 - 需要隐藏内部状态或实现细节时首选[^1]。 #### 4. 其他语法细节 - **构造函数**:`struct`可以直接定义构造函数而无需`public`标签: ```cpp struct Data { Data(int a) : val(a) {} // 隐式public int val; }; ``` 而`class`中若需外部调用构造函数,需显式声明为`public`。 - **模板参数**:声明模板时,`class``typename`等价,但`struct`不能用于模板参数声明: ```cpp template<class T> // 合法 template<struct T> // 非法 ``` #### 5. 历史演变 - **C语言中的`struct`**:仅支持数据成员,无作用域嵌套(成员枚举会“逃逸”到外层)[^2]。 - **C++增强**:引入成员函数、继承、访问控制等,使`struct`功能与`class`几乎一致,仅默认行为不同。 --- ### 使用建议 - **选择`struct`**:简单数据集合、与C交互、模板元编程。 - **选择`class`**:需要封装、多态或复杂逻辑的场合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值