类与对象(随心记录一)

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

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指针接收了,当调用函数的时候,由于空指针不能被操作,所以程序是会崩溃的。

目录
相关文章
|
6月前
|
存储 Java 编译器
对象的交响曲:深入理解Java面向对象的绝妙之处
对象的交响曲:深入理解Java面向对象的绝妙之处
83 0
对象的交响曲:深入理解Java面向对象的绝妙之处
|
编译器 C++
【C++精华铺】6.C++类和对象(下)类与对象补充及编译器优化
构造函数的初始化列表及其行为、static成员(函数,变量)、友元(函数,类)、内部类、匿名对象、对象拷贝时的编译器优化
|
Java 程序员 开发者
只用一行代码,你能玩出什么花样?
只用一行代码,你能玩出什么花样?
96 1
|
编译器 C++
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(3)
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(3)
80 0
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(3)
|
前端开发 C语言
带你读书之“红宝书”:第十章 函数④
带你读书之“红宝书”:第十章 函数④
78 0
带你读书之“红宝书”:第十章 函数④
|
前端开发 JavaScript C语言
带你读书之“红宝书”:第十章 函数①
带你读书之“红宝书”:第十章 函数①
103 0
带你读书之“红宝书”:第十章 函数①
|
安全 编译器 网络安全
一些碎碎念以及类和对象零碎知识点补充
一些碎碎念以及类和对象零碎知识点补充
105 0
一些碎碎念以及类和对象零碎知识点补充
|
C++
爱上c++的第二天:类和对象的三大特性-封装
对只写权限,我们可以检测数据的有效性(不能让用户修改程序,即用户不能访问内部程序,以防用户进行非法操作)
113 0
|
编译器 C++
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(1)
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(1)
111 0
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(1)
|
编译器 C++
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(2)
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(2)
94 0
【C++】—— 类和对象(中)一张图带你搞清楚6个默认成员函数+万字总结 复习全靠它(2)