既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
ClassName objectName;
首先,假设我们定义了一个 Person
类:
- 类的声明:
- 我们定义了一个
Person
类,包含了两个数据成员name
和age
,以及一个成员函数introduce()
。 - 在类的声明阶段,并没有为
Person
类分配任何内存空间。
- 我们定义了一个
// 类的声明
#include <iostream>
using namespace std;
class Person
{
public:
std::string name;
int age;
void introduce() ;
};
-
类的定义:
- 我们还需要定义
introduce()
函数的具体实现:
- 我们还需要定义
void Person::introduce()
{
std::cout << "My name is " << name << " and I'm " << age << " years old." << std::endl;
}
* 在类的定义阶段,同样没有为 `Person` 类分配任何内存空间。
-
类的实例化:
- 现在我们可以创建
Person
类的对象了:
- 现在我们可以创建
int main()
{
Person p1;
p1.name = "Asen";
p1.age = 18;
p1.introduce();
return 0;
}
当我们创建 Person
对象 p1
时,系统会为 p1
分配内存空间,用于存储它的数据成员 name
和 age
。此时,我们可以访问和修改 p1
对象的成员变量和成员函数。
通过这个例子,我们可以看到,类的声明和定义只是描述了类的结构,而类的实例化person p1
这一步才是真正创建了类的对象并分配了内存空间。每个实例化的对象都有自己独立的内存空间,可以访问和修改自己的数据成员。
类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。
类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。
谜语:“年纪不大,胡子一把,主人来了,就喊妈妈” 谜底:山羊
当然,一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
int main()
{
Person._age = 100; // 编译失败:error C2059: 语法错误:“.”
return 0;
}
注意:Person
类是没有空间的,只有Person
类实例化出的对象才有具体的年龄。
类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
刚才谈到:类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。那我不太信,那我算算看看:
#include <iostream>
using namespace std;
// 类的声明
class Person
{
public:
std::string name;
int age;
void introduce();
};
//类的函数定义
void Person::introduce()
{
std::cout << "My name is " << name << " and I'm " << age << " years old." << std::endl;
}
int main()
{
cout << sizeof(Person) << endl;
return 0;
}
利用sizeof(person)
我们可以看到,即使你没有直接实例化一个 Person
对象,但是 sizeof(Person)
仍然算出一个32
字节的值,这是为啥?
这是因为:
- 类的内存布局:
当你定义一个类时,编译器会为这个类分配一定的内存空间,用于存储类的数据成员。
即使你没有创建任何对象,编译器也需要知道这个类的内存布局,以便在需要创建对象时正确地分配内存。- 编译时内存分配:
在编译时,编译器会计算出类的总大小,包括所有数据成员的大小。这个总大小就是 sizeof(Person) 的结果。
🌉类对象模型
🌠 如何计算类对象的大小
不同以往的C语言结构体,问题是C++类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
让我们来看一个生动容易简单的例子:
class calculate\_one
{
public:
void Init(char c1, char c2, int i)
{
_c1 = c1;
_c2 = c2;
_i = i;
}
void Print()
{
cout << _c1 << "-" << _c2 << "-" << _i << endl;
}
char _c1;
char _c2;
int _i;
};
int main()
{
cout << sizeof(calculate_one) << endl;
}
这个类的大小是多少个字节呢?
首先我们想想结构体内存对齐规则:
- 结构体的第一个成员对齐到和结构体起始位置偏移量为
0
的地址处。- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员变量大小的较小值。
- VS 中默认的值为 8
linux
中gcc
没有默认对齐数,对齐数就是成员自身的大小
- 结构体总大小为最大对齐数(结构体中的每一个成员都有一个对齐数,所有对齐数中的)的整数>倍。
- 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。
当我们去掉两个函数,计算出字节大小是8,这里不太理解结构体的计算,可以点击这里查找:
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
当不去掉函数,发现,结果依然不改变。这里就涉及到了类各个成员的存储结构关系:
class calculate
{
public:
void Init(char c1, char c2, int i)
{
_c1 = c1;
_c2 = c2;
_i = i;
}
void Print()
{
cout << _c1 << "-" << _c2 << "-" << _i << endl;
}
char _c1;
char _c2;
int _i;
};
int main()
{
char a = 'A';
char b = 'B';
calculate cule1;
cule1._i;
calculate cule2;
cule2._i;
cule1.Init(a, b, 1)
cule2.Init(a, b, 2);
cout << sizeof(calculate) << endl;
}
当我们实例化两个对象时,编译器此时就会分配所需空间给两个对象
calculate cule1;
cule1._i;
calculate cule2;
cule2._i;
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
]
[外链图片转存中…(img-IgvrvCSj-1715622558230)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!