当前位置:文档之家› 友元习题

友元习题

友元习题
友元习题

友元习题

1.分析以下程序的执行结果

#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<

}

解:

本题说明了友元函数的使用方法。add()是一个友元函数,它返回两个引用对象的n值之和。

所以输出为: 30

注意:友元函数不是类的成元函数

2.分析以下程序的执行结果

#include

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){

return i=b.i;

}

void main()

{

A a(1);

B b(2);

cout<

a.set(b);

cout<

}

解:

本题说明友元类的使用方法。这里将类A设置为类B的友元类,因此,类A的所有成员函数均为类B的友元函数。通过调用a.set(b)将b对象的i值赋给a对象的i值。

所以输出为:1,2

3.有一个学生类student,包括学生姓名、成绩,设计一个友元函数,比较两个学生成绩的高低,并求出最高分和最低分的学生。

解:

#include

#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;

}

};

void main()

{

student st[]={student("王华",78),student("李明

",92),student("张伟",62),student("

孙强",88)};

int i,min=0,max=0;

for(i=1;i<4;i++)

{

if(compare(st[max],st[i])==-1)

max=i;

else if(compare(st[min]),st[i] ==1)

min=i;

}

cout<<"输出结果:"<

cout<<" 最高分:"<

cout<<" 最低分:"<

}

本程序的执行结果如下:

输出结果:

最高分者:李明

最低分者:张伟

4.有一个学生类student,包括学生姓名、成绩,设计一个友元函数,输出成绩对应的等级:大于等于90:优;80~90:良;70~79:中;

60!69:及格;小于60:不及格。

解:

#include

#include

#include

class student

{

char name[10];

int deg;

char level[7];

public:

student(char na[],int d)

{

strcpy(name,na);

deg=d;

}

char *getname(){ return name;}

friend void trans(student &s)

{

if(s.deg>=90)

strcpy(s.level,"优");

else if(s.deg>=80)

strcpy(s.level,"良");

else if(s.deg>=70)

strcpy(s.level,"中");

else if(s.deg>=60)

strcpy(s.level,"及格");

else

strcpy(s.level,"不及格");

}

void disp()

{

cout<

vel<

}

};

void main()

{

student st[]={student("王华",78),student("李明",92),student("张伟",62),student("孙强",88)}; cout<<"输出结果:"<

cout<

for(int i=0;i<4;i++)

{

trans(st[i]);

st[i].disp();

}

}

本程序执行结果如下:

输出结果:

姓名成绩等级

王华 78 中

李明 92 优

张伟 62 及格

孙强 88 良

.有一个学生类student,包括学生姓名、成绩,设计一个友元类,输出成绩大于等于80分以上者。

解:

学生类student的disp()函数设计成友元函数。

本题程序如下:

#include

#include

#include

class student

{

char name[10];

int deg;

public:

student(char na[],int d)

{

strcpy(name,na);

deg=d;

}

char *getname(){ return name;}

friend void disp(student &s)

{

if(s.deg>=80)

cout<

}

};

void main()

{

student st[]={student("王华",78),student("李明",92),student("张伟",62),student("孙强",88)};

cout<<"输出结果:"<

cout<

for(int i=0;i<4;i++)

disp(st[i]);

}

本程序的执行结果如下:

输出结果:

姓名成绩

李明 92

孙强 88

5.分析以下程序的执行结果

#include

class Sample

{

int n;

public:

Sample(){}

Sample (int m){n=m;}

friend void square(Sample &s)

{

s.n=s.n*s.n;

}

void disp()

{

cout<<"n="<

}

};

void main()

{

Sample a(10);

square(a);

a.disp();

}

解:

本题应用友元函数修改对象的数据成员。square()是一个友元函数,它将引用对象的n值进行平方计算。

所以输出为:100

6.分析以下程序的执行结果

#include

class B;

class A

{

int i;

friend B;

void disp(){cout<

};

class B

{

public:

void set(int n)

{

A a;

a.i=n; // i是对象a的私有数据成员,在友元类可以使用

a.disp(); // disp()是对象a的私有成员函数,在友元类可以使用

}

};

void main()

{

B b;

b.set(2);

}

解:

本题说明友元类的设计方法。这里将类B设置为类A的友元类,因此,在设计类B时可以直接使用类A的私有数据成员和成员函数。所以输出为: 2

7.分析以下程序的执行结果

#include

class teacher;

class student

{

char *name;

public:

student(char *s){name=s;}

friend void print(student &,teacher &);

};

class teacher

{

char *name;

public:

teacher(char *s){name=s;}

friend void print(student &,teacher &);

};

void print(student &a,teacher &b)

{

cout<<"the student is:"<

cout<<"the teacher is:"<

}

void main()

{

student s("Li Hu");

teacher t("Wang Ping");

print(s,t);

}

解:

student和teacher类共用一个友元函数的实现。所以输出为:

the student is Li Hu

the teacher is Wan Ping

实验4:静态变量、静态方法与包

实验4:静态变量、静态方法与包实验目的 1、熟练静态变量、静态方法、实例变量、实例方法的概念 2、掌握包的概念与应用。 实验内容 一、静态变量 1.阅读下列程序,并按照要求完成后续功能。 class Point { private int x,y; Point (int xValue, int yValue) { x=xValue; y=yValue; }; public int GetX() { return x; } public int GetY() { return y; } public void SetY(int value) { y=value; } public void SetX(int value) { x=value; } } class Managerpoint { static int count=0; Point createPoint(int x,int y)

{ 提示:在此处加入代码,完成程序的输出要求 } } public class one { public static void main(String[] args) { // TODO Auto-generated method stub Managerpoint mPoint =new Managerpoint(); for(int i=0;i<9;i++){ Point p=mPoint.createPoint(i,20); System.out.print("当前点的总数为:"+Managerpoint.count); System.out.println("当前点的x值为:"+p.GetX()); } } } 注意:本例中使用的“20”仅仅是作为一个测试数据。 在提示处加入代码,要求: ●除提示处代码,其他代码保持不变 ●Main方法的执行结果为: 当前点的总数为:1当前点的x值为:0 当前点的总数为:2当前点的x值为:1 当前点的总数为:3当前点的x值为:2 当前点的总数为:4当前点的x值为:3 当前点的总数为:5当前点的x值为:4 当前点的总数为:6当前点的x值为:5 当前点的总数为:7当前点的x值为:6 当前点的总数为:8当前点的x值为:7 当前点的总数为:9当前点的x值为:8 2.改错。 理解静态方法可访问静态变量,但在静态方法中不能直接访问实例变量。 提示: 阴影处为需要修改的代码。 public class one { int x=8; int y=9; final int i=10; static int getY(){ return y; } static int getI(){ return i;

成员函数、非成员函数和友元函数介绍

成员函数、非成员函数和友元函数介绍 一、成员函数、非成员函数和友元函数 成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。 成员函数的优势是能够方便的进行动态绑定,实现多态。 说明一个函数为一个类的友元函数则该函数可以访问此类的私有数据和方法。 二、成员函数介绍 1、显式构造函数 C++中的e xplicit关键字用来修饰类的构造函数,表明该构造函数是显式的。 隐式构造函数能够实现将该构造函数对应数据类型的数据转换为该类对象。 class MyClass { public: MyClass( int num); } MyClass obj = 10; //ok,convert int to MyClass 如果在构造函数前加上关键字explicit,上述编译出错。 2、静态函数: 类中,static型的成员函数,由于是类所拥有的,而不是具体对象所有的。 静态函数屏蔽了this指针,因此,如果成员函数作为回调函数,就应该用static去修饰它。 3、虚函数: 虚函数首先是一种成员函数,它可以在该类的派生类中被重新定义并被赋予另外一种处理功能。 注意多态不是函数重载。函数重载属于静态绑定,虚函数实现多态是动态绑定。 4、纯虚函数: 在抽象类中定义纯虚函数,必须在子类实现,不过子类也可以只是声明为纯虚函数,由 子类的子类实现。 5、协变返回类型: 一般来说,一个重写的函数与被它重写的函数必须具有相同的返回类型。 这个规则对于”协变返回类型(covariant return type)”的情形来说有所放松. 也就是说,若B是一个类类型,并且一个基类虚拟函数返回B *,那么一个重写的派生类函数可以返回D *, 其中的D公有派生于B(即D是一个(is-a)B).若基类虚函数返回B &,那么一个重写的派生类函数可以返回一个D&. 考虑如下一个shape层次结构的clone操作: Class Shape { Public: //… Virtual Shape *clone () const = 0; //prototype(原型) //… }; Class Circle : public Shape {

Java中的static变量、方法、代码块

1、static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。 2、static方法 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!! 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。 3、static代码块 static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。 例子: class A{ static{ System.out.println("A static block"); // (3)运行 } { System.out.print("Q"); // (5)运行 } public A (){ System.out.println("x"); // (6)运行 } } class B extends A{ static{ System.out.println("B static block"); // (4)运行 } { System.out.print("W"); // (7)运行 }

友元函数及友元类

友元函数及友元类 已有 20621 次阅读 2009-5-9 15:43 |个人分类:C/C++ 什么是友元(friend)? 允许另一个类或函数访问你的类的东西。 友元可以是函数或者是其他的类。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。 分清成员函数,非成员函数和友元函数 成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定,就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。如果函数不必是虚拟的,情况就稍微复杂一点。 ?类的主要特点之一是数据隐藏,即类的私有成员只能在类定义的范围内使用,也就是说私有成员只能通过它的成员函数来访问。 ?但是,有时候需要在类的外部访问类的私有成员。为此,就需要寻找一种途径,在不放弃私有数据安全性的情况下,使得类外部的函数或类能够访问类中的私有成员,在C++中就用友元作为实现这个要求的辅助手段。 ?C++中的友元为数据隐藏这堵不透明的墙开了一个小孔,外界可通过这个小孔窥视类内部的秘密,友元是一扇通向私有成员的后门。 ?友元可分为:友元函数,友元成员,友元类。 ?友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员和公有成员。 ?在类定义中声明友元函数时,需在其函数名前加上关键字friend。此声明可以放在公有部分,也可以放在私有部分。友元函数可以定义在类的内部,也可以定义在类的外部。

1.友元函数虽然可以访问类对象的私有成员,但它毕竟不是成员函数。因此,在类的外部定义友元函数时,不必像成员函数那样,在函数名前加上“类名::”。 2.友元函数一般带有一个该类的入口参数。因为友元函数不是类的成员,所以它不能直接引用对象成员的名称,也不能通过this指针引用对象的成员,它必须通过作为入口参数传递进来的对象名或对象指针来引用该对象的成员。 3.当一个函数需要访问多个类时,友元函数非常有用,普通的成员函数只能访问其所属的类,但是多个类的友元函数能够访问相应的所有类的数据。 例程序2使用一个友元函数访问两个不同的类 4.友元函数通过直接访问对象的私有成员,提高了程序运行的效率。在某些情况下,如运算符被重载时,需要用到友元。但是友元函数破坏了数据的隐蔽性,降低了程序的可维护性,这与面向对象的程序设计思想是背道而驰的,因此使用友元函数应谨慎。 ?除了一般的函数可以作为某个类的友元外,一个类的成员函数也可以作为另一个类的友元,这种成员函数不仅可以访问自己所在类对象中的私有成员和公有成员,还可以访问friend声明语句所在类对象中的私有成员和公有成员,这样能使两个类相互合作、协调工作,完成某一任务。 ?例程序3使用友元成员函数访问另一个类 说明: 1.一个类的成员函数作为另一个类的友元函数时,必须先定义这个类。例如上例中,类boy的成员函数为类girl的友元函数,必须先定义类boy。并且在声明友元函数时,要加上成员函数所在类的类名,如: friend void boy::disp(girl &); 2.程序中还要使用“向前引用”,因为函数disp()中将girl &作为参数,而girl要晚一些时候才定义。 ?不仅函数可以作为一个类的友元,一个类也可以作为另一个类的友元。这种友元类的说明方法是在另一个类声明中加入语句“friend 类名;”,其中的“类名”即为友元类的类名。此语句可以放在公有部分也可以放在私有部分,例如: class Y{

Java 中的 static 使用之静态方法

Java 中的static 使用之静态方法 与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。其实之前我们一直写的 main 方法就是静态方法。静态方法的使用如: 需要注意: 1、静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如: 如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如: 、在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,如下所示:

3、静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。如: ava 中的static 使用之静态初始化块 Java 中可以通过初始化块进行数据赋值。如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。 需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。 我们来看一段代码:

运行结果: 通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。 封装 1、概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 2、好处 a:只能通过规定的方法访问数据 b:隐藏类的实例细节,方便修改和实现。 什么是Java 中的内部类 问:什么是内部类呢? 答:内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。 问:那为什么要将一个类定义在另一个类里面呢?清清爽爽的独立的一个类多好啊!! 答:内部类的主要作用如下:

实验8--友元函数与运算符重载函数

实验十三 1.实验目的 通过本次实验 (1)理解友元函数与运算符重载函数的概念; (2)学会友元函数的定义与使用方法; (3)掌握运算符重载函数的定义与使用方法; 2.实验要求 (1)编写实验程序 (2)在VC++运行环境中,输入源程序 (3)编译运行源程序 (4)输入测试数据进行程序测试; (5)写出运行结果。 3.实验内容 (1)定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。分别用成员函数与友元函数编写运算符重载函数。在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。 参考资料: (1)成员函数 # include class Complex { private: float Real,Image; public: Complex(float r=0,float i=0) { Real=r;Image=i;} void Show(int i) { cout<<"c"< class Complex { private: float Real,Image; public: Complex(float r=0,float i=0) { Real=r;Image=i;} void Show(int i) { cout<<"c"<

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;

Java静态方法、静态变量,初始化顺序

Java静态方法、静态变量、初始化顺序 成员变量分为实例变量和静态变量。其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量。而静态变量被该类所有的对象公有(相当于全局变量),不需要实例化就已经存在。南京Java软件培训机构 方法也可分为实例方法和静态方法。其中,实例方法必须在类实例化之后通过对象来调用,而静态方法可以在类实例化之前就使用。与成员变量不同的是:无论哪种方法,在内存中只有一份——无论该类有多少个实例,都共用同一个方法。南京Java软件培训机构 实例方法的调用: 1.ClassA a = new ClassA(); //必须经过实例化,用对象名访问 2. a.instanceMethod(); 静态方法的调用: 1. 1. a.staticMethod(); //无需经过实例化,用类名或者对象名访问 2. 静态方法的声明和定义 定义一个静态方法和定义一个实例方法,在形式上并没有什么区别,只是在声明的头部,需要加上一个关键字static。南京Java软件培训机构 3.静态方法和实例方法的区别 静态方法和实例方法的区别主要体现在两个方面: · 在外部调用静态方法时,可以使用“类名.方法名”的方式,也可以使用“对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。 · 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。 实例代码:静态方法访问成员变量示例: 1.class accessMember{ 2.private static int sa; //定义一个静态成员变量 3.private int ia; //定义一个实例成员变量 4.//下面定义一个静态方法 5.static void statMethod(){ 6.int i = 0; //正确,可以有自己的局部变量 7.sa = 10; //正确,静态方法可以使用静态变量 8.otherStat(); //正确,可以调用静态方法 9.ia = 20; //错误,不能使用实例变量 10.insMethod(); //错误,不能调用实例方法 11.}

友元函数实验报告

课程名称:VC++程序设计 专业名称 班级 学号 姓名 实验(4): 实验日期 【实验名称】 友元 【实验目的】

1)了解为什么要使用友元 2)掌握友元函数、友元成员、友元类的定义和使用方法 【实验内容和结果】 1. 定义复数complex类,使用友元,完成复数的加法、减法、乘法、除法运算,以及对复数的输出。 #include using namespace std; //复数加法公式: //复数减法公式: //复数乘法公式: //复数除法公式: class complex{ double real; double image; public: complex(double r=0,double i=0){ real=r; image=i; } friend void inputcomplex(complex&com); friend complex addcomplex(complex&c1,complex&c2); friend complex subcomplex(complex&c1,complex&c2); friend complex mulcomplex(complex&c1,complex&c2); friend complex divcomplex(complex&c1,complex&c2); friend void outputcomplex(complex&com); }; void inputcomplex(complex &com){ cin>>com.real>>com.image; } complex addcomplex(complex&c1,complex&c2){ complex c; c.real=c1.real+c2.real; c.image=c1.image+c2.image; return c; } complex subcomplex(complex&c1,complex&c2){ complex c; c.real=c1.real-c2.real; c.image=c1.image-c2.image; return c;

C++友元函数及友元类全总结

C++_友元函数 转自:https://www.doczj.com/doc/27709176.html,/insistgogo/article/details/6608672 1、为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数 优点:能够提高效率,表达简单、清晰 缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。 2、什么时候使用友元函数: 1)运算符重载的某些场合需要使用友元。 2)两个类要共享数据的时候 3、怎么使用友元函数: 友元函数的参数: 因为友元函数没有this指针,则参数要有三种情况: 1、要访问非static成员时,需要对象做参数;--常用(友元函数常含有参数) 2、要访问static成员或全局变量时,则不需要对象做参数 3、如果做参数的对象是全局对象,则不需要对象做参数 友元函数的位置: 因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。 友元函数的调用: 可以直接调用友元函数,不需要通过对象或指针

友元函数的分类: 根据这个函数的来源不同,可以分为三种方法: 1、普通函数友元函数: a) 目的:使普通函数能够访问类的友元 b) 语法:声明位置:公有私有均可,常写为公有 声明:friend + 普通函数声明 实现位置:可以在类外或类中 实现代码:与普通函数相同(不加不用friend和类::) 调用:类似普通函数,直接调用 c) 代码: [cpp]view plaincopyprint? 1.class INTEGER 2.{ 3.private: 4.int num; 5.public: 6.friend void Print(const INTEGER& obj);//声明友元函数 7.}; 8.void Print(const INTEGER& obj)//不使用friend和类:: 9.{ 10.//函数体 11.} 12.void main() 13.{ 14. INTEGER obj; 15. Print(obj);//直接调用 16.} 2、类Y的所有成员函数都为类X友元函数—友元类 a)目的:使用单个声明使Y类的所有函数成为类X的友元

VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法

VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法 VC6.0中重载操作符友元函数无法访问类的私有成员的解决办法: 在C++中,操作符(运算符)可以被重载以改写其实际操作。 同时我们可以定义一个函数为类的友元函数(friend function)以便使得这个函数能够访问类的私有成员,这个定义通常在头文件中完成。 在Visual C++中定义一般的函数为友元函数通常是没有问题的。然而对某些重载操作符的函数,即使我们将它们定义为类的友元函数,VC的编译器仍然会显示出错信息,认为这些友元函数无权访问类的私有成员。我认为这应该是VC6.0编译器与标准C++不兼容的地方。 以下代码就是个例子: // 头文件“Sample.h” #include using namespace std; class Sample{ public: Sample( ); friend ostream &operator<<(ostream &out, const Sample s); friend istream &operator>>(istream &in, Sample & s); private: int x; }; // 实现文件“Sample.cpp” #include “Sample.h” Sample::Sample( ) { x=0; } istream &operator>>(istream &in, Sample & s) { cout<<”Please enter a value”<> s.x ; return in; } ostream &operator<<(ostream &out, const Sample s) { cout << s.x << endl; return out; } 以上代码在gnuc++中编译运行毫无问题。但是在VC++6.0中编译的时候就会出现以下的编

Java中的静态变量_静态方法_静态块与静态类

Java中的静态变量、静态方法、静态块与静态类 在Java中,static是一个关键字,我们不能用它来作为类名或包名,static主要有四种用途,即作为静态变量、静态方法、静态块和静态类。 1、静态变量Java static variables 静态变量就是类变量,它并不属于类的实例,仅属于类本身。在所有能访问该类的地方,也就可能访问或修改该变量,它是非线程安全的,因此,静态变量通常是和final关键字结合在一起,用来标识该变量是一个公共资源和常量。 只要静态变量不是private私有的,那么我们可通过ClassName.variableName的方式进行访问。 2、静态方法Java static methods 静态方法与静态变量一样,也是属于类本身而不属于类的实例对象。在一个静态方法中,除了局部变量外,它能访问的外部变量也必须是静态的,能访问的外部方法也必须是静态的,实例变量和实例方法均不能访问。

3、静态块Java static Block 静态块是由一些语句组成的段落,它在类被加载进内存时执行,且无论类被使用多少次它都只会执行一次。一个类的静态块可以有多个,其执行顺序由它在代码中的顺序决定。 4、静态类Java static methods 静态类都是内部类,static不能用于修饰顶级的类。对于单例模式用静态类来实现就是一个很不错的选择。 5、完整示例

//static variable example private static int count; //kept private to control it's value through setter public static String str; public int getCount() { return count; } //static method example public static void setCount(int count) { if(count > 0) StaticExample.count = count; } //static util method public static int addInts(int i, int...js){ int sum=i; for(int x : js) sum+=x; return sum; } //static class example - used for packaging convenience only public static class MyStaticClass{ public int count; } }

【例6.4】用友元函数重载运算符实现两字符串加法

【例6.4】用友元函数重载运算符实现两字符串加法。 #include #include class String { char name[256]; public: String(char* str) { strcpy(name,str); } String(){ } ~String(){ } friend String operator+(const String&, const String&); void display() { cout<<"The string is :"<

static char* str; String operator+(const String& a,const String& b) { strcpy(str,https://www.doczj.com/doc/27709176.html,); strcat(str,https://www.doczj.com/doc/27709176.html,); return String(str); } void main() { str=new char[256]; String demo1("Visual c++"); String demo2(" 6.0"); demo1.display(); demo2.display(); String demo3=demo1+demo2; demo3.display(); String demo4=demo3+" Programming."; demo4.display(); String demo5="Programming."+demo4; demo5.display();

delete str; } 程序的运行结果为: The string is :Visual c++ The string is : 6.0 The string is :Visual c++ 6.0 The string is :Visual c++ 6.0 Programming. The string is :Programming.Visual c++ 6.0 Programming.

静态成员和友元实验报告

[标准实验报告] 南昌航空大学实验报告 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函数的各自的特点

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语言中friend友元函数详细解析

C语言中friend友元函数详细解析 友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。 我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。 为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率(即减少了类型检查和安全性检查等都需要的时间开销),但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。 友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上

与普通函数一样。 复制代码代码如下: #include cmath #include iostream using namespace std; class Point { public: Point(double xx,double yy) { x=xx; y=yy; } void GetXY(); friend double Distance(Point a,Point b); protected: private: double x,y; }; void Point::GetXY() { //cout(x,y)endl;

实验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】每一个学生有学号、姓名、一门课的成绩等基本信息。编写一个程序,用友元

静态变量用法

JAVA的静态变量相当于类字段,而不用理解为对象字段。 java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static修饰,为实例变量。 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。 静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。 而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。 结果为: 1 0 (成员变量具有缺省值而局部变量则没有) 把代码改为: 结果则为 1

Java中的静态变量和静态函数 静态变量: 在JAVA中类在声明的时候,其实并没有申请和产生内存空间,就如同我们的一个切实可行的想法,但其实并没有去实施这个想法。而类只有在用这种数据类型创建一个类的对象的时候,才能在内存中申请和产生类大小的内存空间,这一块内存空间是用来存放成员变量和成员函数的备份。所以在类声明的时候,是不可以对成员变量进行初始化的,只有用类创建的对象时,才能通过对象对变量初始化,SO,便产生的静态变量!!!它对所有的类对象都是很公共的,对每一个类的对象都具有相同的值。静态变量的关键字是static,它的语法是: Static<数据类型><静态变量名>=<初始化静态变量>; 静态变量在声明的时候就同时初始化,并且只能初始化一次,它有自己的变量作用域,但具有全局的生命周期,可以随时被调用。它声明的时候内存中就从开始一直保留一份值。在类的对象没有被创建之前可以使用类名调静态成员变量,它的语法是: <类名>.<静态成员变量>; 静态函数: 既然有了静态变量那就会有静态函数,静态函数只有访问静态变量,其它非静态的函数是不被允许的,但在静态成员函数中可以声明它自身的变量,它也是一个函数也具有其它函数的特性!静态函数的声明和静态变量的声明所差无几: Static<数据类型><静态函数名>(变量表); 和静态变量一样,静态函数在声明的时候就在内存中存在(即使没有创建对象这和其它的非静态函数是不一样的),也具有全局的生命周期。 下面给出一个静态函数和静态变量的例子: import java.io.*; //导入io流 public class Text_Static { int iNum1; static int iNum2; Text_Static(int iNum1,int iNum2) { this.iNum1=iNum1; this.iNum2=iNum2; this.iNum1++; this.iNum2++; } public void Display1(String str)

相关主题
文本预览
相关文档 最新文档