静态成员函数与友元

合集下载

C++填空题1

C++填空题1

复习:C++填空题1.C++的流库预定义了4个流,它们是cin、cout、clog 和___。

答案:cerr [解析]分别是标准输入、输出、标准错误流(缓冲)和标准错误流 (无缓冲标准错误)2.每个对象都是所属类的一个___。

答案:实例3.在已经定义了整型指针p后,为了得到一个包括10个整数的数组并由p所指向,应使用语句___。

答案: int *p=new int[10];4.函数模板中紧随template之后尖括号内的类型参数都要冠以保留字___。

答案:class [解析]类模板template <class T1,class T2,...,class Tn>5.定义类的动态对象数组时,系统只能够自动调用该类的___构造函数对其进行初始化。

答案:无参[解析]使用new创建对象数组,调用无参构造函数。

6.表达式cout<<end1 还可表示为___。

答案:‘\n’[解析]endl与字符常量‘\n’等价。

7.在C++中,访问一个指针所指向的对象的成员所用的指向运算符是___。

答案:->[解析]指针使用成员方法:“->”指向运算符和“.”成员访问运算符。

8.假如一个类的名称为MyClass,使用这个类的一个对象初始化该类的另一个对象时,可以调用___构造函数来完成此功能。

答案:复制或拷贝[解析]复制或拷贝构造函数就是用对象初始化新的对象。

9.对赋值运算符进行重载时,应声明为___函数。

答案:类成员 [解析]运算符重载的方法有友元或者成员函数两种途径,但是赋值运算符只能使用成员函数的方法来实现。

10.如果要把A类成员函数f()且返回值为void声明为类B的友元函数,则应在类B的定义中加入的语句___。

答案:friend void A::f();[解析]成员函数作为另一个类的友元函数,格式为:friend 返回类型 类名::函数(形参)。

11.String 类的___方法返回查找到的字符串在主串的位置。

友元函数

友元函数

1.友元函数的简单介绍1.1为什么要使用友元函数在实现类之间数据共享时,减少系统开销,提高效率。

如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。

具体来说:为了使其他类的成员函数直接访问该类的私有变量。

即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。

实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。

(2)两个类要共享数据的时候。

1.2使用友元函数的优缺点1.2.1优点:能够提高效率,表达简单、清晰。

1.2.2缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。

2.友元函数的使用2.1友元函数的参数:因为友元函数没有this指针,则参数要有三种情况:2.1.1 要访问非static成员时,需要对象做参数;2.1.2 要访问static成员或全局变量时,则不需要对象做参数;2.1.3 如果做参数的对象是全局对象,则不需要对象做参数;2.2友元函数的位置因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。

2.3友元函数的调用可以直接调用友元函数,不需要通过对象或指针2.4友元函数的分类:根据这个函数的来源不同,可以分为三种方法:2.4.1普通函数友元函数2.4.1.1 目的:使普通函数能够访问类的友元2.4.1.2 语法:声明:friend + 普通函数声明实现位置:可以在类外或类中实现代码:与普通函数相同调用:类似普通函数,直接调用2.4.1.3代码:class INTEGER{friend void Print(const INTEGER& obj);//声明友元函数 };void Print(const INTEGER& obj){//函数体}void main(){INTEGER obj;Print(obj);//直接调用}2.4.2类Y的所有成员函数都为类X友元函数—友元类2.4.2.1目的:使用单个声明使Y类的所有函数成为类X的友元,它提供一种类之间合作的一种方式,使类Y的对象可以具有类X和类Y的功能。

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

实验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,用于计算一个点到直线的距离。

静态成员函数

静态成员函数

静态成员函数静态成员函数是指在类中声明的用static关键字修饰的函数,也叫作类函数。

一般来说,它不需要访问类的数据成员,它只可以调用类的静态成员函数和友元函数,不可以调用普通成员函数,但它可以调用其他所有的成员函数。

静态成员函数也可以用于构造函数那里,因为只有静态成员函数没有隐式的this指针,所以,静态成员函数无法访问非静态成员数据。

二、静态成员函数的作用1、它可以实现自定义的初始化及赋值,所有的对象在创建时都使用相同的初始化及赋值,这样可以节省很多时间。

2、用它可以实现全局函数的功能,但与全局函数不同的是,它可以访问类的private部分。

3、它可以提供对象的总数,通过静态友元函数来实现,可以检测构造函数和析构函数的调用次数,从而检测对象的数量。

4、它可以返回类的静态成员变量,也可以用于类的计算,这种方法可以使我们不必使用全局变量。

三、静态成员函数的特点1、只有在类中才能使用静态成员函数,而不能直接在主程序中使用它们。

2、它可以调用类中所有的静态成员函数,但不能调用普通成员函数。

3、它不能操作类的非静态成员数据,但可以调用其他所有的成员函数。

4、它只能被类的静态成员函数和友元函数调用。

四、实例下面我们来看一个使用静态成员函数的实例,这个实例演示了如何使用静态成员函数来访问类的静态成员变量。

#include <iostream>using namespace std;class StaticClass{private:static int count;public://静态成员函数static int getCount(){return count;}//普通成员函数void setCount(int val){count = val;}};//静态变量初始化int StaticClass::count = 0;int main(){//设置count的值StaticClass::setCount(5);//获取count的值cout<<count的值为:<<StaticClass::getCount()<<endl;return 0;}上面的程序中,定义了一个静态变量count,在类外面定义了这个静态变量,指定了它的初值为0,在类中定义了一个静态成员函数getCount(),用于访问静态变量count,这里不用构造函数,也没有实例化任何对象,只要使用类名来调用静态成员函数就可以使用私有成员count,并且可以通过它获取静态变量count的值,并将这个值输出在屏幕上。

C++总结

C++总结

对象(object):类(class):!在声明类的时候注意大括号后面的分号;!访问类中的私有成员属性,必须通过对象调用共有成员函数对私有属性进行访问。

对象访问要用‘.’,对象的引用访问要用‘->’。

封装和信息隐藏(encapsulation and information hiding):构造函数:形式:一般为公有成员函数,构造函数与类名相同,无返回值甚至没有void,可以带参数,可以重载。

拷贝构造函数:深拷贝:在拷贝时会申请内存空间,浅拷贝:只是指向同一个地址,不会申请空间。

当调用拷贝构造函数有返回值时,相当于重新构造了一个对象,若没有分配空间,默认是浅拷贝,即没有分配空间,因此在析构的时候会出问题。

析构函数:形式:在构造函数前面加上‘~’,不可以重载,不带参数,不能有返回值,不指定函数类型。

内联函数:在类中直接定义函数体,在成员函数进行编译时,是作为内联函数实现的。

功能:为了提高效率的,空间换时间,在预处理时进行替换注意:内联函数里面代码1~5行,不能含有for,switch,while等控制语句,其次在声明为内联函数后,函数也不一定会将作为内联函数,具体还有看代码的复杂度。

友元函数:是定义在类外部的普通函数,其特点是能够访问类中的私有和保护成员,类的访问限制对其不起作用。

友元函数必须在类中声明。

注意:友元函数会破坏类的封装性,友元函数不是成员函数,用法与普通函数一样。

友元函数只能用对象名引用类中的数据成员。

即函数参数必须是对象,不带有this指针。

友元类:静态数据成员:若把一个类的某个数据成员设置为静态的,则由该类产生的所有对象,其静态成员都共享一个存储空间,这个空间是在编译时决定的。

在说明对象时,并不为静态类型的成员分配空间。

int A::z=0;静态成员函数:在函数前面加上static修饰,静态成员只能访问类中的静态数据成员和静态成员函数,不能直接访问类中的非静态数据(可以通过引用),静态成员函数可以被其他程序的代码直接调用,所以它不包含对象地址的this指针。

中南大学daydayupt题库中的全部判断题

中南大学daydayupt题库中的全部判断题
正确答案
正确
题目
若有定义:int a[ ][4]={{0},{1}};,则数组a包含8个元素。
正确答案
正确
题目
若有定义:int a[ ][3]={0,1,2,3,4,5,6,7};,则数组a包含9个元素。
正确答案
正确
题目
若有定义:int a[ ][5]={0,1,2,3,4,5,6,7,8};,则数组a包含9个元素。
正确答案
正确
题目
在C++中,空指针用NULL表示。
正确答案
正确
题目
在C++中,变量的指针就是变量的地址。
正确答案
正确
题目
假设有:int a[5],*p=a;,则*++a与*++p相等。
正确答案
错误
题目
将函数定义的首部int sum( int x[ ] , int n )改写成int sum( int * x , int n )编译不会出错,即效果等价。
正确答案
正确
题目
将函数声明int sum( int [ ] , int );改写成int sum( int *, int );编译不会出错,即效果等价。
正确答案正确题目一个类的保护成员仅可以被其自己和派生类的所有非静态成员函数和友元函数直接访正确答案正确题目基类中的私有成员在通过公有派生的子类中是不能被直接访问的正确答案正确题目一个类中的私有成员只能被它们所在类的成员函数访问正确答案错误题目基类中的公有成员在通过私有派生的子类中具有private访问属性正确答案正确题目基类中的公有成员在通过保护派生的子类中具有public访问属性正确答案错误题目基类中的公有成员在通过私有派生的子类中具有public访问属性正确答案错误题目当派生类从基类公有继承时可以把指向基类对象的指针赋给派生类对象的指针正确答案错误题目基类中的保护成员在通过私有派生的子类中具有private访问属性正确答案正确题目当派生类从基类公有继承时可以把派生类对象的地址赋给基类对象的指针正确答案正确题目基类中的保护成员在通过私有派生的子类中具有protected访问属性正确答案错误题目当派生类从基类公有继承时可以把基类对象的地址赋给派生类对象的指针正确答案错误题目基类中的保护成员在通过保护派生的子类中具有protected访问属性正确答案正确题目基类中的保护成员在通过保护派生的子类中具有private访问属性正确答案错误题目基类中的公有成员在通过保护派生的子类中具有protected访问属性正确答案正确题目基类中的公有成员在通过公有派生的子类中具有public访问属性正确答案正确题目当派生类从基类公有继承时可以把指向派生类对象的指针赋给基类对象的指针正确答案正确题目基类中的公有成员在通过公有派生的子类中具有protected访问属性正确答案错误题目基类中的保护成员在通过公有派生的子类中具有public访问属性正确答案错误题目基类中的保护成员在通过公有派生的子类中具有protected访问属性正确答案正确题目基类中的私有成员在通过私有派生的子类中是可以被直接访问的正确答案错误题目多态性只能在编译的时候实现

C++题目11-12

C++题目11-12

HZAU-专业C++作业11-12判断题1. 友元关系是单向的,不可交换的。

(2分)2. 只有成员函数才能传递this指针,而友元函数不能传递this指针(2分)3. 友元函数是成员函数,它可以访问类中私有成员。

(2分)4. 在成员函数中访问对象的数据成员时,可以直接用数据成员名,而在友员函数中访问对象的数据成员时,必须指明是哪个对象的数据成员。

(2分)5. 友元是可以继承的。

(2分)6. 常成员函数只能用来引用数据成员的值,而不允许改变数据成员的值。

(2分)7. C++语言允许使用友元,但是友元会破环封装性。

(2分)8. 必须在类定义体外对静态数据成员进行初始化。

(2分)9. 能访问一个类CMyClass中的private成员的可以是类CMyClass 的成员函数,友元函数和友元类中的函数。

(2分)10. 类的友元函数是指可以访问本类私有成员的其他类的成员函数。

(2分)11. 类中的静态成员数据为该类的所有对象所共享,并且,在该类对象被撤销时,静态成员并没有撤销。

(2分)12. 如果在一个类的对象之间要进行数据交换,可以使用该类的静态数据成员来完成。

(2分)13. 如果一个类的所有对象都共享某一个变量,则应当将该变量定义为该类的私有成员。

(2分)1.如果类A被说明成类B的友元,则()。

(2分)A. 类A的成员即类B的成员B. 类B的成员即类A的成员C. 类A的成员函数不得访问类B的成员D. 类B不一定是类A的友元2.友元的作用()。

(2分)A. 提高程序的运用效率B. 加强类的封装性C. 实现数据的隐藏性D. 增加成员函数的种类3.下述静态数据成员的特征中,()是错误的。

(2分)A. 静态数据成员要在类体外进行初始化B. 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符C. 静态数据成员不是所有对象所共用的D. 说明静态数据成员时前边要加修饰符static已知类A是类B的友元,类B是类C的友元,则()。

C++类中的各种成员,嵌套类,友元,this指针专题

C++类中的各种成员,嵌套类,友元,this指针专题

类中的各种成员
const ,static,[],*p,const static,对象成员,常量对象,mutable 1.类中的静态成员变量 static:被类中的所有对象所共享,静态成员属于整个类不属于某个对象。静态成员变量和全局 变量差不多,只是他的作用范围为定义他的类及类的对象所知。 1.1.当在一个类中声明静态成员变量时并没有定义该变量即没有为他分配存储空间,所以必须在类外对静态成员变 量提供全局定义,注意必须在类外,这样就可以为变量分配内存,定义的方式为使用作用域解析符,比如有类 hyong 类中有静态整型成员 a,那么在类外定义该变量的方式为 int hyong::a=9;注意必须要有在类中声明的类型, 如果定义时没有初始化则自动初始化为 0。 1.2.静态成员变量如果是类中的公有成员则可以在程序中使用语句 hyong::a 来访问该变量,当然也可以通过对象名 来访问该变量,如果变量是私有或者保护的,则只能用静态的成员函数来访问该变量。 1.3 不能用初始化列表来初始化静态成员变量。 2.静态成员函数 static,静态成员函数没有 this 指针,静态成员函数只能引用这个类的其他类静态成员,当然全局函数 和数据可以访问,因为类的函数都要用 this 指针来访问成员,因为静态成员函数没有 this 指针,所以不能访问除静态 成员之外的成员。同一个函数不可以有静态和非静态两种版本,静态成员函数不可以是虚函数,静态成员函数不能是 const 和 volatile。静态成员函数使用是有限的,通常使用静态成员函数来访问类中的私有静态成员变量。在类外定义 的形式为 int hyong::g(){}注意,这里没有 static 说明符。 3.const 成员变量参看第四节初始化列表。 4.const 成员函数,形式为 int f() const{}注意 const 在括号后,如果把 const 放在 int 前就成为一个反回 const int 类型的函 数了, 把函数声明为 const 后就使得 this 可以当做一个 const 指针, 从而使得函数不能修改调用它的对象也就是说不能 改变任何一个类的成员变量的值。如果想让 const 函数能修改某一部分成员,可以把该成员声明为 mutable 类型,例 如 mutable int a。在类外定义的形式为 int hyong::f() const{} 5.const static 常量静态数据成员,这种类型的成员变量可以直接在类的定义中直接初始化,这也是唯一一种可以在类 中初始化的类型,如果没有在类中初始化,在类外的初始化方式为 const int hyong::a=2;注意 const 和类型都必须有。 6.const 常量对象:即把对象声明为常量,即 const hyong m,常量对象不能调用可能改变对象的值的函数,因此常量对 象只能调用类中的 const 常量函数,因为不是 const 的函数都有可能改变对象的值。 6.2.常量对象可以调用类中的公有成员,如 m.a 就是正确的如果 a 是公有的。 6.4.不能对常量对象的公有成员重新赋值,如 m.a=3 就是错误的。但可以对类中的公有静态成员变量重新赋值,因 为静态成员变是不属于这个常量对象,他是属于整个类的。 7.对象数组:对象数组即数组中的每个成员都是一个对象,例如 hyong a[3];其中 a[0],a[1],a[2]都是一个 hyong 类型的 对象。对象数组的初始化,如果有默认构造函数则语句 hyong a[3]将调用默认构造函数初始化 3 个对象,如果对象数
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宁夏师范学院数学与计算机科学学院
《面向对象程序设计(C++)》实验报告
实验序号:6实验项目名称:静态成员函数与友元
学 号
姓 名
专业班级
实验地点
指导教师
时间
一、实验目的及要求
1、掌握静态、动态生存期的概念;
2、掌握静态数据成员和静态成员函数的概念;
3、掌握友元函数的含义,友元函数和成员函数的区别,掌握友元函数的设计方法。
friend void cal(Rectangle r);
private:
int top,left,down,right;
};
void cal(Rectangle r)
{cout<<"矩形的周长是:"<<2*(fabs(r.top-r.down)+fabs(r.left-r.right))<<endl;
五、教师评语
签名:
日期:年月日
成绩
三、实验内容与步骤
说明:对下述实验内容给出实验结果并分析总结。
【验证题目】验证相关例题
【设计题目】
1.设计并测试一个矩形类(Rectangle),属性为矩形的左下与右上角的坐标,矩形水平放置。操作为计算矩形周长与面积。类对象的数据由友元函数来进行访问。并对比友元函数、成员函数和普通函数使用上的不同。参考程序如下:
cout<<"矩形的面积是:"<<(fabs(r.top-r.down))*(fabs(r.left-r.right))<<endl;
}
int main()
{
Rectangle r1(100,200,600,400);
cal(r1);
return 0;
}
2.定义Boat与Car两个类,二者都有weight属性,定义它们的一个友元函数totalWeight(),计算二者的重量和。
参考程序如下:
//lab6_2.cpp
#include <iostream>
#include <cmath>
using namespace std;
class Boat
{ public:
Boat(double w)
{ weight=w; }
friend double totalWeight(Boat a)
};
void main()
{ Boat aa(254);
Car bb(395);
cout<<"totalweight:"<<totalWeight(aa)+totalWeight(bb)<<endl;
}
3.课后运行教材习题9-9,体会静态数据成员和成员函数的含义。
四、分析与讨论
通过实验对友元函数有了一些了解,它不是类的成员函数,对于静态函数成员,它不随对象建立而分配空间,也不随对象的撤销而释放空间,静态成员函数没有this指针。
{return a.weight;}
private:
double weight;
};
class ar
{ public:
Car(double w)
{weight=w;
}
friend double totalWeight(Car b)
{return b.weight;}
private: double weight;
4、学习友元函数和友元类的组合使用方法。
二、实验设备(环境)及要求
硬件:PC(P 以上,128M以上内存)、因特网接入;
软件:Windows XP操作系统或更高版本、Office2003或更高版本、Visual C++6.0。
实验学时:1学时
其他要求:验证题目和设计题目尽量完成;任选一个设计题目写实验报告
//lab6_1.cpp
#include <iostream>
#include <cmath>
using namespace std;
class Rectangle
{ public:
Rectangle(int t=0, int l=0, int d=0, int r=0)
{ top=t; left=l; down=d; right=r; } ~Rectangle() {};
相关文档
最新文档