百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

C/C++编程笔记:C++入门知识,C++类和对象详解

liebian365 2025-01-21 19:15 15 浏览 0 评论

本篇要学习的内容和知识结构概览


类及其实例化

类的定义

将一组对象的共同特征抽象出来, 从而形成类的概念.

类包括数据成员和成员函数, 不能在类的声明中对数据成员进行初始化

声明类

形式为:


无论是数据成员还是成员函数, 都是这个类的成员, 都具有一个访问权限, 如果没有关键字进行修饰, 则默认为private权限

声明一个类, 像这样:


定义成员函数

形式为:

// :: 为作用域运算符, 表示这个函数属于哪个类

返回类型 类名::成员函数名(参数列表) {

函数体 // 内部实现

}

我们在上面的声明类的代码中, 声明了成员函数, 我们可以在类外面定义成员函数, 也就是给出函数体

像这样:


如果在声明类的同时, 在类体内给出成员函数的定义, 则默认为内联函数

我们一般都是在类体内存给出成员函数的定义

像这样, 完成一个类的声明和定义


不能在类体内和类体外对数据数据成员赋值

像这样是不行的:


只有产生了具体对象, 这些数据值才有意义

初始化: 在产生对象时就使对象的数据成员具有指定值, 则称为对象的初始化

赋值: 有了对象之后, 对象调用自己的成员函数实现赋值操作

使用类的对象

类的成员函数可以直接使用自己类的私有成员

类外面的函数不能直接访问类的私有成员, 而只能通过类的对象使用公有成员函数

定义类对象指针的语法: 类名 * 对象指针名 = 对象地址;

通过对象指针可以访问对象的成员: 对象指针名 -> 对象成员名;

像这样:


构造函数

默认构造函数

一个类如果没有定义任何构造函数, 编译器会自动定义一个不带参数的构造函数, 也就是默认构造函数

比如我们有一个类Point

则默认构造函数就是这样:Point::Point() {};

如果一个类提供了构造函数, 系统不再提供默认构造函数

我们有一个Point类, 像这样:


则我们就不能在main函数中这样使用:


我们想要这样使用, 则必须手动添加无参数构造函数

像这样:


定义构造函数

构造函数的名字应该与类名同名, 并在定义构造函数时不能指定返回类型, void也不可以


我们一般都在类的声明内部进行函数定义

像这样:


注意

不能在程序中显式地调用构造函数, 构造函数是自动调用的

即不能这样: Point a.Point(2, 3);

只能这样: Point a(2, 3);

作用

用来在产生对象的同时, 进行对象的初始化

构造函数和运算符new

new用来建立生存期可控的动态对象, 返回这个对象的指针

new和构造函数一同起作用

过程: 当用new建立动态对象时, 首先分配可以保存这个类对象的内存空间, 然后自动调用构造函数来初始化这块内存, 再返回这个动态对象的地址

使用new建立的动态对象只能使用delete删除, 以释放所占空间

像这样:


构造函数的默认参数

如果我们定义了有参构造函数, 又想使用无参构造函数, 我们可以将有参构造函数的参数全部使用默认参数

像这样:


复制构造函数

作用: 通过拷贝方式使用一个类的已有对象来建立一个该类的新对象, 一般编译器会建立一个默认的复制构造函数

像这样:类名(const 类名 &); // 为了不改变原有对象, 使用const来进行修饰

复制构造函数也可以自定义, 则编译器不再调用默认的复制构造函数

像这样:


使用复制构造函数的三种情况

当用一个类的对象去初始化另一个对象时, 需要调用复制构造函数

像这样:


如果函数的形参是类的对象, 调用函数时, 进行形参与实参的结合时, 需要调用复制构造函数

像这样:


如果函数的返回值是对象, 当函数调用完成返回时, 需要调用复制构造函数, 产生临时对象, 并在执行完返回值语句后, 析构临时对象


函数参数使用对象的引用不产生副本, 所以当对象作为函数参数时, 推荐使用对象引用这种方式

析构函数

作用:在对象消失时, 使用析构函数释放由构造函数分配的内存

定义析构函数

为了与构造函数区分, 在析构函数前加”~”号,

并且在定义析构函数时, 不能指定返回类型, 即使是void类型也不可以;

也不能指定参数, 但可以显式的说明参数为void

格式: ~类名(); // 或者 ~类名(void);

代码像这样:

~Point(); // 或者 ~Point(void);

析构函数在对象的生存期结束时自动调用, 然后对象占用的内存被回收

全局对象和静态对象的析构函数在程序运行结束之前调用

类对象的数组每个元素调用一次析构函数

像这样: 可以运行该代码, 查看程序执行过程



析构函数和运算符delete

当使用运算符delete删除一个动态对象时, 首先为这个对象调用析构函数, 然后再释放这个动态对象占用的内存

像这样:


默认析构函数

如果没有定义析构函数, 编译器自动为类产生一个函数体为空的默认析构函数

像这样:~ Point(){};


成员函数重载及默认参数

成员函数可重载或使用默认参数, 为了提高可读性


this指针

this指针的概念和作用

当一个成员函数被调用时, 系统自动向该函数传递一个隐含的参数, 指向调用该函数的对象指针, 名为this, 从而使用成员函数知道该对哪个对象进行操作.

作用: 它将对象和该对象调用的成员函数连接在一起, 从外部看来, 每个对象都拥有自己的成员函数, 但处理这些数据成员的代码可以被所有的对象共享

this指针的实际形式

我们一般情况下都会省略this



一个类的对象作为另一个类的成员

因为类本身就是一种新的数据类型, 所以一个类的对象可以作为另一个类的成员

像这样:



类和对象的性质

对象的性质

同一类的对象之间可以相互赋值

Point a(2, 3); Point b = a;复制代码

可以使用对象数组

Point arr[3];复制代码

可以使用指向对象的指针, 使用取地址运算符&将一个对象的地址赋值给该指针

Point p = &a;p -> display();复制代码

对象作为函数参数时, 可以使用对象, 对象引用和对象指针三种方式, 推荐使用对象的引用作为函数参数, 可以使用const修饰符保证原来的对象不被修改


一个对象可以作为另一个类的成员


类的性质

使用类的权限

类本身的成员函数可以使用类的所有成员(私有和公有和受保护的成员)

类的对象只能访问公有成员函数

其它函数不能使用类的私有成员, 也不能使用公有成员函数

虽然一个类可以包含另一个类的对象, 但这个类也只能通过被包含的类对象使用成员函数, 再访问数据成员

不完全类的声明

class People; // 不完全的类声明

People * p; // 定义一个全局变量类指针

只有使用类产生对象时, 才进行内存分配

不完全类不能进行实例化, 否则编译出错, 我们使用得不是很多

空类

class Empty {};

可以不包括任何声明, 也可以没有任何行为, 但可以产生空类对象

像这样:


作用: 在开发大型项目时, 需要在一些类还没有完全定义或实现时进行先期测试, 保证代码能正确地被编译, 当然我们有时也会给它一个无参构造函数, 来消除警告

类的作用域

声明类时使用的一对话括号{}形成类的作用域, 也包括类体外成员函数的作用域.

在类作用域中声明的标识符只在类中可见.

像这样:


总结

每个语言的类和对象其实大同小异, 可能一些名字不一样, 可能一些格式不一样, 但是思想是一样的, 例如一个对象的产生, 都得申请内存, 然后再对这块内存进行初始化, 有自己的属性, 还有自己的行为. 我们在学习的时候不要纠结于语言的本身, 要学会总结和自己已经学过的其它语言的异同点, 从而总结出规律, 提炼出本质, 这才是最主要的. 今天看到一段话送给大家, 大概是这么说的: 不是我们变老了就当不了程序员了, 而是因为我们不想学习了, 所以才显得我们变老了, 所以也就当不了程序员了!

自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

C语言C++编程学习交流圈子,关注+私信【C/C++编程】微信公众号:C语言编程学习基地

有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!



相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: