第005课 C++ 类与对象(三)

005 面向对象和面向过程语言 面向对象和面向过程语言 一 ·定义 面向过程: 当需要实现一个功能的时候,每一个步骤我们都需要自己去做,处理实现功能的每一个细节。 面向对象: 当需要实现一个功能的时候,我们不需要自己去做,可以直接找一个已经具有该功能的东西,来帮我解决问题。 二·区别 面向过程强调的是步骤。 面向对象强调的是对象,这里的对象就是饭店。 三·特点 面向对象是一种更符合我们思考习惯的一种思想,他可以将问题简单化,并将我们从执行者变成了指挥者。在面向对象的语言中,有三大基本特性: 1.面向对象 ①封装性 封装就是把普通的对象进行 阅读详情

一、静态成员函数:

      通常,当说明一个对象时,把该类中的有关成员数据拷贝到该对象中,即同一个类的不同对象,其成员数据之间是互相独立的。

      当我们将类的某一个数据成员的存储类型指定为静态类型时,则由该类所产生的所有对象,其静态成员均共享一个存储空间,这个空间是在编译的时候分配的。换而言之,在说明对象时,并不为静态类型的成员分配空间。     

    在类定义中,用关键字static修饰的数据成员称为静态数据成员。

 【静态数据成员】

有关静态数据成员的使用,说明以下几点:   

 1)类的静态数据成员是静态分配存储空间的,而其它成员是动态分配存储空间的(全局变量除外)。当类中没有定义静态数据成员时,在程序执行期间遇到说明类的对象时,才为对象的所有成员依次分配存储空间,这种存储空间的分配是动态的;而当类中定义了静态数据成员时,在编译时,就要为类的静态数据成员分配存储空间。     

2)必须在文件作用域中,对静态数据成员作一次且只能作一次定义性说明。因为静态数据成员在定义性说明时已分配了存储空间,所以通过静态数据成员名前加上类名和作用域运算符,可直接引用静态数据成员。在C++中,静态变量缺省的初值为0,所以静态数据成员总有唯一的初值。当然,在对静态数据成员作定义性的说明时,也可以指定一个初值。 

例:

#include <iostream>
using namespace std;

class TestA
{
private:
	int i, j;
	static int x, y; //定义静态数据成员
public:
	TestA(int a, int b, int c, int d) //构造函数
	{
		cout  << " x=" << x << ", y=" << y << endl;
		i = a;
		j = b;
		x = c;
		y = d;
	}
	void dis_ijxy()
	{
		cout << " i=" << i << ", j=" << j << ", x=" << x << ", y=" << y << endl;
	}
};

int TestA::x = 15; //静态成员定义性说明
int TestA::y = 23; 

int main()
{
	TestA test1(20,30,40,60);
	test1.dis_ijxy();

	TestA test2(200, 300, 400, 600);
	test2.dis_ijxy();

	return 0;
}  

输出结果: 

 3)静态数据成员具有全局变量和局部变量的一些特性。静态数据成员与全局变量一样都是静态分配存储空间的,但全局变量在程序中的任何位置都可以访问它,而静态数据成员受到访问权限的约束。必须是public权限时,才可能在类外进行访问。   

 4)为了保持静态数据成员取值的一致性,通常在构造函数中不给静态数据成员置初值,而是在对静态数据成员的定义性说明时指定初值。

例:

#include <iostream>
using namespace std;

class Test
{
private:
	int i;
	static int count; //定义静态数据成员
public:
	Test(int x = 5) //构造函数
	{
		i = x;
		count++;
	}
	void dis()
	{
		cout << " i=" << i <<", count=" <<count << endl;
	}
};

int Test::count = 0;//静态成员定义性说明

int main()
{
	Test test1[100];
	Test test2[10];
	test1->dis(); // 输出 i=5,  count=110
    test2->dis(); // 输出 i=5,  count=110
	return 0;
}

输出结果: 

【静态成员函数】   

       可以将类的成员函数定义为静态的成员函数。即使用关键字static来修饰成员函数 。 

class Test 
{   
   float x, y;
public :
     Test( ){  }
     static void sum(void)  //静态成员函数
     { ..... }
};

对静态成员函数的用法说明以下几点:   

 1)与静态数据成员一样,在类外的程序代码中,通过类名加上作用域操作符,可直接调用静态成员函数。   

2)静态成员函数只能直接使用本类的静态数据成员或静态成员函数,但不能直接使用非静态的数据成员 (可以引用使用)。这是因为静态成员函数可被其它程序代码直接调用,所以,它不包含对象地址的this指针。 

3)静态成员函数的实现部分在类定义之外定义时,其前面不能加修饰词static。这是由于关键字static不是数据类型的组成部分,因此,在类外定义静态成员函数的实现部分时,不能使用这个关键字4)不能把静态成员函数定义为虚函数。静态成员函数也是在编译时分配存储空间,所以在程序的执行过程中不能提供多态性。     

5)可将静态成员函数定义为内联的(inline),其定义方法与非静态成员函数完全相同。

例: 

#include <iostream>
using namespace std;
//静态成员函数应用
class Test
{
private:
	int x;
	static int y; //定义静态数据成员
public:
	Test(int a) //构造函数
	{
		x = a;
		y = y + x;
	}
	static void dis(Test test1) //静态成员函数
	{
		cout << "x=" << test1.x << ", y=" << y << endl;
	}
};

int Test::y = 10;//静态成员定义性说明

int main()
{
	Test test2(5), test3(10), test4(40);
	Test::dis(test2); //输出 x=5,  y=65    //静态成员函数应用
	Test::dis(test3); //输出 x=10, y=65
	Test::dis(test4); //输出 x=40, y=65

	return 0;
} 

输出结果: 

二、指向类的指针

       一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。

例:

#include <iostream>
using namespace std;

class Test
{
private:
	int x;
	static int y; //定义静态数据成员
public:
	Test(int a) //构造函数
	{
		x = a;
		y = y + x;
	}
inline	static void dis(Test test1); //静态成员函数声明
};

int Test::y = 10;//静态数据成员定义性说明

void Test::dis(Test test1) //静态成员函数 在类外 定义
{
	cout << " x=" << test1.x << ", y=" << y << endl;
}

int main()
{
	Test test2(5), test3(10);
	test2.dis(test2); //输出 x=5,  y=25    //静态成员函数应用
	test3.dis(test3); //输出 x=10, y=25

	Test* pt = &test2;//定义一个类的指针,指向类的对象, (指向类的指针)
	pt->dis(test2);
	return 0;
} 

输出结果:

《面向对象程序设计》教学资源汇总(V2021) 一、 教学网站 blog.youkuaiyun.com/bigleo 二、 课件下载 https://blog.youkuaiyun.com/BigLeo/article/details/90751948?spm=1001.2014.3001.5502 三、 本课程课件有二套 分别在课件下载网站的如下文件夹中 1、课堂上用的课件 > Teaching > KnowledgePoints > CPP 2、与教材配套的课件 > Teaching > OOP 四、 授课计划 https://blog. 阅读详情

相关推荐

CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

CELF(Cost-Effective Lazy Forward selection)算法解析      引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的

hahaxq的博客 2476

C++面向对象编程:从类与对象到static、const关键字深度解析

面向对象编程(OOP)是一种将数据与操作数据的方法捆绑在一起的编程范式,其核心思想是通过封装、继承和多态来构建模块化、可复用的代码。在C++中,类作为对象的蓝图,定义了数据成员和成员函数,而对象则是类的具体实例,拥有独立的状态。通过public和private关键字实现封装,可以保护数据完整性并隐藏实现细节,这是OOP的重要特性之一。static关键字用于定义属于类本身的成员,而非某个特定对象,常用于实现对象计数器或共享数据。const关键字则用于保证数据或函数的不变性,提升代码的健壮性和可读性。这些概念共

weixin_34033624的博客 483

Viobot使用教程总贴

使用教程总贴

weixin_66666206的博客 1408

005 C++ 类与对象

大家好,本文将会为您带来类与对象(定义,实例化,访问限定符,this指针,构造函数)相关知识

Moonnight_bit的博客 182

【鸿蒙南向开发】OpenHarmony——分布式数据对象之功能实践

通过本文的学习可了解到分布式数据对象的主要接口、大致调用方法和功能实现等。结合对应内容,可以进一步对分布式数据对象同步机制做深度学习。下一步,(1) 着重理解同步组网的构建原理。(2) 着重理解同步组网内,监听change和status变化的实现。●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。

HarmonyOS_666的博客 1089

通过CRC32爆破修改图片的宽高 ctf-misc图片隐写

** 一.在处理图片隐写题的时候,可能会修改图片原有的宽高,导致图片里面的内容无法正常显示,那么怎么判断它的宽高是否被修改了呢? ** 1.把图片拖进010editor中会发现左下角提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错。 2.在linux中CRC32错误的图片是无法打开的,也可以利用pngcheck检查图片,会提示CRC32校验错误 ** 二.既然知道了CRC校验码错误,那么如何修改呢? 首先我们要知道CRC32是有哪些字节构成的 ** PNG文件中总是以固定的八个字节开

weixin_44145452的博客 1万+

005__C++类的基本语法

005__类的基本语法:类的构成,类的继承,类的三种成员权限,类的大小,构造函数(构造函数的初始化列表),拷贝函数。

你好啊!猿道友 1206

AI Agent辅助企业财务分析与预测

企业财务分析与预测是企业管理中至关重要的环节,准确的财务分析与预测能够帮助企业管理者做出明智的决策,合理规划资源,降低风险。然而,传统的财务分析与预测方法往往依赖于人工经验和简单的统计模型,存在效率低、准确性差等问题。随着人工智能技术的飞速发展,AI Agent作为一种智能的软件实体,能够自主地感知环境、做出决策并采取行动,为企业财务分析与预测带来了新的解决方案。

AI天才研究院 920

005·C++快速概要:类 面向对象

类 类的声明Enemy.h //一般来说函数设为公有,数据设为私有 class Enemy { public://公开 string name; void Attack();//函数声明 void TakeDamage();//函数声明 Enemy(int hp, int damage);//声明有参构造函数 Enemy();//手动声明无参构造...

qq_33533221的博客 234

潜流式人工湿地计算_复合人工湿地净化水产养殖污水技术

技术概论1. 定义与分类人工湿地是指用人工筑成水池或沟槽,底面铺设防渗漏隔水层,充填一定深度的基质层,种植水生植物,利用基质、植物、微生物的物理、化学、生物三重协同作用使污水得到净化的系统。当池塘养殖污水进入人工湿地时,其污染物被床体吸附、过滤、分解而达到水质净化作用。按照水体流动方式,人工湿地分为表面流人工湿地、水平潜流人工湿地、垂直潜流人工湿地以及由前面几种湿地混合搭配的组合式人工湿...

weixin_42365490的博客 4244

scratch经典游戏主题源码分享,包含了20多款经典游戏

经典游戏案例:1、360度角度射击游戏 2、捕鱼达人 3、超级马里奥 4、超级玛丽 5、吃豆人相关 6、穿着喷气背包的海龟 7、大鱼吃小鱼 8、俄罗斯方块 9、飞机大战 10、愤怒的小鸟 11、黄金矿工 12、节奏大师 13、连连看 14、迷宫游戏 15、跑酷游戏 16、扫雷 17、水果忍者 18、坦克大战 19、推箱子 20、消除泡泡 21、保卫萝卜 22、植物大战僵尸

IT_Scratch的博客 1万+

C++学习记录005——C++核心编程

c++语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c++继承了c语言高效,简洁,快速和可移植的传统。c++融合了3种不同的编程方式:c语言代表的过程性语言,c++在c语言基础上添加的类代表的面向对象语言,c++模板支持的泛型编程。c++98标准,它不仅描述了已有的c++特性,还对语言进行了扩展,添加了异常、运行阶段类型识别(RTTI)、模板和标准模板库(STL)。

weixin_45255379的博客 951

LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

在之前的文章《LDRA Testbed(TBrun)软件单元测试_操作指南》中,已经讲解了如何使用TBrun进行软件单元测试的基本操作步骤。本篇文章将结合实例进一步讲解被测函数中包含多次调用其他函数时,如何对其打桩来实现测试目的(详细的操作流程本文不再重述,若有不清楚的,可以结合之前的操作指南一起来看)。本文以一个被测函数作为示例,讲解了如何使用Testbed(TBrun)对涉及到多次调用其他函数的被测函数进行单元测试。本文的示例可能比较简单,但是思路、方法和流程都是通用的,希望对大家有所帮助。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1462

类和对象(三)

• 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。• 每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。• 引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。

Aa_159147的博客 580

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

CPP 005 类和对象02 (类对象模型,this指针,类的默认成员函数初认识)

本文主要对类对象模型,this指针进行了介绍,并引出类的默认成员函数

m0_62025450的博客 140

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++面向对象程序设计 第二周 类和对象

一、 Week2_005 编程填空:学生信息处理程序 输入 输入数据为一行,包括: 姓名,年龄,学号,第一学年平均成绩,第二学年平均成绩,第三学年平均成绩,第四学年平均成绩。 其中姓名为由字母和空格组成的字符串(输入保证姓名不超过20个字符,并且空格不会出现在字符串两端),年龄、学号和学年平均成绩均为非负整数。信息之间用逗号隔开。 输出 输出一行数据,包括: 姓名,年龄,学号,四年平均成绩。 信息...

Reanon的博客 445

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++笔记005:用面向过程和面向对象方法求解圆形面积

原创笔记,转载请注明出处! 点击【关注】,关注也是一种美德~ 结束了第一个hello world程序后,我们来用面向过程和面向对象两个方法来求解圆的面积这个问题,以能够更清晰的体会面向对象和面向过程。 第一,面向过程计算圆的面积 程序中我们看到一个标准输入流cin,之前我们接触过标准输出cout,我们来大概说一下这两个东西!仅供理解! cout是干什么的呢?cou...

aidianb225973的博客 541

【C++之类和对象篇002】

C++学习笔记005 --- 类和对象构造函数、拷贝构造、析构函数、赋值运算符重载

m0_69455439的博客 1627

C++中,如果类中有多个成员变量,对象的内存是如何布局的?

// 如果类中有多个成员变量,对象的内存是如何布局的? 地址值 内存数据 12个字节 &amp;amp;amp;person.m_id &amp;amp;amp;person 005DF7A0 005DF7A1 m_...

More reading and learning to become excellent 549

程序设计与算法(三)C++面向对象程序设计 (北大MOOC)

  程序设计实习MOOC / 程序设计与算法(三)测验和作业题汇总(2022寒假)   (仅作参考,过OJ但可能有错误)   001:简单的swap #include <iostream> using namespace std; class A { public: int x; int getX() { return x; } }; voi...

金色的省略号 1165

【C++】005、struct与class的区别

/ ✅ 好:struct 表示纯粹的数据聚合// ✅ 好:class 表示有约束的实体对象private:// 必须 >= 0,有业务约束(不变量)public:void deposit(double amount) { /* 校验逻辑 */ }void withdraw(double amount) { /* 校验逻辑 */ }

Tim_10的博客 231

C++的类 定义、构造函数、析构函数、初始化等(C++ Primer Plus 第10章笔记)

文章目录一、“类”的介绍二、方法的定义三、类的初始化类的构造函数和析构函数构造函数:用于构造新对象、将值赋给它们的数据成员析构函数:完成清理工作列表初始化(C++11)const成员函数四、this指针五、对象数组六、类作用域作用域为类的常量 一、“类”的介绍 "对象"是指现实世界中的一切事物 类可以看做是对相似事物的抽象 二、方法的定义 在class内定义 在class内声明,在class外定义 在类外定义成员函数通过在类内进行声明,然后在类外通过作用域操作符::进行实现,形式如下: #inclu

liaoziqiang的博客 960

C++对象的内存布局(上)

本文档节选并整理自潘凯的《C++对象布局及多态实现的探索》系列。原文请参见 http://lunatic.bokee.com/1.       空类: class C000{}; // sizeof = 1它的大小为1字节,这是一个占位符,我们可以看到它的值是0xcc。在debug模式下,这表示是由编译器插入的调试代码所初始化的内存。在release模式

Aloe 1124

北大郭炜慕课程序设计与算法(一)C++的OpenJudge题目答案

北大郭炜慕课程序设计与算法(一)C++的OpenJudge题目答案

weixin_44521782的博客 3445

C++试题及答案

一、 选择题(每小题1.5分,合计25分) 1、 C++对C语言作了很多改进,下列描述中( )使得C语言发生了质变,从面向过程变成了面向对象。 A、增加了一些新的运算符; B、允许函数重载,并允许设置缺省参数; C、规定函数说明必须用原型; D、引进了类和对象的概念; 2、 所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是( )。 A.类 B.

别逗了好么 1万+

C++中的对象数组

类是对象的抽象,我们可以使用一个类来定义很多的对象,然后每个对象都有自己的属性。 当我们使用类来定义很多相同结构的对象的时候,我们可以采取对象数组的方法。 例如,一个班有50个学生,我们定义了一个学生类,该类的学生具有相同的数据成员和成员函数,我们就可以定义一个这样的数组。 Student stdu[50];//假设已经声明了Student类,定义stud数组,有50个元素 =======

学如逆水行舟,不进则退 2816
上一篇: 第004课 C++ 类与对象(二)
下一篇: 第006课 C++ 构造函数_析构函数_拷贝构造函数
W_Linux220
博客等级 码龄3年 116粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值