C++:类与结构体

本文探讨了C语言结构体向C++中类的转变,包括结构体内容的变化、访问限定符的引入、类的实现与对象定义,以及类的大小和内存对齐。强调了C++中类的私有成员和封装的概念,尽管两者在基础实现上有相似之处,但类提供了更丰富的访问控制和默认私有性。
摘要由CSDN通过智能技术生成

一、结构体C过度到C++的提升

1.结构体内容变化

在C语言中,结构体通常只是用来包装变量与指针,函数只能在结构体外定义
而到了C++中,可以把函数也放进结构体里面
在这里插入图片描述
C语言的结构体里可以包含自定义类型,只不过很少用,通常是用结构体指针来指向
(例如:顺序表实现的通讯录,用两个栈实现队列)
因此在C++中的结构体可以存放函数、内置类型与自定义类型

2.结构体定义变量的变动

在C语言中,定义结构体变量的定义同带着struct关键字
而在C++中结构体变量的的定义可以不使用struct关键字

C语言
//typedef struct Node Node;
struct Node
{
	//...
};
结构体变量定义:
struct Node L;

CPP
struct Node
{
	//...
};
结构体变量定义:
Node L;

当然C语言也可以使用typedef来把结构体类型重新起名,但C++的结构体可以直接省略

3.新增访问限定符

访问限定符分三种:public(公有)、private(私有)、protected(保护)
在C语言中的结构体是没有访问限定符的,C++的类和结构体才有
我们也能看到定义结构体变量,需要访问里面的成员时只需 . 就能访问了

例如:
struct Node
{
	int a;
};
struct Node n;
n.a = 10;

所以默认情况下结构体成员变量或成员函数不加访问限定符是公有的

1)访问限定符特点

public公有的特点就是:结构体变量可以随时随地的访问结构体里公有的成员
private反过来私有的特点就是:结构体变量不能访问结构体里私有的成员
protected保护的话对于新手来说与私有没啥区别

我们知道结构体里的成员正常情况下结构体变量都可以访问是公有的
那私有有啥特点与用法:

特点:私有的成员无法使用.来访问,也无法使用->指向来访问修改
无法外部修改,可以很好的保护该成员,提高程序的准确性(谁能保证不会在一些看不到的地方不小心修改了)
用法:私有的成员只能结构体内部的函数来访问,间接的修改结构体私有成员变量
(因为麻烦了就少有人调用修改了,让一些外部不使用的函数定为私有让内部公有函数调用很安全)

为啥弄这些,这种方法叫管控
封装就是把数据与函数放到一个集合,数据无法被外部直接使用,用接口(函数)来完成数据的交互
封装的本质就是管控,想给你访问就定义公有,不想给你访问就定义私有或保护,管理控制起来

2)访问限定符范围

结构体不加访问限定符情况下默认是公有
类不加访问限定符情况下默认是私有

访问限定符的范围是从该访问限定符开始到下一个访问限定符
如果没有下一个访问限定符就是到结构体或类的结尾

二、类的实现与对象的定义

在C++中结构体与类区别不大

1)类的实现

类与结构体实现可以说是很像
在这里插入图片描述
两个大差不差,类在定义的时候通常自己加上访问限定符
因为类的成员如果不加访问限定符默认是私有,并且有访问限定符可以很好的看清楚对象是否能直接使用

2)对象的定义

类定义对象也叫做实例化
类的实例化就是给每个对象开空间
定义对象的时候才会在这对象里面定义里面的变量

如何理解:

class Date
{
private:
	在类里面这只是声明变量,让编译器知道变量的存在
	int _year;
	int _month;
	int _day;
};
Date D;
此时才是给变量开空间

在这里插入图片描述
与结构体一样,该对象也使用 . 访问类的成员,类指针使用 ->访问成员
有人看到Date D(…),括号里面传多少个变量参数的,这都是构造器的作用,实现构造器在下一次
先不让类那么高大尚,和结构体差不了多少

三、类的大小

sizeof可以计算类的大小,结论就是内存对齐下,类的大小是不包含类里面的函数的
在这里插入图片描述
可以看到这个类最终的字节大小是12,根本不包含类里面函数大小
类定义的对象也是12字节
为啥这样子?
类对象的存储机制是只保存成员变量,函数放在公共的代码段区域
这种方法节省空间,如果每一个对象都存一份函数,那内存使用效率就变低了
如果你不信,可以开两个对象,用这两个对象分别打印该函数地址就知道了

总结

类与结构体的实现整体上没啥区别,只是默认情况下类的成员是私有,结构体默认是公有
类的大小不包含函数,根据内存对齐计算成员变量所存地址
结构体在CPP中是可以保护函数的了,并和类差不多
但人们更加偏向类的使用,class关键字跟舒适
类与结构体访问限定符有public(公有)、private(私有)、protected(保护)
类里面的变量是声明,对象才生成变量是定义

以上内容如果有偏差请谅解,表达能力不足
有点懒惰,抱歉了
在这里插入图片描述

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数据结构等价划分(Equivalence Class Partitioning)是一种软件测试技术,它将所有可能的输入划分为一组组相似的子集,每个子集称为一个等价。这种划分有助于确定哪些输入值得特别关注,因为它们代表了一可能的行为。 在C语言中实现数据结构等价划分通常涉及以下几个步骤: 1. 定义等价:根据程序的需求和预期行为,确定输入值的不同别。例如,整数数组的长度、字符数组的字符范围等。 2. 选择测试用例:为每个等价选择至少一个代表性输入(边界值、典型值或异常值),以便覆盖各种可能情况。 3. 编写测试代码:为每个选择的测试用例编写相应的C代码,包括输入生成和处理。 例如,如果你正在测试一个字符串处理函数,可能的等价包括: - 空字符串 - 长度为0的字符串 - 长度为1的字符串 - 一般长度的字符串 - 边界长度(如最大长度或最小长度) - 包含特殊字符的字符串 - 全数字字符串 ```c // 示例代码 #include <stdio.h> #include <string.h> void process_string(char* str) { // ...实际处理函数... } int main() { // 测试用例 char test_cases[] = { "", "a", "abc", "long_string", MAX_LENGTH, "special_chars@123", "123456789" }; int num_tests = sizeof(test_cases) / sizeof(test_cases); for (int i = 0; i < num_tests; i++) { process_string(test_cases[i]); printf("Test case %d: ", i); // 打印处理结果或检查错误 } return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值