文档库 最新最全的文档下载
当前位置:文档库 › 静态成员函数与友元

静态成员函数与友元

静态成员函数与友元
静态成员函数与友元

宁夏师范学院数学与计算机科学学院

《面向对象程序设计(C++)》实验报告

实验序号:6实验项目名称:静态成员函数与友元

静态函数

C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。 5)堆——动态存储分。 在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。 好处: 定义全局静态变量的好处: <1>不会被其他文件所访问,修改 <2>其他文件中可以使用相同名字的变量,不会发生冲突。 局部静态变量 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。1)内存中的位置:静态存储区 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,

作用域随之结束。 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。 当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。 3.静态函数 在函数的返回类型前加上关键字static,函数就被定义成为静态函数。 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。 定义静态函数的好处: <1>其他文件中可以定义相同名字的函数,不会发生冲突 <2>静态函数不能被其他文件所用。存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。 关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。 由于static变量的以上特性,可实现一些特定功能。 1.统计次数功能 声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调

C++类中的静态成员变量和静态成员函数的作用

数据成员可以分静态变量、非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员. 非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中.. 一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数.. 分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。 一、在面向过程设计中的static关键字 1、静态全局变量 定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。 特点: A、该变量在全局数据区分配内存。 B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。 C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。 例(摘于C++程序设计教程---钱能主编P103)://file1.cpp //Example 1 #include void fn(); static int n; //定义静态全局变量 void main() {

n=20; cout <

实验八 静态数据成员和静态函数成员

实验八静态数据成员和静态函数成员 任务一: 1、了解多文件工程 本次实验需要创建一个工程,此工程由三个文件组成 1)头文件client.h ——类的声明 2)源文件client.cpp——成员函数的定义 3)源文件test.cpp——main()函数的定义 2、了解CLIENT类 本次实验的主角是CLIENT(客户机)类。在实际生活中,计算机网络的应用模式为client/server(客户机/服务器)模式。情况很简单,即多台客户机与一台服务器连接,服务器为客户机提供服务。 3、实验任务 1)阅读程序代码,仔细分析CLIENT类的各数据成员及函数成员,写出分析结果 2)创建多文件工程,编译并运行 3)为main()函数的各条语句增加注释 4)将数据成员ServerName改为非静态,其它类成员的静态属性不变。 修改程序代码,使客户机a连接到另一台服务器M。(b仍与N连接) 任务二: 生成一个储蓄类CK。用静态数据成员表示每个存款人的年利率lixi。类的每个对象包含一个私有数据成员cunkuan,表示当前存款额。提供一个calLiXi()成员函数,计算利息,用cunkuan乘以lixi除以12取得月息,不计复利,并将这个月息加进cunkuan中。提供设置存款额函数set()。提供一个静态成员函数modLiXi(),可以将利率lixi修改为新值。 实例化两个不同的CK对象saver1和saver2,结余分别为2000.0和3000.0。将lixi设置为3%,计算一个月后和3个月后每个存款人的结余并打印新的结果。 首先定义储蓄类CK,它包含一个私有数据成员cunkuan,数据类型为double,一个静态数据成员年利率lixi,数据类型也为double;包含一个成员函数calLiXi()和一个静态成员函数modLiXi(),其中modLiXi()应含有一个表示要更改的年利率的新值的参数。 完善程序: #include class CK{ double cunkuan; public: ? //定义静态数据成员lixi CK(double c){?}//构造函数 void set(double x){?}//设置存款额 ? //定义静态成员函数modLiXi() void calLiXi(int m=1); };

C++友元习题

01.分析以下程序的执行结果 #include class Sample { int n; public: Sample(int i){n=i;} friend int add(Sample &s1,Sample &s2); }; int add(Sample &s1,Sample &s2) { return s1.n+s2.n; } void main() { Sample s1(10),s2(20); cout< class B; class A { int i; public: int set(B&); int get(){return i;} A(int x){i=x;} }; class B { int i; public: B(int x){i=x;} friend A;

int A::set(B &b) // 由于使用了类B的定义,故本函数的定义应放在类B定义之后 { return i=b.i; } void main() { A a(1); B b(2); cout< #include class student { char name[10]; int deg; public: student(char na[],int d) { strcpy(name,na); deg=d; } char *getname(){ return name;} friend int compare(student &s1,student &s2) { if(s1.deg>s2.deg) return 1; else if(s1.deg==s2.deg) return 0; else return -1;

静态成员函数一般情况下只能访问静态成员变量

静态成员函数一般情况下只能访问静态成员变量,因为不接受隐含的this指针。另外作为类的静态成员函数,不用声明对象,便可直接调用,例如类A的静态成员函数fun(); A::fun(); 1、主要用于封装全局变量和全局函数。以避免在文件作用域内包含带外部连接的数据。 例如全局变量:int path;int para1; 解决办法:设计一个全局类,并将这些全局名称声明为静态变量,并编写静态函数来调用这些变量。 class Global{ static int s_path; static int s_para; private: Global();//不实现,避免无意中的实例化 public: //manipulators static void setPath(int path){s_path = path;} static void setPara(int para){s_para = para;} //accessors static int getPath(){return s_path;} static int getPara(){return s_para;} } 2、对自由函数的封装 在.h文件的文件作用域内避免使用自由函数(运算符函数除外);在.c文件中避免使用带有外部连接的自由函数,因此可以使用静态成员函数进行处理。 例如:int getPara();int getPath();我们可以通过声明一个结构的静态方法代替: struct SysUtil{ static int getPath(); static int getPara(); }这样,唯一有冲突危险的就是出现类名SysUtil了。

static变量和static函数的各自的特点

static变量和static函数的各自的特点 static变量大致分为三种用法 一、用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期. 二、用于全局变量,主要作用是限制此全局变量被其他的文件调用. 三、用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象 static 声明的变量. 在C语言中有两方面的特征: 1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 Tips: A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题; D.如果我们需要一个可重入的函数,那么,我们一定

要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数) E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。 函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。 扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。

C++静态成员函数小结

C++静态成员函数小结 一静态数据成员 (1) 1.静态数据成员的定义 (1) 2.静态数据成员被类的所有对象所共享(包括该类派生类的对象) (2) 3.静态数据成员可以成为成员函数的可选参数(普通数据成员则不可以) (2) 4.静态数据成员的类型可以是所属类的类型(普通数据成员则不可以) (3) 5.静态数据成员的值在const成员函数中可以被合法的改变 (3) 二静态成员函数 (3) 1.静态成员函数的地址可用普通函数指针储存(普通成员函数地址需要用类成员函数 指针来储存) (4) 2.静态成员函数不可以调用类的非静态成员 (4) 3.静态成员函数不可以同时声明为virtual、const、volatile函数 (4) 类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。 静态类成员包括静态数据成员和静态函数成员两部分。 一静态数据成员 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。其定义方式与全局变量相同。举例如下: xxx.h文件 class base{ private: static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。 }; xxx.cpp文件 const int base::_i=10;//定义(初始化)时不受private和protected访问限制. 注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的

C++中静态成员函数访问非静态成员变量

C++中静态成员函数访问非静态成员变量 这两天写一个简单的程序,由于程序运行占用cpu比较厉害,导致运行中界面窗口无法交互,因此想到了多线程,以前没有接触过mfc多线程,在网上看了两篇文章,觉得也不过如此,就开始动手写了,结果发现即使是看别人写很简单,自己动手也会出现很多问题,哪怕是看起来真的很简单的问题。 这里遇到的问题就是由于多线程的函数必须是static的,然后需要在里面调用non-static的函数,我就没有办法了,于是又开始网上找资料,下面就将这篇文章转贴过来,供大家学习思考:先看一个class class a { public: static FunctionA() { menber = 1; } private: int menber; } 编译上述代码,出错。原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。(看过一篇很好的文章《浅析C++中的this指针》介绍这个方面的详细内容)那要想访问怎么办呢?地球人都知道只要将: int menber; //change the line above to: static int menber; 但是这个方法让我们不得不将static function内用到的成员变量都变成static的了,而且static 的成员还要显式初始化,有没有更好的方法?答案是肯定的。如下: class a { public: static FunctionA(a* _a) { a-> menber = 1; (window.cproArray = window.cproArray || []).push({ id: "u2280119" }); } private: int menber; } 前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在模仿传递非静态成员函数里this变量。

静态成员和友元实验报告

[标准实验报告] 南昌航空大学实验报告 2011 年11月11 日 课程名称:面向对象程序设计B 实验名称:静态成员和友元 班级:10202327 姓名:吕潇同组人: 指导教师评定:签名: 一、实验目的 (1)学习静态成员的使用,理解静态成员的特殊用途。 (2)学习友元函数及友元类,领会友元类的作用。 二、实验内容(本次实验要完成的内容) 应用VC++6.0的编辑环境构造一个类Stack,设计一个整数链表类,实现栈操作。类中需有记录结点个数的数据成员(静态成员),要有判空操作。编制应用程序,取100次随机数(<1000),如果取到的随机数比前一个随机数大的话,入栈,然后逐个取出(即出栈过程)求其和。 用堆分配方法逐个产生满足条件(递增有序)的结点,插入栈中,每当出栈时,要及时将结点删除,求和工作放在类定义外(友元)。 注意:栈中最多会有100个元素,最少会有一个元素,这是由条件(递增有序)决定的。 具体说明如下: struct SNode{ int data; SNode *next; }; class Stack{ public: Stack(); ~Stack(); void Push(int e);//insert a data into stack int Pop();//delete a data from stack friend int GetSum(Stack &);//get sum of stack,friend function //friend class getsum;// get sum of stack,friend class,you can try it using friend class static int num;//static number private: SNode *head; };

静态函数 静态数据成员与静态成员函数 为什么虚函数必须是非静态成员函数 构造函数能为static吗

静态函数静态数据成员与静态成员函数为什么虚函数必须是非静态成员函数构造函数能为static吗? 2009-07-05 14:27 静态函数 用static声明的函数是静态函数。静态函数可以分为全局静态函数和类的静态成员函数。 Static关键字 在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。用static声明的方法是静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。 静态方法不再是针对于某个对象调用,所以不能访问非静态成员。 可以通过对象引用或类名(不需要实例化)访问静态成员 C++类静态数据成员与类静态成员函数 函数调用的结果不会访问或者修改任何对象(非static)数据成员,这样的成员声明为静态成员函数比较好。且如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于static的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。 静态成员函数的声明除了在类体的函数声明前加上关键字static,以及不能声明为const或者volatile之外,与非静态成员函数相同。出现在类体之外的函数定义不能制定关键字static。 静态成员函数没有this指针。 在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? 这个问题便是本章的重点:声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数。 下面我们用几个实例来说明这个问题,类的成员需要保护,通常情况下为了不违背类的封装特性,我们是把类成员设置为protected(保护状态)的,但是我们为了简化代码,使要说明的问题更为直观,更容易理解,我们在此处都设置为public。 以下程序我们来做一个模拟访问的例子,在程序中,每建立一个对象我们设置的类静态成员变自动加一,代码如下: #include using namespace std;

实验4 静态成员与友元

3.2 实验与实践任务 3.2.1 实验名称静态成员和友元 3.2.2 实验目的 1.掌握静态成员的定义和使用。 2.掌握友元的定义和使用。 3.2.3 实验要求 1.调试程序要记录调试过程中出现的问题及解决办法; 2.编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验; 3.在编写程序时,要按照多文件结构来组织程序。 4.做完实验后给出本实验的实验报告,实验报告的内容包括实验目的、实验内容和结果分析。 3.2.4 实验内容 【P1】商店销售某一商品,商店每天公布统一的折扣(discount)。同时允许销售人员在销售是灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。现在已知当天3名销售员的销售情况为: 销售员货号(num)销货件数(quantity)销货单价(price) 101 5 23.5 102 12 24.56 103 100 21.5 请编程序,计算出当日此商品的总销售款sum,以及每件商品的平均售价。要求用静态数据成员和静态成员函数 【P2】创建一个SavingsAccount类:用static(静态)数据成员包含每个存款人的annualInterestRate(年利率)。类的每个成员包含一个private数据成员savingsBalance,表示当前存款额。 提供一个calculateMonthlyInterest 成员函数,计算月利息,用savingsBalance乘以annualInterestRate除以12取得,并将当月月息加入savingsBalance。 提供一个静态成员函数modifyInterestRate,将静态annualInterestRate设置为新值。实例化两个不同的SavingsAccount对象saver1和saver2,余额分别为$2 000.00和$3 000.00 将annualInterestRate设置为3%,计算每个存款人的月息并打印出新的结果。 【P3】学校的人事部门保存了有关学生的部分数据(学号、姓名、年龄、住址),教务部门也保存了学生的另外一些数据(学号、姓名、性别、成绩),两个部门分别编写了本部门的学生数据管理程序,其中都用了Student作为类名。现在要求在全校的学生数据管理程序中调用这两个部门的学生数据,分别输出两种内容的学生数据。要求用标准C++编程,使用命名空间。 【P4】设计一个日期类Date,包含日期的年、月、日三个私有数据成员,编写一个友元函数,求两个日期之间相差的天数。 【P5】每一个学生有学号、姓名、一门课的成绩等基本信息。编写一个程序,用友元

C++教程第07章 类与对象-5 类的静态成员及常量

7章类与对象 7.1 类和对象(定义及使用)初步 7.2成员函数的重载 7.3 对象的初始化、构造函数与析构函数 7. 4 类的定义及其使用 7. 5 类的静态成员及常量成员 7.5.1静态成员 7.5.1.1静态成员数据 1.静态成员数据的定义,与静态类型的变量的定义方式一样,要在成员数据的定义之前加关键字static。 2.静态成员数据必须有确定的值,但由于在类的定义中不能对成员数据直接进行初始化,故必须在类定义的外部对静态成员数据再声明一次,并进行初始化,此时,前面不需要加关键字static。同时为了保持静态成员数据取值的一致性,一般在类的构造函数中不给静态成员数据设置初值。对静态成员数据初始化的顺序为它们在类体外声明的顺序. 3.在同一个程序中,当一个类有多个对象时,则这些对象中的静态成员数据都共享同一个存储空间,即在定义类时,就为静态成员数据分配存储单元,以后创建该类的对象时,将不再为该静态成员数据分配存储单元,也不会对该静态成员数据初始化。 静态成员数据初始化格式: <类型><类名> ::<静态成员数据> = <数值> ; 4.类的静态成员数据具有全局变量的某些特征,比如在程序开始运行时就为静态成员数据分配存储空间,但它只有类的作用域。即在执行main()之前,首先对静态成员数据和全局变量分配存储空间并进行初始化,当整个程序结束时才撤消静态成员数据和全局变量。5.静态成员数据也可以分为公有的、私有的和受保护的静态成员。 对公有静态成员,即可以通过类的对象进行访问,也可以通过类名直接访问(这是静态成员数据与一般成员数据的另一个区别)。格式: <类名>::<静态成员数据> 私有的和保护的静态成员数据则只能被该类的公有成员函数访问。 6.值得注意的是,在创建任何对象之前,类的静态成员数据已经存在并可以引. 7.静态成员数据也可以是用户自定义类型的数据。 7.5.1.2静态成员函数 1.定义静态成员函数时,只要在成员函数名前用关键字static修饰即可。 2.静态成员函数属于整个类,它是由该类的所有对象所共享的成员函数,它不属于某个对象。因此它不含有隐含的*this指针参数,故它不能像普通成员函数那样直接访问对象中的非静态的成员(成员函数和成员数据),即 静态成员函数只能访问所在类的静态的成员(成员函数和成员数据)、全局变量、外部函数等。(因为它们不属于任一个特定对象)。

最新内蒙古科技大学面向对象的程序设计实验6-静态成员和友元

内蒙古科技大学 面向对象的程序设计 实验报告 一、实验目的 1.理解静态成员(静态数据成员、静态成员函数)的作用与使用; 2.理解友元(友元函数、友元类)的作用于使用。 二、实验环境 编译器:Visual C++ 6.0. 操作系统:Windows 7旗舰版 三、实验内容 二、实验内容 2.1练习(一): 1.理解下面的程序,并在VC++6.0下运行查看结果,回答程序后面的问题。 #include #include class CStudent { public: CStudent(char *n, int a); ~CStudent();

static void SetAge(int age); private: char *name; int age; static int nTotalObj; }; int CStudent::nTotalObj = 0; CStudent::CStudent(char *n, int a) :age(a) { int nLen = strlen(n); name = new char[nLen+1]; strcpy(name,n); name[nLen] = ’\0’; nTotalObj++; } CStudent::~CStudent() { delete[] name; nTotalObj--; } void CStudent::SetAge(int age) { this->age = age; } void main() { CStudent stu1("张三",25); CStudent str2("李四",26); cout<<"CStudent::nTotalObj="< #include class CStudent { public: CStudent(char *n, int a); ~CStudent(); private:

实验4 含有类的静态成员与类的友元的C++程序设计

实验4 含有类的静态成员与类的友元的C++程序设计 专业:计算机科学与技术班级:10计本1班学号:姓名: 实验地点:B102实验时间:2011/11/1 指导教师:李佐勇 一、实验目的 1.理解类的静态成员解决共享问题的机制; 2.掌握类的静态数据成员与静态函数成员的实现方法; 3.理解利用友元关系实现数据共享的机制,掌握类的友元函数以及友元类的实现方法; 4.学习多文件结构在C++程序中的使用。 二、实验环境 一台PC机,Windows XP操作系统,Visual C++ 6.0开发环境。 三、实验内容 1.设计一个解决王婆卖瓜问题的程序。王婆卖瓜,每卖一个瓜,需记录该瓜的重量,还要记录所卖出的总重量和总个数,同时还允许退瓜。设计一个具有静态数据、函数成员的watermelon类。 实现提示:西瓜类有3个数据成员:重量weight、总重量total_weight以及总个数total_number。因为不论西瓜是否卖出,总重量total_weight和总个数total_number这两个数据总是要保留的,且这两个数据与单个的西瓜无关联,因此这两个数据要申明为静态数据成员。成员函数:卖瓜用构造函数模拟,退瓜用析构函数模拟,瓜重用disp成员函数给出屏幕提示。为了用不与特定对象相联系的静态成员函数来访问静态数据,还需要定义一个显示总重量和总个数的静态成员函数total_disp。 2.设计一个程序,其中有3个类,即CBank、BBank和GBank,分别为中国银行类、工商银行类和农业银行类。每个类都包含一个私有数据balance,用于存放储户在该行的存款数,另有一个友元函数total用于计算储户在这3家银行中的总存款数。 3. 设计一个程序,其中有2个类,Point类为点类,包含2个私有数据x和y,表示点的坐标,line类为直线类,包含3个私有数据a、b和c,表示直线方程ax+by+c=0。另有一个友元函数dist,用于计算一个点到直线的距离。点与直线之间的距离计算公式如下: 2 2b a c by ax d ++ + = 要求: ①将Point与Line类的定义放在头文件head.h中; ②将Point与Line类的实现部分放在PL.cpp中; ③主函数(类的使用)文件定义为:Lab04_3.cpp。 四、实验记录 1.#include using namespace std; class watermelon { public: watermelon(double w){ weight=w;

类中有关静态成员的使用

一 static的作用 1 什么是static??static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。 2、为什么要引入static??函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。 3、什么时候用static??需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。 二,类的静态成员简介 静态局部变量 ? 1.存放在静态存储区 ? 2. 在两次函数调用期间保留原值仅在函数内部可见 ? 3.可以被自动初始化为0 静态全局变量 ?作用域:仅在变量所在的文件内 类的静态成员(C++特有的语法) ?至今为止,我们使用的成员变量和成员函数都由某个特定的对象调用。但是,也许有些成员变量和成员函数,是属于整个类的。

?静态成员变量,必须在类声明之后,用::初始化; ?静态成员的值,和某一个具体对象是无关的。 ?对于非静态成员来说,每个对象都有一个特定的值,每个对象都为自己非静态成员,在内存里保留一个位置。?而静态成员,整个类只有一个备份 ?静态成员函数的使用限制 ? 1. 静态成员函数,被类的所有对象共享。不是和某一个特定的对象。而是和整个类相关联。 ? 2.静态成员函数内部,不可以使用this指针。因为this指针是指向每一个具体对象的。所以说this指针本身就是非静态成员变量。 ? 3.静态成员函数只能访问静态成员(包括静态成员函数和静态成员变量),而不能访问非静态成员。但是非静态成员函数既可以访问非静态成员也可以访问静态成员。 ? 4.静态成员函数,也可以有public和private。 private的静态成员函数,不能在外部用类名或对象名访问。只能从类的内部被其他的静态成员函数访问。?静态成员访问方式 ?类名::静态成员名(推荐) 三,类的静态成员的深入研究 静态数据成员的使用方法和注意事项如下:?1、静态数据成员在定义或说明时前面加关键字static。?2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:?<数据类型><类名>::< 静态数据成员名>=<值>?这表明:?(1) 初始

实验5 静态成员、友元、对象成员

实验五静态成员、友元、对象成员 1、实验目的: 1)掌握静态数据成员的定义及使用; 2)掌握静态成员函数的定义及使用。 3)掌握友员函数的定义和使用。 4)理解对象成员的概念 5)掌握对象成员的初始化方法 2、实验内容: 2.1 分析下面的程序,指出程序运行的结果。 1) P132习题3.14,3.15,3.20,3.23,3.24,3.25,3.26 代码: 3.14 #include class B{ public: B(){ } B(int i,int j) {x=i; y=j; } void printb() {cout<

void A::printa() {c.printb(); } int main() {A a(7,8); a.printa(); return; } 程序运行结果: 7,8 3.15 程序代码: #include class A{ public: void set(int i,int j) {x=i; y=j; } int get_y() {return y; } private: int x,y; }; class box{ public: void set(int l,int w,int s,int p) {length=l; width=w; label.set(s,p); } int ger_area() {return length*width; } private: int length,width; A label; }; int main() {box b;

C 类的静态成员详细讲解

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象。希望阅读本文可以使读者对类的静态成员变量和成员函数有更为深刻的认识。 第一个例子,通过类名调用静态成员函数和非静态成员函数 [cpp]view plaincopyprint? 1.class Point 2.{ 3.public: 4.void init() 5.{ 6.} 7.static void output() 8.{ 9.} 10.}; 11.void main() 12.{ 13.Point::init(); 14.Point::output(); 15.} 编译出错:error C2352:'Point::init':illegal call of non-static member function 结论1:不能通过类名来调用类的非静态成员函数。

第二个例子,通过类的对象调用静态成员函数和非静态成员函数将上例的main()改为: [cpp]view plaincopyprint? 1.void main() 2.{ 3.Point pt; 4.pt.init(); 5.pt.output(); 6.} 编译通过。 结论2:类的对象可以使用静态成员函数和非静态成员函数。 第三个例子,在类的静态成员函数中使用类的非静态成员[cpp]view plaincopyprint? 1.#include 2.class Point 3.{ 4.public: 5.void init() 6.{ 7.} 8.static void output() 9.{ 10.printf("%d\n",m_x); 11.} 12.private: 13.int m_x; 14.}; 15.void main() 16.{ 17.Point pt;

C++实验报告之静态成员、运算符重载

题目1: 定义一个复数类,通过重载运算符:*,/,直接实现二个复数之间的乘除运算。编写一个完整的程序,测试重载运算符的正确性。要求乘法“*”用友元函数实现重载,除法“/”用成员函数实现重载。 源程序1 /*******************第1题*******************/ /******************单森汉*****************/ /******************2012-5-1*****************/ #include using std::cout; using std::endl; class Complex{ float Real, Image; public: Complex(float r=0,float i=0) { Real=r;Image=i;} void Show() {cout <<"Real="<

实验四类与对象(静态数据成员)

实验四类与对象(静态成员) 一、实验目的与要求 1.掌握类的定义,成员函数的定义; 2.掌握对象的初始化及应用; 3.掌握构造函数的使用; 4.掌握析构函数的使用; 5.掌握静态的使用; 二、实验内容 1.设计一个学生类Student,它要求有以下面成员: 私有数据成员: 注册号Registration,姓名Name、数学成绩Math、英语成绩English、高级程序设计成绩Programming; 静态数据信息学生人数Count; 具有的公有的函数成员: (1)求三门课总成绩的函数Sum(); (2)求三门课平均成绩的函数Average(); (3)显示学生数据信息的函数Print(); (4)获取学生注册号的函数Get_reg_num(); (5)设置学生数据信息的函数Set_stu_inf(); (6)静态的获取学生人数函数Get_coutnt(); (7)构造函数; (8)析构函数. 为了统一格式,也方便同学们更有针对性的实现 Student类的声明为: //Student.h #include using namespace std; class Student { private: int Registration; char Name[20];

int Math; int English; int Programming; static int Count; public: Student(int ,char[],int,int,int); Student(Student &); ~Student(); int Sum(); double Average(); void Print(); int Get_reg_num(); void Set_stu_inf(int,char[],int ,int ,int); static int Get_count(); }; //shiyan4_1.cpp #include"Student.h" //对静态数据成员进行初始化,补充代码 //(1) int main() { //1.输出当前的学生数,补充代码 cout<<"当前的学生数:"<

相关文档
相关文档 最新文档