目录

1.面向过程和面向对象

2.  类的定义

2.1 struct 定义类

2.2 class定义类

3.类的访问限定符及封装

4. 类的作用域

5. 类的实例化

6.类对象模型

7. this指针

7.1 this 指针的特性


1.面向过程和面向对象

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用解决问题。

C++是基于面向对象的,关注的是对象,将一件事分成不同的对象,靠对象的交互完成任务。

我们可以简单理解为这些对象,C++ 习惯存放在 类中 ,也就是类域中。

2.  类的定义

2.1 struct 定义类


struct structname
{// 类体   ,包括成员变量和成员函数}; //不要忘记分号

struct 为C++ 定义类的关键字 ,structname 是我们为这个类 起的名字。

由于C++ 是支持C语言的,因此 ,在C++中 ,我们可以使用struct 来定义结构体,并且正常使用。在C语言中 我们定义的结构体,其内容只有成员变量,但是在C++中,我们可以在类中定义成员函数,这是C语言办不到的。

2.2 class定义类


class classname
{// 类体   ,包括成员变量和成员函数}; //不要忘记分号

C++中更推荐使用 class 来定义类,class为定义类的关键字,classname为类名,{} 中为类的主体。同样,class定义的类,包括成员变量(也可以称为类的属性)和成员函数(也可以称类的方法

那么class 和 struct 同样都可以用来定义类 ,那么它们有没有什么不同?

3.类的访问限定符及封装

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅公开接口来和对象进行交互。封装的本质更像是管理

C++实现封装的方式: 用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将接口提供给外部的用户使用。

简单的来说,给我们定义的类 ,上了很多把锁,只有拿到对应的钥匙,才能访问相应的内容,

或者,在我们定义类的时候,提前把我们希望提供给外部的接口上的锁打开。

访问限定符:

1. public (公有)

2.protected (保护)

3. private (私有)

public 修饰的类的成员 可以在类外直接被访问。

protected 和 private 修饰的成员在类外 不可以直接被访问。

访问权限作用域从该访问限定符出现的位置 到下一个访问限定符出现为止。

class 的默认访问权限为 private ,struct 默认访问权限为 public (因为它需要兼容C)

我们需要注意的是 ,访问限定符只有在编译的时候有用,当数据映射到内存时,没有任何访问限定符上的区别。


class classname
{
public:void test1(){cout << "test1" << endl;}
private:int a = 10;int b = 20;
};

例如我们现在定义的类,它的test1函数,可以在类外面被直接调用,但是 a , b 就不可以直接被调用。

4. 类的作用域

类定义了一个新的作用域,类中的成员都在类的作用域中。如果在类体外定义成员,需要用到作用域解析符 ::  (两个英文的冒号),用来指明成员属于哪个类域。

这里顺带说明一下类的两种定义方式:

1.声明和定义全部放在类中,需要注意的是,成员函数在类中定义,编译器可能会把它当做内联函数来处理。不过这取决于具体的情况。

class classname
{
public:void test1()   // 声明{cout << "test1" << endl;   / 定义}
private:int a = 10;int b = 20;
};

2. 声明放在.h文件中 , 类的定义放在.cpp 文件中。

.h

class classname
{
public:void test1()   // 声明private:int a = 10;int b = 20;
};

.cpp

#include"test.h"void classname :: test1()
{//  具体实现
}

这里我们就用到了 作用域解析符 ::

我们定义类时,更推荐第二种。

5. 类的实例化

用类类型创建对的过程就叫类的实例化。

类本身更像一个模型,它限定了类中有哪些成员,定义出一个类,并没有分配实际的内存空间来存储它。

一个类可以实例化出多个对象。它实例化的对象,占用实际的物理空间,存储类成员变量。

6.类对象模型

我们知道类中,即可以有成员变量,有存在成员函数,那么一个对象中到底包含了什么,如何计算类的大小?

直接说结论

类中只保存成员变量,成员函数存放在公共代码段。

为什么成员函数和成员变量不一样?如果每个对象都保存一份代码,相同的代码保存多次,浪费空间。每个成员变量是不同的,所以它们保存在对象中。

那么一个类的大小,就是该中成员变量和,和C语言中的结构体内存大小的计算规则相同,需要考虑内存对齐。下面是具体的结构体内存大小计算的博客链接。

(35条消息) 结构体内存大小计算,位段分析_杨斯文。的博客-CSDN博客

但是C++中,我们需要注意空类的大小,空类比较特殊,即类中没有成员变量。空类的大小不是0,而是一个字节,因为编译器给了空类一个字节来唯一标识这个类。

7. this指针

需要我们用一个例子来说明


class Date
{
public:void display(){cout << _year << "-" << _month << "-" << _day << endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = _month;}
private:int _year;int _month;int _day;};int main()
{Date d1, d2;   // 创建两个类对象d1.SetDate(2019, 9, 10);d2.SetDate(2022, 9, 18);d1.display();d2.display();}

我们创建两个类对象,在我们给对象赋值时,调用了处于公共代码段的成员函数。那么问题来了,直接调用相同的成员函数,那么函数是给d1还是给d2运行,还是说成员函数有方法识别这两个不同的对象。我们来运行一下这个代码。

我们可以看到,成员函数正确的操作了两个不同的类对象。包括打印函数也是。

但是这不符合正常的逻辑。按道理,这个函数并不能区分出两个不同的类对象。

这里就不得不提出 this指针了。

C++编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所以成员变量的操作,都是通过该指针去访问。

只不过这个操作,对用户来说是透明的,不需要用户来实现,编译器自动完成。

7.1 this 指针的特性

1. this 指针的类型 : 类类型 * const    ( const 的作用是 ,保证 this 这个指针不可以改变 )

2. 只能在成员函数内使用。

3.this 指针本质是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中是不存储 this 指针 。

4. this指针是成员函数第一个隐含的指针形参,一般情况有编译器通过ecx 寄存器自动传递,不需要用户传递。

那么上述代码的运行结果就可以解释了

除此以外this 指针还有几个我们需要注意的点。

this 指针的存储位置 , 一般情况是在栈(形参),有些编译器会放在寄存器中。

this 可以为空吗?


class Date
{
public:void display(){cout << _year << "-" << _month << "-" << _day <<"test"<< endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = _month;}void show(){cout << "shou" << endl;}
private:int _year;int _month;int _day;};int main()
{Date* p = nullptr;p->show();
}

此时p为空 ,我们运行程序。

程序正常运行。

int main()
{Date* p = nullptr;p->display();
}

当我们运行打印函数时,会发现

函数没有崩,但是也并没打印出我们相要的。

我们开辟一个空的类的对象时,传给this的是空,也就是实参是空 ,此时this 作为形参接收了一个空,成为空指针。直到这一步,都是没有错误的。

这也是为什么,我们可以正常使用 show 函数,

但是当我们调用的函数会对this 这个空指针进行解引用时 ,属于对空指针进行操作。这是不对的。所以打印函数没有运行。按道理程序是应该报错的。

所以this 是空指针是没有问题的 ,但是我们在使用时,需要注意,避免使用野指针。

本篇博客到此结束,谢谢观看。

C++类和对象介绍(筑基上篇)相关推荐

  1. python类和对象介绍_Python开发基础-Day17面向对象编程介绍、类和对象

    面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...

  2. C++语言类和对象介绍和示例

    C++ 类和对象 C语言中结构体(struct)是一种构造类型,可以包含若干成员变量,可以通过结构体来定义结构体变量. C++中的类(class)可以看成结构体的升级版,类也是一种构造类型,但是进行了 ...

  3. python类和对象介绍_python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  4. 类和对象介绍以及二者的关系

    什么是类和对象:类和对象是面向对象编程的两个概念. 类:类是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用. 其中,特征被称为属性,行为被称为方法. 类就相当于制造飞机的图纸,是一 ...

  5. Scala面向对象基础--类和对象

    一.类和对象介绍 在Scala里,类是用关键字"class"开头的代码定义,它是用于创建对象的蓝图.一个类就是一个类型,不同的类就是不同的类型,一个对象的类型就是创建它用的那个类. ...

  6. 简单介绍实体类或对象序列化时,忽略为空属性的操作

    这篇文章主要介绍了实体类或对象序列化时,忽略为空属性的操作,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 第一种,在配置文件配置 在application.xml直接 ...

  7. java jni 方法描述,五、JNI提供的函数介绍(一):类和对象操作

    如果你要开始JNI编程,你还需要了解JNI提供了哪些函数供你调用. 这些函数都定义在了jni.h文件,包括上一篇文章介绍的数据类型,也都在这个头文件中. 类和对象操作 假设你要在JNI层使用C代码创建 ...

  8. Python面向对象——面向对象介绍、实现面向对象编程、定义类、再调用类产生对象、总结__init__方法、查找顺序

    文章目录 面向对象介绍 实现面向对象编程 一:先定义类 二:再调用类产生对象 总结__init__方法 查找顺序 面向对象介绍 ''' 面向过程:核心是"过程"二字过程的终极奥义就 ...

  9. Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法

    Day09新手小白学python 第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法 目录 Day09新手小白学python 前言 一.面向对象介绍 二 ...

最新文章

  1. [日推荐]『保养汽车』爱车的专职管家
  2. 正则表达式(grep命令,egrep命令,sed命令,awk命令,sort工具,uniq工具)
  3. bootstrapselect使用 Bootstrap's dropdowns require Popper.js
  4. window连接不上ssdb的问题
  5. 零基础入门深度学习 | 第二章:线性单元和梯度下降
  6. 《设计工作室生存手册》—第1章1.3节设计师目标要清晰
  7. Spring Cloud 之 Eureka.
  8. 【Mybatis系列】从源码角度理解Mybatis字段映射-驼峰式命名
  9. php 删除前后空格,php怎么去除前面空格
  10. windows下的DataX的安装和使用教程
  11. typescript 中函数参数为对象如何效验
  12. docker生态-mysql客户端phpAdmin
  13. html5 中input type=‘file’实现文件图片等的上传的文件类型限制
  14. 深度学习-【语义分割】学习笔记4 膨胀卷积(Dilated convolution)
  15. 现货黄金和纸黄金的区别?
  16. spring-rabbit的使用
  17. 鹏业安装算量软件2021渠道大会暨授牌仪式成功举办
  18. VRP——华为数据通信产品的操作系统
  19. PTA -- 旅游规划
  20. Java常量池的一点理解

热门文章

  1. Arduino实验十 利用土壤湿度传感器检测西瓜皮湿度
  2. 自学前端到上岸工作系列之css03
  3. pytorch--切断梯度的方法
  4. 【加解密】在线加密工具推荐
  5. 11-VulnHub-SkyTower 1
  6. CANoe CAPL 接收以太网报文--UDP
  7. HR怎样做好员工培训,避免背锅(一)
  8. 【C++】黑马程序员C++核心编程学习笔记(完结)
  9. 【Java】什么是面向对象
  10. The ETH-MAV Team in the MBZ International Robotics Challenge