目录
前言
今天继续和大家分享C++的相关知识,事实上我们离C++正式入门还有一段距离,接下来的类与对象是C++的重点,学会之后我们便正式入门C++。
类与对象(上)
1.类的定义
我们在第一节的时候讲到过,c++分为四个不同的域,分别是全局域,局部域,类域和命名空间域
其实在c++中,我们可以将类与结构体去近似,他们的基础形式是很像的
就是
class beigin
{
};
但是类的名字就是类的名字,什么意思呢,结构体中
定义完之后,我们要使用的时候需要在名字前加上struct,嫌麻烦不想带着,就需要typedef掉,而class后面的名字就是这个类型的名字
例外在类中我们可以定义函数,变量,结构体等等,c语言中学的结构体并不能定义函数,但在c++祖师爷也对struct进行了扩展,我们在c语言学的那么玩可以运行,c++里结构体也可以像类一样定义,是相似的。
2.关于类中的访问限定符
在使用类的时候,我们经常看到会出现像"public","private",或者“protect“这样的符号,不出现编译就会报错,这就叫访问限定符
他们的作用由我细细道来,
首先从单词的意思我们可以了解,public是“公共”,也就是说定义之后可以在类的外面使用
而private“私有”不可以在类外面被使用,protect在这里我们近似的将他与private的作用看为一致的,但其实有差别,我们后面在去谈论。
访问限定符从一个开始到另一个结束,或者是从一个开始到} 的末尾结束,比如下面这段代码
class begin{
public:
int a;
private:
int b;
}
这里a可以在外面使用,b不可以。
当然我们在第一节就提到过不同域可以定义同名函数,我们也可以定义多个不同名的类,这并不冲突
3.类的实例化
我问大家一个问题,类里面创建的变量是否会开辟空间?
答案其实是不开辟。
我们可以这么去理解这个难点,我们不如将类看做是房屋的图纸,而创建的类的对象才是真正可以住的房屋,也就是说这个类的空间才得到使用和开辟。
好,到这里大家应该理解了类的实例化这一概念,既然涉及到空间开辟,那就必然涉及到空间的大小,那类的空间大小该如何计算呢?
这里类的空间大小计算和结构体基本是一致的,涉及到内存对齐这个概念,不了解的小伙伴可以看我以前的文章,具体详细的讲述了内存对齐原则
当时类本身和我们在c语言阶段学的结构体是有差异的,最大的差异就是类可以定义函数,那函数的空间怎么计算,,内存对齐下,是否考虑需要加上函数指针的空间大小。
我们这样想,如果用类创建了多个对象都去调用各自里面那个相同的函数时,每次都要存函数指针完全没有必要,我们完全可以在汇编指令里call一下函数,调用一下即可,不用每个都存函数指针,这样的开销也是非常大的,因此内存对齐计算的时候就像结构体一样就行,不需要在内存对齐的时候考虑加上函数指针。
4.this指针
什么是this指针呢?我们先看下面这段代码
#include<iostream>
using namespace std;
class Date
{
public:
// void Init(Date* const this, int year, int month, int day)
void Init(int year, int month, int day)
{
// 编译报错:error C2106: “=”: 左操作数必须为左值
// this = nullptr;
// this->_year = year;
_year = year;
this->_month = month;
this->_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
// 这⾥只是声明,没有开空间
int _year;
int _month;
int _day;
};
int main()
{
// Date类实例化出对象d1和d2
Date d1;
Date d2;
// d1.Init(&d1, 2024, 3, 31);
d1.Init(2024, 3, 31);
d1.Print();
d2.Init(2024, 7, 5);
d2.Print();
return 0;
}
首先我们看一段类的代码,发现有两个地方有点陌生,
第一,c语言中我们学习的是编译器只会想下查找,因此定义要在按顺序定义,这里变量定义在类的下方依旧可以,原因是在类中会上下查找,我们不用担心会报错。
第二,如果我们不对year加以修饰就会和形参重复,导致出错,至于_year之类的名字取决于公司要求。
其次,我们看main函数中的代码,我们可以发现创建了d1,d2之后我们直接进行打印,并没有传参,但却打印出了不同的值,原因就在于this指针。
其实类中创建的函数参数都隐藏了一个指针变量参数就是const修饰this指针。正如注释所写的,其实打印的值,是this指针对应打印出的值。
总结
今天主要和大家分享了C++中类与对象的一部分知识,关于C++,我们下次再见。