C++类和对象(上)
- IT业界
- 2025-09-16 09:06:01

Hello!!!大家早上中午晚上好!!!今天我们来复习C++中最重要的内容之一:类和对象!!
一、类的定义 1.1语法类定义关键字class + 类名 +{//括号体类定义成员变量或成员函数}+;(分号必须要写上)
例:
//类的定义 class Person { //成员变量或成员函数 };其中{}里的内容是称为类体,类体内定义的变量称为成员变量或类的属性,类体内定义的函数称为成员函数或类的方法;
1.2类的定义的两种方式①声明和定义全部放在类体内
//.h文件 public: void PrintMessage() { cout << _id << "-" << _name << "-" << _class << endl; } private: int _id;//学号 char* _name;//姓名 char* _class;//班级 };②声明和定义分离
//在.h文件声明 public: void PrintMessage(); private: int _id;//学号 char* _name;//姓名 char* _class;//班级 }; //在.cpp文件定义 #include"student.h" void Student::Sutdent() { cout<<_id<<"-"<<_name<<"-"<<_class<<endl; }注意:在类外定义需再函数名前加上访问的作用域,建议用第二种方式定义
二、类的实例化 2.1几个概念要弄清楚①类是对对象的描述,是一个像模型一样的东西,限定了类有哪些成员,定义了一个类并没有分配实际的内存空间来存储它;
②类的实例化是对对象的定义,是对对象的实例化;
③实例化出的对象实际上是开辟了真实的物理空间;
好比类是一样图纸,对象是按照图纸建立出来的房子;
三、类对象大小的计算 3.1类对象的大小只计算类的成员变量,不计算成员函数,成员函数不存储在对象中,存储在公共代码段; 例: class A { int a; void print() { cout << a << endl; } }; class B { void print() { } }; class C { }; int main() { cout << sizeof(A) << endl; cout << sizeof(B) << endl; cout << sizeof(C) << endl; return 0; }空类的大小为1,当类里面只有函数没有成员变量的时候也为1字节,这1字节仅仅用来占位作用,不存储数据;
运行结果:
四、class和struct的区别 4.1在C语言中struct是创建自定义类型的关键字,在C++中struct创建的自定义类型升级成为类,也就是用sturcut定义的是一个类,用class定义的也是类,他们之间唯一的区别就是当在类体内定义成员的时候,struct默认为公有的,class默认为私有的!例:
struct Stack { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; }; class Stack1 { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; }; int main() { //cout << sizeof(A) << endl; //cout << sizeof(B) << endl; //cout << sizeof(C) << endl; Stack s1; Stack1 s2; int a = s1.arr[2]; printf("%d\n", a); int b = s2.arr[2];//报错 return 0; }用class定义的类默认为私有的成员变量,在类外不可访问,所以对象s2是访问不了arr的
五、this指针 5.1问题:以下代码A类里面的Add函数没有关于不同对象的区分,那么a1和a2 调用Add函数的时候是怎么进行区分a1对象还是a2对象的? class A { public: A(int a, int b) { _a = a; _b = b; } int Add() { return _a + _b; } private: int _a ; int _b ; }; int main() { A a1(2, 2); A a2(3, 3); cout << a1.Add() << endl; cout << a2.Add() << endl; return 0; }C++中为了解决这一问题引用了this指针,即每个“非静态成员函数中隐藏了一个this指针”,由该指针指向当前对象(即函数运行时调用该函数的对象),对类的成员进行一切访问都由这个this指针来访问,只不过对于用户来说是透明的,不需要传递进来,编译器自动完成!!
图解:
5.2this指针的特性①this指针类型是类类型*const ,即不能给this赋值,不能改变this的指向;
②只能在成员函数内部使用;
③this指针的本质是成员函数的形参,当对象调用成员函数时把对象的地址作为实参传递给this指针,所以对象中不存储this指针;
④this指针是成员函数中第一个隐藏的指针形参,一般情况有编译器通过ecx寄存器传递,不需要用户传递
5.3this指针存放在哪里?this指针可以为空吗?答1:存放在寄存器,编译器在生成程序是加入了获取对象首地址的代码,并把获取的代码存放在寄存器中。成员函数的其他参数正常都存放在栈中,而this指针参数则是存放在寄存器中。类的静态成员函数因为没有this指针,所以无法访问类的非静态成员变量;
答2;this可以为空,如果不需要把this指针指向当前对象才可以操作就可以为空,否则不能为空,不然就是对空指针的访问;
代码示例:
class A { public: void Print() { cout << "打印一个串!!" << endl; } private: int _a; }; class B { public: void Print() { cout << "打印一个类成员变量:" << _a << endl; } private : int _a; }; int main() { A* p = nullptr; p->Print();//不需要this指针指向当前对象,只是打印个串 B* pb = nullptr; pb->Print();//报错//要访问B里面的成员变量,就必须先要实例化出对象才能访问,且this需要明确指向当前对象!!! return 0; }运行异常:
好了,小伙伴们今天就复习到这里!!如果您觉得有所收获,请记得点赞收藏+关注哦!!!如果您有更好的建议,请评论区留言!!咱们下期见!!!
C++类和对象(上)由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C++类和对象(上)”