【C++】对象与类
文章目录
- 【C++】对象与类
- 1、定义
- 1.1 对象的定义
- 1.2 类的定义
- 2、对象与类的创建
- 2.1 类的创建
- 2.2 对象的创建
- 3、封装
- 3.1 访问限定符
- 3.2 对封装的解释
- 4、类的实例化
- 5、类、对象大小
- 6、this指针
- 6.1 this指针概念
- 6.2 this指针特点
1、定义
1.1 对象的定义
现实世界对对象的定义是:行动或思考时作为目标的事物
在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。
在C++中,每个对象都是由数据和操作代码(通常用函数实现)组成的。
1.2 类的定义
类是一种自定义类型
是用来对对象进行描述的**(对象有什么属性,有什么功能)**
2、对象与类的创建
2.1 类的创建
C++中定义类型有两个关键词:
struct
class
类型定义格式:
class 类名//或是 struct 类名
{
//类体 :成员变量(属性) 成员函数(功能)
};
C++中的 struct(类)和结构体不同的是:除了可以定义成员变量(变量)还可以成员函数(函数),成员函数可以访问成员变量,但是如果成员函数中的形参和成员变量相同 :
struct Stu
{
void init(const char* name, int age, int id)
{
...
}
char _name[10];
int _age;
int _id;//加上_是为了区分形参和成员变量
};
类定义了一个新的作用域,类的所有成员都在类的作用域中。
在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域
test.cpp:
#include<tools.h>//另有编写tools.h,内有类型newmem,内有成员函数testmember(),现向其中添加成员
void newmem :: testmember()
{
...//添加的成员列表
}
2.2 对象的创建
类名 * 对象指针变量;
对象指针变量 = new 类名;
name * p;
p = new name;
//删除对象
delete p;
new运算分配得到的是对象的起始地址,程序通过这个起始地址间接访问对象,因此需要先定义一个指向类的对象的指针变量
执行new运算时,如果内存空间不足,则会返回一个0值指针,因此,只要检测返回值是否为0就可以判断动态分配对象是否成功,只有指针有效时才
能使用对象指针
- 释放p所指向的对象之后,不能再使用该对象
- new建立的动态对象不会被自动撤销,即使程序运行结束也是如此,必须认为使用delete撤销
3、封装
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
封装的特性:
- 在类中,类的数据和方法都放到一起
- 访问限定符
3.1 访问限定符
访问限定符限制类外操作,对于类中则不限定,类里可以全局访问
- public修饰的成员在类外可以 直接被访问
- protected 和 private 修饰的成员在类外不能直接被访问(它们类似,但本质不一样)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到 } 即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C)
- 默认访问限定符,即不写时,类中的默认访问权限;一般在定义类时,建议明确定义访问限定符 ,不要用 class/struct的默认限定
注意:
struct
定义的类:成员默认的访问权限是publicclass
定义的类:成员默认的访问权限是private
3.2 对封装的解释
封装是一种更好的严格管理,不封装是一种自由管理
封装就是让数据和方法揉搓在一起,进行 严格 的管理。对于 C 是不封装的,是一种较 松散 的管理。C++ 是将数据和方法封装到类里面,C 是数据和方
法分离的(数据访问控制是自由的,不受限制的)
通过类将数据进行封装,我们不能直接访问类的属性,只能通过调用类中的方法来实现对对象属性功能的访问
封装的好处:
可以提高代码的安全性,当程序很大的时候,一个程序员可能只负责某一个模块,程序员将自己所写的程序进行封装,然后只对主函数提供几个接口(主
函数可以调用的方法),那么在调试的过程中,编程人员可以很快的找到代码错误的地方,提高了代码的可维护性)
4、类的实例化
用类类型创建对象的过程,称为类的实例化。
类是对 对象 进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
- 对于类创建出来的对象,可以访问类中成员;但是对于类本身,是不能访问成员与方法的
- 对于类仅仅起 描述作用 而已,真正使用还是要类对象 。而我们可以认为类这些代码存在代码段,是公共的
- 类实例化出来的对象,占用实际的物理空间,储存类变量
5、类、对象大小
对象中包含了那些成员以及我们如何去求一个对象的大小?
效果上:对象中既有成员函数,又有成员变量然而成员函数,没有必要每个对象中都存储一份,如果每个对象都存储,会让对象的存储变得很大
实际上:对象只存储成员变量
求对象的大小时,注意内存对齐
如果是空类或者是没有成员变量只有成员函数的类创建的对象,编译器为了区分各个实体对象,分别会给予一定的空间。主流编译器对空类和对有成员变量的类创建的对象分配了一个字节
6、this指针
6.1 this指针概念
c++通过引入this指针,编译器给每一个“非静态的成员函数”增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数的对象)
在每一个成员函数体内所有成员变量的操作,都是通过该指针去访问
只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成
6.2 this指针特点
- this指针的类型:类类型*const,即成员函数中,不能给this指针赋值。
- 只能在成员函数内部使用
- this指针本质上其实是一个成员函数的第一个形参,是对象调用函数时,将对象的地址作为实参传给this指针,,所以对象中不存储this指针。
- this指针是一个隐含指针形参,一般情况下由编译器自动传递。
- this指针存放在栈上(因为this指针是一个隐含指针形参)
- this 指针可以为空,this指针的类型为类类型*const,即指针变量为常量。我们可以在类外部定义一个类类型指针,将该指针初值为空 ,然后将其作为实参传入this指针形参中。
- 当this指针为空时,如果成员函数没有调用成员变量,那么代码不会崩溃,否则代码就会崩溃。