类与对象(随心记录一)

简介: 类与对象(随心记录一)

1:C++中struct和class的区别是什么?

因为C++是需要兼容C语言的,所以C++中的struct可以当作结构体来使用,这里我们创建一个“日期”结构体

1. #include<iostream>
2. using namespace std;
3. 
4. struct Date
5. {
6.  int _year;
7.  int _month;
8.  int day;
9. };
10. 
11. int main(void)
12. {
13.   Date a;
14.   a._year = 2022, a._month = 12, a.day = 14;
15.   printf("%d %d %d", a._year, a._month, a.day);
16. 
17.   return 0;
18. }

在C语言中直接Date a是会报错的,但C++不会,结构体也可以用类的方式来定义。

运行结果:

然后struct的成员默认访问方式是public,而class的成员默认访问方式是private。

在类和对象阶段,我们只研究类的封装特性,那么什么是封装呢?

封装:隐藏对象的属性和实现细节,仅仅对外公开接口来和对象进行交互

类的作用域

1. #include<iostream>
2. using namespace std;
3. 
4. class Date
5. {
6. public:
7.  void Print();
8.  void Init(int year, int month, int days);
9. private:
10.   int _year;
11.   int _month;
12.   int _days;
13. };
14. 
15. void Date::Print()
16. {
17.   cout << _year << " " << _month << " " << _year << " " << endl;
18. }
19. 
20. void Date::Init(int year, int month, int days)
21. {
22.   _year = year;
23.   _month = month;
24.   _days = days;
25. }
26. 
27. int main(void)
28. {
29.   Date a;
30.   a.Init(2022, 12, 14);
31.   a.Print();
32.   return 0;
33. }

类定义了一个新的作用域,类的所有成员都在类的作用域中在类体外定义成员,需要使用:: 作用域解析符来指明成员属于哪个类域

类对象的存储方式猜测:

 

缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多

个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么如何解决呢?

只保存成员变量,成员函数存放在公共的代码段

this指针

this指针的特性

1. this指针的类型:类类型* const

2. 只能在成员函数的内部使用

3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针

4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

我们先定义一个日期类:

1. #include<iostream>
2. using namespace std;
3. 
4. class Date
5. {
6. public:
7.  void Print();
8.  void Init(int year, int month, int days);
9. private:
10.   int _year;
11.   int _month;
12.   int _days;
13. };
14. 
15. void Date::Print()
16. {
17.   cout << _year << " " << _month << " " << _year << " " << endl;
18. }
19. 
20. void Date::Init(int year, int month, int days)
21. {
22.   _year = year;
23.   _month = month;
24.   _days = days;
25. }
26. 
27. int main(void)
28. {
29.   Date d1,d2;
30.   d1.Init(2022, 12, 13);
31.   d2.Init(2022, 12, 14);
32.   d1.Print();
33.   d2.Print();
34.   return 0;
35. }

在Date日期类中有两个函数,Init和Print,那么函数是怎么判断要设置哪个对象中呢?

C++中通过引入this指针解决该问题,即:C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

接下来我们来进行验证,给出以下代码:

1. #include<iostream>
2. using namespace std;
3. 
4. class Date
5. {
6. public:
7.  void Print();
8.  void Init(int year, int month, int days);
9. private:
10.   int _year;
11.   int _month;
12.   int _days;
13. };
14. 
15. void Date::Print()
16. {
17.   cout << _year << " " << _month << " " << _year << " " << endl;
18. }
19. 
20. void Date::Init(int year, int month, int days)
21. {
22.   _year = year;
23.   _month = month;
24.   _days = days;
25. }
26. 
27. int main(void)
28. {
29.   Date* p = NULL;
30.   p->Init(1, 2, 3);
31.   p->Print();
32.   return 0;
33. }

定义一个空指针的类,NULL被this指针接收了,当调用函数的时候,由于空指针不能被操作,所以程序是会崩溃的。

目录
相关文章
|
2月前
|
Java C++ 开发者
"深度剖析!接口VS抽象类、聚合VS组合...这6大OOP谜题,你真的全解开了吗?点击揭秘真相!"
【8月更文挑战第19天】接口与聚合是面向对象编程的关键,对于构建灵活、可扩展的软件系统至关重要。本文澄清六个常见疑惑:接口与抽象类的区别、为何使用接口、聚合与组合的不同、接口的新特性、聚合与继承的关系,以及如何合理选择接口、聚合和继承,助你深刻理解并准确应用这些核心概念。
30 0
|
5月前
|
存储 编译器 程序员
【C++学习】类和对象(中)一招带你彻底了解六大默认成员函数
【C++学习】类和对象(中)一招带你彻底了解六大默认成员函数
|
11月前
|
编译器 C++
【C++从0到王者】第二十三站:多态的概念、定义以及实现
【C++从0到王者】第二十三站:多态的概念、定义以及实现
48 1
|
数据安全/隐私保护
机房收费系统—经典代码
机房收费系统—经典代码
|
数据可视化 测试技术 BI
机房收费系统—功能介绍
机房收费系统—功能介绍
127 0
|
编译器 C++
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(3)
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(3)
77 0
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(3)
|
C++
爱上c++的第二天:类和对象的三大特性-封装
对只写权限,我们可以检测数据的有效性(不能让用户修改程序,即用户不能访问内部程序,以防用户进行非法操作)
112 0
|
编译器 C++
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(1)
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(1)
106 0
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(1)
|
编译器 C++
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(2)
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(2)
90 0
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(2)
|
设计模式 关系型数据库 Scala
咖啡店的项目引出装饰者模式 | 学习笔记
快速学习咖啡店的项目引出装饰者模式
咖啡店的项目引出装饰者模式 | 学习笔记