C++入门(三)

目录

前言

类与对象(上)

1.类的定义

2.关于类中的访问限定符

3.类的实例化

4.this指针

总结


前言

今天继续和大家分享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++,我们下次再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值