0
点赞
收藏
分享

微信扫一扫

理解C++类&对象

TiaNa_na 2022-01-21 阅读 96

文章目录


前言

C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。
类是 C++ 的核心特性,通常被称为用户定义的类型。
类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。

一、C++类的定义

定义一个类,本质上类是定义同一类所有对象的变量和方法的蓝图或原型。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。
例如:我们可以定义一个厨房类,这个类也定义和提供了实例方法(炒菜,炖肉,洗盘子)的实现。因此,当你创建厨房类以后,必须在使用之前对它进行实例化(通过类实例化对象)。当创建类的实例时,就建立了这种类型的一个对象,然后系统为类定义的实例变量分配内存。然后可以调用对象的实例方法实现一些功能。相同类的实例共享相同的实例方法。
以下我们定义一个Person类

class Person
{
private:
      char _name[10];
      char _sex;//男性m表示,女性f表示
      int _age;
public:
      void sleep()
      {
           cout<<_name << "会睡觉" << endl;
      }
      void eat()
      {
           cout<<_name << "会吃饭" << endl;
      }
};

class为定义类的关键字,Person为类的名字,{ }中为类的主体,注意类定义结束时后面分号
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量(_name、_sex、_age); 类中的函数称为类的方法或者成员函数(sleep()、eat())。
类的两种定义方式:
1. 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理(Person类就是声明和定义放在类中)。
2. 声明放在.h文件中,类的定义放在.cpp文件中

//声明放在类的头文件person.h中
class Person
{
private:
      char _name[10];
      char _sex;//男性m表示,女性f表示
      int _age;
public:
      //显示个人信息
      void showInfo();
}

//定义放在类的实现文件person.cpp
#include"person.cpp"
void person::showInfo()
{
     cout << "_name" << "_age" <<endl;
}

二、类的访问限定符及封装

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
【访问限定符说明】
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. class的默认访问权限为private,struct为public(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

三、类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。

class Person
{
public:
      void PrintPersonInfo();
private:
      char _name[20];
      char _gender[3];
      int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
     cout<<_name<<" "_gender<<" "<<_age<<endl;
}

四、类的实例化

用类类型创建对象的过程,称为类的实例化
1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
我们可以通过以下几种方式创建对象

class Person
{
private:
      char _name[10];
      char _sex;//男性m表示,女性f表示
      int _age;
}

//1.匿名对象
Person A()//栈中分配内存

//2.创建有名字的对象
Person a = A();//栈中分配内存

//3.利用关键字new
A* b = new A();//在堆中分配内存

栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放
采用第三种方式时,必须注意以下几点问题:
1.new创建类对象需要指针接收,一处初始化,多处使用
2.new创建类对象使用完需delete销毁(必须配对使用,不要用free释放)
3.new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
4.new对象指针用途广泛,比如作为函数返回值、函数参数等
5.频繁调用场合并不适合new,就像new申请和释放内存一样
6.栈的大小远小于堆的大
7.栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率 比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多

举报

相关推荐

C++类和对象

0 条评论