5. 类的实例化
用类类型创建对象的过程,称为类的实例化
在实例化类对象之前,这个类并不占用内存
比如:
class Person { public: void printper() { cout<<name; } private: char* name; }; int main() { Person.name = "NEO";//编译报错,还没有实例化对象 Person p1; return 0; }
若没有实例化对象p1
这个class类是不会开辟空间的!
class类就像一个设计图纸一样
在按照这个图纸建设房子前
这块区域是没有空间占用的
实例化对象就像按照图纸修房子一样
会占用空间
6. 类对象模型
怎么计算一个class类的大小?
例如:下面这两个类:
class A { void PrintA() { cout << a << endl; } int a; char b; }; class B { int a; char b; }; int main() { printf("类A的大小: %d\n", sizeof(A)); printf("类B的大小: %d\n", sizeof(B)); return 0; }
结论:
- 类中的成员函数不算在类的大小中
- 类的大小遵守结构体内存对齐规则
- 空类(没有成员变量)的大小是1字节
注:如果你不知道结构体内存对齐规则
请点击:结构体内存对齐规则
6.1 类对象的存储模式
为啥类中的成员函数不占空间?
那函数存储在什么位置?
带着这样的疑惑来看看类的存储模式:
- 类成员变量存储在实例化对象中
- 类成员函数存储在公共的代码段
可以用下面这张图来理解:
对类成员变量的解释:
由于每一个对象中的变量的值可能不同
所以成员变量存储在不同的对象中
对类成员函数的解释:
但是每个对象调用的函数是相同的
为了节省空间,将成员函数从对象中剥离
到公共代码段,不管实例化多少个对象
只要调用成员函数就会去代码段找!
7. this指针
先看以下的日期类:
class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } private: int _year; // 年 int _month; // 月 int _day; // 日 }; int main() { Date d1; d1.Init(2023,7,22);//初始化对象 return 0; }
看似Init只有三个参数
看似调用Init时只传了三个参数
但其实还有一个隐藏的指针this!
可以用下图理解this的位置:
并且在每一个成员变量之前
都有this指针解引用访问它:
7.1 this指针的特性
基本特性:
- this指针的类型:const 类类型 *
即成员函数中,不能给this指针赋值 - 只能在“成员函数”的内部使用
- this指针不能我们显示去写
也不能我们显示去传对象地址 - this指针存储在栈区,不存储在对象中
对特性的理解:
不能这样写代码:
class A { void Init(A* this,int a) { _a=a; } int _a; }; int main() { A a1; a1(&a,10); }
假如这样写代码,那么函数参数就有三个
系统还是会自动传this指针,会报错
7.2 this指针的用处
假设我们实例化了两个对象
分别是d1和d2
class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } private: int _year; // 年 int _month; // 月 int _day; // 日 }; int main() { Date d1; Date d2; d1.Init(2023,7,22);//初始化对象 d2.Init(2023,7,23); return 0; }
已知成员函数是放在公共代码段的
假如没有this指针存在
函数体又没有区别不同对象的手段
那么就会出现一个问题:
对象d1调用函数Init时,函数不知道是
哪一个对象调用了它,就无法区分对象
使用this指针将对象的地址传入函数中
函数体就可以区分不同对象了!
8. 总结以及拓展
本章是类和对象的入门篇
只介绍了类的解基本概念和特性
其中比较重要的是this指针
它还会陪伴我们很久!
基础不牢,地动山摇
类学不会,学C++就受罪
拓展: C++命名方式
C++又很多习惯的命名方式
这里介绍一个:驼峰法命名
- 单词和单纯之间首字母大写
- 函数名,类名首字母大写
- 变量首字母小写,后面单词首字母大写
- 成员变量的首字母前加下划线_
举例说明:
class Date { public: void InitDate(int year, int month, int day)//initialize date { //初始化日期,简写后,I和D要大写 _year = year; _month = month; _day = day; } void PrintInfo()//printf information,简写后P和I要大写 { cout <<_year<< "-" <<_month << "-"<< _day <<endl; } private: int _year; //成员变量前面加_ int _month; int _day; };
🔎 下期预告:类和对象(中) 🔍