当前位置: 首页 > news >正文

C++基础 class、struct、union详细

1、类class

类是面向对象中的特性,在c中是没有类的概念。通常用class来表示,cpp中有抽象类,但是没有接口这种说法,cpp支持多继承。

一个普通的类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

classFruit

{

private:

public:

Fruit();

~Fruit();

};

Fruit::Fruit()

{

}

Fruit::~Fruit()

{

}

构造函数和析构函数:

其中Fruit()表示构造函数,~Fruit()表示析构函数。构造函数用来创建对象,设置初始化参数。析构函数在对象销毁的时候执行。

修饰符:

private:表示私有成员,外部不可访问,只有自身类和友元函数可以访问。
public:表示公共成员,外部可以访问。
protected:表示保护成员,保护成员和私有成员相似,但是子类可以访问保护成员。

类中的成员函数:

我们在类中创建函数的时候,可以直接初始化,或者在类外部实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

classFruit

{

private:

intcount;

public:

Fruit();

~Fruit();

voidadd(inti);

//直接初始化

intgetCount(){

returncount;

}

};

Fruit::Fruit()

{

cout <<"create fruit"<< endl;

}

Fruit::~Fruit()

{

cout <<"fruit deleted"<<endl;

}

//在类外部实现

voidFruit::add(inti){

count = count + i;

}

友元函数:

友元函数虽然可以在类中定义,但是它不属于类的成员函数,必须在类外部实现。它可以访问定义类中的privateprotected成员。

友元类:友元类中的所有函数都是该类的友元。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#include <iostream>

usingnamespacestd;

classFruit

{

private:

intcount = 0;

public:

Fruit();

~Fruit();

// friend void printF(Fruit ft);

friendvoidprintF(Fruit &ft);

};

// void printF(Fruit ft){

// cout << ft.count <<endl;

// }

voidprintF(Fruit &ft){

cout << ft.count <<endl;

}

intmain(){

Fruit fruit;

printF(fruit);

return0;

}

this指针:类的成员函数中都可以用this指针来访问类成员,this指针是const指针,不可修改。

虚函数纯虚函数抽象类

虚函数:使用关键字virtual修饰

1

2

3

virtualvoidfuck2(){

cout <<"fuck 2"<<endl;

}

虚函数表示被子类重写的时候,调用子类的函数而不是父类的此函数

纯虚函数:空的虚函数

1

virtualvoidfuck() = 0;

抽象类:只要类中有纯虚函数就代表是抽象类

抽象类是被实体化的,必须通过子类创建。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

classFruit

{

private:

public:

Fruit();

~Fruit();

virtualvoidfuck() = 0;

voidfuck1(){

cout <<"fuck 1"<<endl;

}

virtualvoidfuck2(){

cout <<"fuck 2"<<endl;

}

};

继承:注意继承需使用public修饰,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

classApple:publicFruit

{

private:

public:

Apple();

~Apple();

voidfuck(){

cout <<"fuck apple"<<endl;

};

voidfuck2(){

cout <<"fuck apple 22"<<endl;

};

};

调用看输出结果:

1

2

3

4

Apple apple;

apple.fuck();

apple.fuck1();

apple.fuck2();

输出:

fuck apple
fuck 1
fuck apple 22

  • fuck()是纯虚函数,调用的是子类
  • fuck1()调用的是父类的方法
  • fuck2()因为是虚函数,又被子类重写了,所以调用的是子类。如果子类不重写虚函数,还是会调用父类的。

多继承如下:

1

2

3

classApple:publicFruit,publicOrange{

}

2、结构体struct

cpp可以用struct来创建自定义数据结构,相当于java中的bean

创建一个基本的结构体:

1

2

3

4

5

6

structBook

{

string name;

intid;

longintISBN;

};

可以在} ;之间创建一个或多个结构体对象:

1

2

3

4

5

6

structBook

{

string name;

intid;

longintISBN;

}book1,book2;

数据局初始化:

1

2

3

4

5

6

7

8

9

10

11

12

13

<!--直接赋值:-->

book1.name ="C++ programing";

<!--或者创建的时候初始化:-->

Book book3{

"Android++",

1,

21321231

};

cout<<book3.id<<endl;

cout<<book3.name<<endl;

cout<<book3.ISBN<<endl;

使用类型别名:

1

2

3

4

typedefstruct{

intid;

string name;

}Ebook;

我感觉是无用的语法糖。

结构体指针:

1

2

3

4

5

6

7

8

9

Ebook ebook{

2,"啊哈哈哈"

};

Ebook *ptr_book;

ptr_book = &ebook;

cout<< ptr_book->id <<endl;

cout<< ptr_book->name <<endl;

和普通指针没啥区别

结构体和class的区别在哪里?

  • 总的来说,struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。
  • 默认的继承访问权限:struct默认是public的,class默认是private的。

c和cpp中的struct有什么不同?

  • c中只能作为数据的结构体,不能有函数,cpp中struct是可以有函数的
  • c中没有修饰符,cpp中结构体可以有publicprotectedprivate修饰符
  • c中创建结构体必须加struct前缀,比如:struct Book book,真是book思议
  • c中没有继承概念,cpp中struct可以继承
http://www.cnnetsun.cn/news/2492007.html

相关文章:

  • 别再只盯着压敏电压了!手把手教你读懂压敏电阻Datasheet上的关键参数(附选型速查表)
  • 电子离子对撞机强子存储环冷却段光束光学设计优化
  • 拆开长江存储TiPlus 7100 SSD,我们发现了关于Xtacking 3.0的一个“秘密”
  • 英雄联盟国服换肤终极指南:R3nzSkin完整使用教程
  • 终极SDR++软件无线电指南:3个步骤让你轻松收听全球无线电信号
  • 总梯度是各样本梯度的线性叠加
  • 互联网大厂 Java 求职者面试:微服务与安全框架的探讨
  • ARM SVE2指令集与SABD指令优化实战
  • 如何解决暗黑破坏神2存档管理的技术困境:d2s-editor深度技术解析
  • 别再手动复制了!用Python的pdfplumber库,5分钟把PDF表格批量转成Excel
  • 善良且有锋芒,理性的利己主义者
  • m4s-converter:5秒完成B站缓存视频转换的完整指南
  • 告别玄学调参:用Python手把手实现卡尔曼滤波器,搞定传感器数据融合
  • 磁力搜索终极指南:magnetW一站式聚合搜索工具快速上手
  • 番茄小说永久保存神器:5分钟打造个人数字图书馆
  • Midjourney景深控制黄金三角法则:prompt构图权重×--s 250×--style raw = 真实光学虚化效果(实验室级验证)
  • ppt模板_0037_圣诞主题6
  • Windows HEIC缩略图预览:告别iPhone照片在Windows的“盲盒“时代
  • 如何高效实现STL到STEP格式转换?专业工具stltostp实战指南
  • League Akari:英雄联盟智能助手完整指南 - 提升游戏体验的终极工具
  • 英雄联盟国服换肤神器R3nzSkin:3分钟解锁所有皮肤终极指南
  • Unity C# Native AOT实战:零IL、零元数据、真防反编译
  • SleeperX:终极Mac电源管理解决方案,重新定义你的工作流程
  • 长期使用Taotoken服务在API稳定性方面的实际反馈
  • 英雄联盟玩家的终极本地化效率工具:League Akari 完全指南
  • 免费压缩包密码恢复工具:3步轻松找回遗忘的加密文件
  • 暗黑3一键宏工具终极指南:D3KeyHelper图形化宏完全教程
  • 暗黑破坏神2存档编辑器深度解析:从新手到高手的实战秘籍
  • HS2-HF Patch:5分钟实现HoneySelect2完整汉化与MOD整合的终极解决方案
  • 告别命令行恐惧:用Portainer在Ubuntu 20.04上轻松管理你的ROS Noetic Docker容器