news 2026/4/27 10:56:30

C++类与对象的基础知识点详细分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++类与对象的基础知识点详细分析

一、什么是类和对象呢

1、类的引入

C 语言结构体中只能定义变量,在 C++ 中,结构体内不仅可以定义变量,也可以定义函数。 比如: 之前在数据结构初阶中,用C 语言方式实现的栈,结构体中只能定义变量 ;现在以 C++ 方式实现, 会发现 struct 中也可以定义函数。

2、类的定义

1

2

3

4

classclassName

{

// 类体:由成员函数和成员变量组成

};// 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

类体中内容称为 类的成员: 类中的 变量 称为 类的属性 或 成员变量 ; 类中的 函数 称为 类的方法 或者 成员函数 。

类的两种定义方式:

声明和定义全部放在类体中,需注意:成员函数如果 在类中定义 ,编译器可能会将其当成 内 联函数 处理。

类声明放在 .h 文件中,成员函数定义放在 .cpp 文件中,注意: 成员函数名前需要加类名 ::。

3、类的访问限定符

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

访问限定符说明:

  • public修饰的成员在类外可以直接被访问;
  • protected和private修饰的成员在类外不能直接被访问;
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止;
  • 如果后面没有访问限定符,作用域就到 } 即类结束;
  • class的默认访问权限为private,struct为public(因为struct要兼容C) 。

4、类对象的储存方式

我们假想:每个对象中成员变量是不同的,但是调用同一份成员函数,如果按照每实例一个对象都给成员变量和成员函数创造一次空间存储,当一 个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么如何解决呢?

针对上面的问题,类的存储就变成了:只保存成员变量,成员函数存放在公共的代码段 。那么一个类的大小其实就是:实际就是该类中”成员变量”之和,当然要注意内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

5、this指针的特性

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

classDate

{

public:

voidInit(intyear,intmonth,intday)

{

_year = year;

_month = month;

_day = day;

}

voidPrint()

{

cout <<_year<<"-"<<_month <<"-"<< _day <<endl;

}

private:

int_year;// 年

int_month;// 月

int_day;// 日

};

intmain()

{

Date d1, d2;

d1.Init(2022,1,11);

d2.Init(2022, 1, 12);

d1.Print();

d2.Print();

return0;

}

我们知道了成员函数是放在了公共代码段。函数体中没有关于不同对象的区分。那么在上面的代码中d1和d2同时掉用了Print()函数,怎么是分别打印出d1对象中的成员变量和d2对象中的成员变量呢?(当然Init函数与Print函数的区分类似)。

C++ 中通过引入 this 指针解决该问题,即: C++ 编译器给每个 “ 非静态的成员函数 “ 增加了一个隐藏 的指针参数,让该指针指向当前对象 ( 函数运行时调用该函数的对象 ) ,在函数体中所有 “ 成员变量 ” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编 译器自动完成 。如下图:

this指针的特性:

  • this 指针的类型:类类型 * const ,即成员函数中,不能给 this 指针赋值;
  • this 指针是 “ 成员函数 ” 第一个隐含的指针形参,一般情况由编译器通过 ecx 寄存器自动传递,不需要用户传递;
  • this 指针本质上是 “ 成员函数 ” 的形参 ,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以 对象中不存储 this 指针;
  • 只能在 “ 成员函数 ” 的內部使用。

二、类的六个默认成员函数详解

什么是默认成员函数呢?

默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6 个默认成员函数:

  • 构造函数;
  • 析构函数;
  • 拷贝构造;
  • 赋值重载;
  • 普通对象取地址;
  • const对象取地址。

我们来看一下各个默认的成员函数的概念及实现。本篇我们先掌握构造函数和析构函数,这两个时相对较为麻烦和重要的,下篇我们会接着是西安剩余的默认成员函数以及类和对象剩余的重要的部分。

1、构造函数

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。其特征如下:

  • 函数名与类名相同;
  • 无返回值;
  • 对象实例化时自动调用对应的构造函数;
  • 构造函数可以重载。
  • 如果如果类中没有显式定义构造函数,则C++编译器会自动生成一个默认的无参构造函数,一但用户显式定义编译器将不再生成。

我们结合着以下代码一起理解以下。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

classDate

{

public:

// 1.无参构造函数

Date()

{}

// 2.带参构造函数

Date(intyear,intmonth,intday)

{

_year = year;

_month = month;

_day = day;

}

private:

int_year;

int_month;

int_day;

};

voidTestDate()

{

Date d1;// 调用无参构造函数

Date d2(2015, 1, 1);// 调用带参的构造函数

// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明

// 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象

// warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)

Date d3();

}

关于编译器生成的默认成员函数,很多人都会有疑惑:不实现构造函数的情况下,编译器会 生成默认的构造函数。但是看起来默认构造函数又没什么用? 象调用了编译器生成的默 认构造函数,但是 对象中的成员函数 依旧是随机值。也就说在这里 编译器生成的 默认构造函数并没有什么用??

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 10:52:31

高通平台Android HAL层读写NV分区实战:从源码路径到完整Demo(Android O/R)

高通平台Android HAL层NV分区操作深度解析与实战指南 在Android设备生产与维护过程中&#xff0c;设备唯一标识&#xff08;如IMEI、序列号等&#xff09;的可靠管理是确保设备可追溯性和功能完整性的关键环节。这些关键数据通常存储在高通平台的NV分区中&#xff0c;而如何安全…

作者头像 李华
网站建设 2026/4/27 10:51:27

突破虚拟化壁垒:解锁VMware的macOS支持全攻略

突破虚拟化壁垒&#xff1a;解锁VMware的macOS支持全攻略 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 当您在VMware中尝试创建虚拟机时&#xff0c;是否曾困惑于操作系统列表中缺少苹果macOS选项&am…

作者头像 李华
网站建设 2026/4/27 10:51:27

【简单】字符串的调整与替换-Java:原问题

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请轻击人工智能教程大家好&#xff01;欢迎来到我的网站&#xff01; 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑&#x…

作者头像 李华
网站建设 2026/4/27 10:49:56

【中等】统计完全二叉树的节点数-Java

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请轻击人工智能教程大家好&#xff01;欢迎来到我的网站&#xff01; 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑&#x…

作者头像 李华
网站建设 2026/4/27 10:48:34

VinXiangQi终极指南:7步快速掌握免费象棋AI连线工具

VinXiangQi终极指南&#xff1a;7步快速掌握免费象棋AI连线工具 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi VinXiangQi是一款基于YOLOv5深度学习技术的…

作者头像 李华
网站建设 2026/4/27 10:46:24

Awesome Codex Skills中的模板技能:快速创建新技能的起点

Awesome Codex Skills中的模板技能&#xff1a;快速创建新技能的起点 【免费下载链接】awesome-codex-skills A curated list of practical Codex skills for automating workflows across the Codex CLI and API. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome…

作者头像 李华