【C++修仙录02】筑基篇:类和对象(上)

嗨~大家好,这里是春栀怡铃声的博客~

"做你害怕的事,然后发现,不过如此~"

目录

类域

类的定义

访问限定符

实例

对象大小

内存对齐

[this 指针](#this 指针)


类域

类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用

:: 作用域操作符指明成员属于哪个类域。

而函数的声明、定义分离,则需要特别说明类域,比如函数的声明在类中,而定义则在类外显示

如下:

cpp 复制代码
class Date
{
 public:
	  Date(int year,int month,int day) 	 {
		  _year = year;
		  _month = month;
		  _day = day;
	 }
	  void Print();

private:
	int _year;
	int _month;
	int _day;
};

void Date::Print()
{
     cout << _year << "/" << _month << "/" << _day << endl;
}

注意!void 在类名的前面

void Date::Print();

类的定义

类定义格式

cpp 复制代码
class Date
{
 public:
	  Date(int year,int month,int day) 	 {
		  _year = year;
		  _month = month;
		  _day = day;
	 }
	  void Print()
	  {
		  cout << _year << "/" << _month << "/" << _day << endl;
	  }

private:
	int _year;
	int _month;
	int _day;
};

class为定义类的关键字Date 为类的名字,{}中为类的主体 ,注意类定义结束时后面分号不能省 略。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量;(为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前面或者后面加 _ 或者m 开头,注意C++中这个并不是强制的)

类中的函数称为类的方法或者成员函数 。定义在类里面的成员函数默认为inline。

在上面代码中 _year 、 _month 、_day 属于成员变量;Print 、Date 属于成员函数

还有一种类是 struct 类型,这种类中的所有成员都是可以在类域外直接访问的

访问限定符

访问限定符: public、private、protected

访问限定符是通过 访问权限选择性 的将其接口提供给外部的用户使用

public 中的成员**,类域外可以访问**

protected 、 private 中 的成员类域外不可访问

class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

⼀般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

实例

类就像是建房子的图纸,而对象则是通过类(图纸)建造出来的房子。

类里面的成员只是一种声明,并不开空间,设计图纸而已,并不能真正住人

类是对象进行⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只

是声明,没有分配空间,用类实例化出对象时,才会分配空间。

一个类可以实例化出多个对象

对象大小

先来分析对象中的成员:变量、函数,变量有各种类型的,需要内存对齐

而函数被编译后是一段指令,指令存储是存储到特定区域而不是对象当中,由此看来剩下函数指针

无论建立多少个对象,函数指针都不会变,存储函数指针并没有意义

所以对象的大小由变量来决定。 变量又有不同类型,这又需要内存对齐的知识了

内存对齐

1.vs默认对齐数是8

2.结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

3.对齐数是变量类型与默认对齐数之中更小的那个

4.第一个成员在与结构体偏移量为0的地址处。

5.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

在vs平台下 来试试算a 的大小

cpp 复制代码
#include<iostream>
using namespace std;
class A
{
   public:
    void Print()
     {
       cout << _ch << endl;
     }
   private:
     char _ch;
     int _i;
};
int main()
{
   A a;
   cout << sizeof(a) << endl;
   return 0;
}

首先算对齐数,vs默认对齐数是8 ,int 类型占用字节数是4 ,相比之下,4小于8 对齐数是4

画图

this 指针

请看这段代码

cpp 复制代码
#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)
 {
   _year = year;
   _month = month;
   _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(2024, 3, 31);
 d1.Print();

 d2.Init(2024, 7, 5);
 d2.Print();
 return 0;
}

我们创建了2个对象d1、d2 在调用类中函数实现功能时,是怎么区分d1,d2的呢

欸,这里就引入了this 指针

类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this 指针。

其实在上面代码中,函数还隐藏了一个参数,真正的成员函数如下:

void Init(Date* const this, int year, int month, int day)

每次调用Init 函数时,会把当前对象的地址也传过去,这样就不会搞错,一一对应,像下面所示,不过在正常编译时,并不能这样写

d1.Init(&d1, 2024, 3, 31);

this 指针注意事项:

C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

什么意思呢,就是在成员函数中可以显示出this 指针,其他地方不需要你加this ,霸道的编译器帮你处理了

void Init(int year, int month, int day)

{

this->_year = year;

this->_month = month;

this->_day = day;

}

相关推荐
悟空爬虫-彪哥2 小时前
2026 Python UI 框架选择指南:从 Streamlit 到 Pyside6 的四层体系
开发语言·python·ui
ulias2122 小时前
leetcode热题 - 3
c++·算法·leetcode·职场和发展
旷世奇才李先生2 小时前
Python\+ERNIE实战:字节跳动式AI内容审核完整实现(附源码)
开发语言·人工智能·python
大彼方..2 小时前
深入学习cpp初阶模板
开发语言·c++·学习
实心儿儿2 小时前
Linux —— 进程概念 - 程序地址空间
linux·运维·算法
菜鸟丁小真3 小时前
LeetCode hot100-287.寻找重复数和994.腐烂的橘子
数据结构·算法·leetcode·知识点总结
老四啊laosi3 小时前
[C++进阶] 25. C++11新特性(一)
c++·c++11·右值
咸鱼翻身小阿橙3 小时前
QT-P3
开发语言·qt·计算机视觉
心易行者3 小时前
代码写好了,然后呢?——手把手教你把Python脚本变成能赚钱的Web应用
开发语言·前端·python