第五章友元

第五章友元
第五章友元

1、const修饰符的语义是_________。

答案修饰在它左边出现的类型描述符

3、下面的类定义了拷贝初始化构造函数,请完成该类的定义和实现。

Class MyClass

{

public:

MyClass(int xx=0,int yy=0){X=xx;Y=yy;}

______ ①______ ;___ //拷贝初始化构造函数

private:

int X,Y;

};

MyClass::______ ②_________ //拷贝初始化构造函数的实现

{

X=______ ③______ ;

______ ④______ ;

}

答案①MyClass(MyClass &m)②MyClass(MyClass &m)③m.X ④Y=m.Y

4、当需要使用mt修饰的成员函数改变类中的数据成员时,可以使用_________个数据成员。答案此题不做

5、当一个类的成员是某一个类的对象时,该对象就被称为_________。

答案内嵌对象成员

6、当一个类对象的成员函数被调用时,该成员函数的_________指向调用它的对象。

答案this指针

7、有如下定义语句: MyClass p[10];则系统自动调用该类构造函数___①___次。当类对象数组p离开它的作用域时,系统自动调用该类析构函数___②___次。

答案10,10

8、指向数组的指针是指_________。

答案该指针指向一个数组,可以指向任何一个数组元素

9、有如下定义语句:MyClass *p[10];,则当类对象数组指针p离开它的作用域时,系统自动调用该类析构函数_________次。

答案0

10、下列程序通过把类Distance定义为类Point的友元类来实现计算两点之间距离的功能。请完成该程序。

#include iostream.h>

#include

class Point

public:

______ ①______ ;

Point (______ ②______ )

{

X=a;

Y=b;

}

void Print()

{

cout<<"X="<

cout<<"Y="<

}

private:

float X,Y;

};

class Distance

{

public:

float Dis(Point &p,Point &q);

};

f1oat Distance::Dis(Point &p,Point &q)

{

float result;

______ ③______ ;

cout<

return result;

}

void main()

{

Point p(10,10),q(20,20);

Distance d;

d.Dis(p,q);

}

答案

11、如果一个类是聚集类,即该类定义了其他类的子对象,则该类的对象和子对象先被初始化的是_________。

答案该类的子对象

12、下列程序在构造函数和析构函数中申请和释放类的私有成员,请完成该类的实现。Class MyClass

public:

MyClass(int a);

~MyClass();

pnvate:

int *X;

};

MyClass::MyClass(int a)

{

______ ①______ ;

}

MyClass::~Myclass()

{

______ ②______ ;

}

答案X=new int(a) delete X

13、常量对象应_________,并且不能在生成之后修改。

答案定义时初始化

14、指针数组是指_________。

答案该数组中的每个元素都是指针

15、定义在类中的类被称为___①___,定义了类的类被称为___②___。

答案此题了解:内嵌类包容类

16、有如下定义语句:MyClass *p;,则执行p=new MyClass; 语句时,将自动调用该类的___①___。执行delete p;语句时,将自动调用该类的___②___。

答案构造函数析构函数

17、如果一个数组中的每个元素都是同一个类的对象,则该数组被称为_________。

答案对象数组

18、在C++语言中,每个类都有一个隐含的指针叫做___①___指针。该指针指向___②___。答案this 正在调用成员函数的对象

1、类MyClass的定义如下:

class MyClass

{

public:

MyClass(){value=0;}

setV ariable(int I){value =I;}

private:

int value;

};

则对下列语句序列正确的描述是_________。

MyClass*p,my;p=&my;

A)语句p=&my;是把对象my赋值给指针变量p

B)语旬MyClass *p,my;会调用两次类MyClass的构造函数

C)对语句*p.SetV ariable(5)的调用是正确的

D)语句p->SetV ariable(5)与语句my.SetV ariable(5)等价

答案

2、对于常成员函数,下面描述正确的是_________。

A)类的成员函数可以操作常对象

B)类的成员函数不能操作常对象

C)只有常成员函数可以操作常对象

D)在常成员函数中,常对象可以被更新

答案

3、包容类Contain和内嵌类Embed定义如下:

#include

class Contain

{

private:

int x;

protected:

int z;

public:

class Embed

{

private:

int y;

public:

Embed(){y=100;}

int Embed_Fun();

}MyEmbed;

int Contain_Fun();

};

对上面的定义,正确的描述是_________。

A)定义类Embed对象的语句是:Contain::Embed embed;

B)类Contain的成员函数Contain_Fun()中可以用MyEmbed.y的方式访问类Embed的私有成员y

C)类Embed的成员函数Embed_Fun()中可以直接访问类Contain的私有成员x

D)类Embed的成员函数Embed_Fun()中可以直接访问类Contain的保护成员z

答案

4、类MyClass的定义如下:

class MyClass

{

public:

MyClass(){}

MyClass(int I){value =new mki};}

Int *value;

};

若要对value赋值,则下面语句正确的是_________。

A)MyClass my; my.value =10;

B)MyClass my; *my.alue =10;

C)MyClass my; my.*value=10;

D)MyClass my(10);

答案

5、假定MyClass为一个类,则执行MyClass a[3],*p[2];语句时,自动调用该类构造函数_________次。

A)2

B)3

C)4

D)5

答案

6、对于拷贝初始化构造函数,正确的描述是_________。

A)在C++语言中,如果不自定义类的拷贝初始化构造函数,则每个类都有默认的拷贝初始化构造函数

B)必须为每个类定义拷贝初始化构造函数

C)如果要使用拷贝初始化构造函数,则必须在类中先定义

D)当定义了类的构造函数时,如果要使用拷贝初始化构造函数,则必须定义拷贝初始化构造函数

答案

7、对于常数据成员,下面描述正确的是_________。

A)常数据成员可以不初始化,并且不能更新

B)常数据成员必须被初始化,并且不能更新

C)常数据成员可以不初始化,并且可以被更新

D)常数据成员必须被初始化,并且可以被更新

答案

8、关于new运算符的错误的描述是_________。

A)使用运算符new创建对象数组时必须定义初始值

B)使用运算符new创建对象时,会调用类的构造函数

C)运算符new可以用来动态创建对象和对象数组

D)使用new运算符创建的对象可以使用运算符delete删除

答案

9、对于拷贝初始化构造函数和赋值操作的关系,正确的描述是_________。

A)拷贝初始化构造函数和赋值操作是完全一样的操作

B)进行赋值操作时,会调用类的构造函数

C)当调用拷贝初始化构造函数时,类的对象正在被建立并被初始化

D)拷贝初始化构造函数和赋值操作不能在同一个类中被同时定义

答案

10、有如下定义语句: int a[]={1,2,3,4,5};,则对语句int *p=a;正确的描述是_________。

A)语句int *p=a; 定义不正确

B)语句int *p=a; 初始化变量p,使其指向数组对象a的第一个元素

C)语句int *p=a; 是把a[0]的值赋给变量p

D)语句int *p=a; 是把a[1]的值赋给变量p

答案

11、对下列语句正确的描述是_________。

Const int *x;___//①

int *const x;___//②

A)语句①的含义是指针变量x不能更改

B)语句②的含义是指针变量x所指向的值不能更改

C)语句②的含义是指针变量x不能更改

D)语句①和②是相同含义的不同定义方式

答案

1、写出下列程序的运行结果。

#include

class MyClass

{

public:

void DisplayMessage(const char *Text,int Type)

{

cout<<"Message:Text="<

cout<<"Text ="<

}

void DisplayMessage(const char *Text,unsigned int Type)

{

cout<<"Message:Text ="<

cout<<"Text ="<

}

};

void main()

{

unsigned char value =0;

MyClass my;

my.DisplayMessage("Hello!",value);

}

答案

2、写出下列程序的运行结果。

#include

class MyClass

{

int a,b;

public:

MyClass(int x=0,int y=0);

~MyClass();

};

MyClass::MyClass(int x,int y):a(x),b(y)

{

cout<<"Ieis is a constructor! A+b="<

}

MyClass::~MyClass()

{

cout<<"This is a destuctor!"<

}

void main()

{

MyClass x,y(10,20),z(y);

}

答案

3、下面的程序定义包容类Contain 和内嵌类Embed。写出下列程序的运行结果。#include

class Contain

{

private:

int x;

public:

class Embed

{

private:

int y;

public:

Embed(){};

Embed(int a){y=a;}

int GetV alue() const;

void ShowV alue(Contain *m_pCon);

}MyEmbed;

friend class Embed;

Contain(int a,int b):MyEmbed(a){x=b;}

};

int Contain::Embed::GetV alue()const

{

return y;

}

void Contain::Embed::ShowV alue(Contain *m_pCon)

{

cout<<"This is Contain class's value:"<x<

}

void main()

{

Contain::Embed embed;

Contain contain(10,20);

contain.MyEmbed.ShowV alue(&contain);

embed =contain.MyEmbed;

Cout<<"This is Embed class's value:"<

答案

4、阅读下面类的定义,找出程序中的错误,并说明错误原因。#include

class MyClass

{

public:

void DisplayMessage(const char *Text,char *Caption)

{

cout<<"Message:Text="<

cout<<"Caption ="<

}

void DisplayMessage(const char *Text,unsigned int Type)

{

cout<<"Message:Text ="<

cout<<"Text ="<

}

};

void main()

{

MyClass my;

my.DisplayMessage("Hello!",0);

}

答案

5、阅读下列程序,写出宏替换后的代码。

#include

#define MY-CLASS(className,classDateType)

class className

{

public:

className(classDateType I=0;){value =I;}

void print(){cout<

private:

classDateType value;

};

MY_CLASS(MyClass,int);

MY_CLASS(OtherClass,double);

答案

6、阅读下面类的定义,找出程序中的错误,并说明错误原因。#include

class MyClass

{

public:

void Fun(int a){X=a;}

private:

int X;

};

void main()

{

MyClass *my;

*my.Fun(10);

}

答案

1、定义类Point。要求定义类对象时,可以有这样的定义语句:‘Point p1(1,2),p2(pl)。

2、下面列出了由3个文件main.cpp、Timer.h和Timer.cpp组成的一个程序。

文件main.CPP中实现了主函数;

文件Timer.h中定义了类Timer;

文件Timer.cpp中实现了类Timer的成员函数。

下面给出这3个文件的不完整实现。仔细阅读所给的程序,根据题意补充文件Timer.h和文件Timer.cpp的内容。

要求:

①将所有的成员变量都定义为私有的;

②不要增加题中没有用到的类成员变量和类成员函数;

③将构造函数和成员函数Increase()定义为非内联函数,其他成员函数均定为内联函数。

//文件Timer.cpp

#include

#include "Timer.h"

voidTimer::Increase()

{

minutes++;______//分钟值加1

if (minutes>59)

{

minutes -= 60;

hours++;

}

if (hours>23)

hour = 0;

cout<<"\n It is now"<

}

//完成对构造函数的实现

//文件Timer.h

//类Timer的定义

class Timer

{

//完成类的定义

}

//文件main.cpp

#include

#include "Timer.h"

void main()

{

Timer timer(3,44);___ //构造一个初始时间为3点44分的计时器对象cout<

cout<

timer.Increas();___ //时间增加一分钟,然后输出

}

答案

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

成员函数、非成员函数和友元函数介绍 一、成员函数、非成员函数和友元函数 成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。 成员函数的优势是能够方便的进行动态绑定,实现多态。 说明一个函数为一个类的友元函数则该函数可以访问此类的私有数据和方法。 二、成员函数介绍 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 {

友元函数及友元类

友元函数及友元类 已有 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{

实验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"<

第五章 三元合金相图(习题)

第五章 三元合金相图 1 根据Fe -C -Si 的3.5%Si 变温截面图(5-1),写出含0.8%C 的Fe-C-Si 三元合金在平衡冷却时的相变过程和1100℃时的平衡组织。 图5-1 2 图5-2为Cu-Zn-Al 合金室温下的等温截面和2%Al 的垂直截面图,回答下列问题: 1) 在图中标出X 合金(Cu-30%Zn-10%Al )的成分点。 2) 计算Cu-20%Zn-8%Al 和 Cu-25%Zn-6%Al 合金中室温下各相的百分含量,其中α相成分点为Cu-22.5%Zn-3.45%Al ,γ相成分点为 Cu-18%Zn-11.5%Al 。 3) 分析图中Y 合金的凝固过程。 Y

% 图5-2 3 如图5-3是A-B-C 三元系合金凝固时各相区,界面的投影图,A 、B 、C 分别形成固溶体α、β、γ。 1) 写出P p '',P E '1和P E '2单变量线的三相平衡反应式。 2) 写出图中的四相平衡反应式。 3) 说明O 合金凝固平衡凝固所发生的相变。

图5-3 图5-4 4 图5-4为Fe-W-C三元系的液相面投影图。写出e1→1085℃,P1→1335℃,P2→1380℃单变量线的三相平衡反应和1700℃,1200℃,1085℃的四相平衡反应式。I,II,III三个合金结晶过程及室温组织,选择一个合金成分其组织只有三元共晶。 5 如图5-5为Fe-Cr-C系含13%Cr的变温截面 1)大致估计2Cr13不锈钢的淬火加热温度(不锈钢含碳量0.2%, 含Cr量13%) 2)指出Cr13模具钢平衡凝固时的凝固过程和室温下的平衡组织(Cr13钢含碳量2%)3)写出(1)区的三相反应及795 时的四相平衡反应式。 图5-5 图5-6 6 如图5-6所示,固态有限溶解的三元共晶相图的浓度三角形上的投影图,试分析IV区及VI区中合金之凝固过程。写出这个三元相图中四相反应式。

友元函数实验报告

课程名称: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;

第五章 相 图 5

5.7 三元相图的应用举例 5.7.1. CaO-Al2O3-SiO2系统三元相图 具体的硅酸盐系统三元相图往往图形比较复杂。我们首先以CaO-Al2O3-SiO2系统为例说明判读一张实际相图的步骤(见图5-42)。本系统15个无变量点标于图中。 (1) 首先看系统中生成了多少化合物,找出各化合物的初晶区,根据化合物组成点与其初晶区的位置关系,判断化合物的性质。本系统共有10个二元化合物,其中四个是一致熔化合物:CS、C2S、C12A7、A3S2,六个不一致熔化合物:C3S2、C3S、C3A、CA、CA2、CA6。两个三元化合物都是一致熔的:CAS2(钙长石)及C2AS(铝方柱石)。这些化合物的熔点或分解温度都标在相图上各自的组成点附近。 (2) 如果界线上未标明等温线,也未标明界线的温降方向,则需要运用连线规则,首先判明各界线的温度下降方向,再用切线规则判明界线性质。然后,在界线上打上相应的单箭头或双箭头。 图5-42 CaO-Al2O3-SiO2系统三元相图 (3) 运用重心规则判断各无变量点的性质。 如果在判断界线的性质时,已经画出了与各界线相对应的连线,则与无变量点相对应的副三角形已经自然形成了;如果先画出与各无变量点相对应的副三角形,则与各界线相对应的连线也会自然形成。 需要注意的是,不能随意在二个组成点之间连连线或在三个组成点间连副三角形。如A3S2与CA组成点之间不能连连线,因为相图上这二个化合物的初晶区并无共同的界线,液相与这二个晶相并无平衡共存关系;在A3S2、CA、Al2O3的组成点间也不能连副三角形,因为相图上不存在这三个初晶区相交的无变量点,它们并无共同析晶的关系。

第六章材料科学基础武汉理工大学陆佩文

第六章相平衡 内容提要:本章系统阐述相图的基本原理并结合实际介绍相图在无机非金属的研究和生产实践中的具体应用。 重点:判读三元系统相图的规则及分析三元系统相图的步骤 难点:相图在无机非金属材料的研究和生产实践中的具体应用 §1硅酸盐系统相平衡特点 一、热力学平衡态与非平衡态 二、硅酸盐系统中的组分、相及相律 1、组分——系统中每一个能单独分离出来并独立存在的化学均匀物质称为物种或组元。 独立组分数C——决定一个相平衡系统的成分所必需的最少物种(组元)数成为独立组分数。 独立组分数=物种数-独立化学平衡关系式数 C = S – R – R, S:物质数(物种数或组分数) R:相平衡物系中所存在的独立化学反应的平衡反应式的数量 R,:浓度限制条件的数量(只存在同一相中) 2、相——体系中具有相同物理与化学性质的均匀部分的总和称为相。 3、相律 相律数学式为:n = - F+ C P 式中F——自由度:在一定范围内可以任意改变而不引起系统中相数目和形态的改变的独立可变因素(或变量)的数目称为自由度。 C——独立组元数即组分数; P——系统平衡时的相数; n——外界影响因素的数目(一般只涉及P和T) 如果外界因素只有温度和压力影响时,相律关系式为2 F; C - + =P 对于凝聚体系(不考虑压力)相律为:1 F C + =P - 凝聚系统:不含气相或气相可以忽略的系统称为凝聚系统。 §2单元系统(P-T图) 单元系统中只有一种组分,不存在浓度问题,影响系统的平衡因素只有温度和压力,因此单元系统相图是用温度和压力二个坐标表示的。 单元系统中,C = 1 F = C – P + 2 = 3 – P P min= 1 F max= 2 (两个变量为温度和压力) P max= 1 F min= 0

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

C++_友元函数 转自:https://www.360docs.net/doc/d15522958.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的友元

第五章 三元合金相图

第五章 三元合金相图 (一)名词解释 成分三角形、直线法则、重心法则、二元共晶线、三元共晶线、水平截面图、垂直截面图; (二)回答问题 1.图①为A-B-C 三元固态完全不溶共晶相图投影图: 1) 分析合金1 . 2. 3三元合金的平截面图,填写 2.图②为A-B-C 三元固态有限溶解的 3. 杠杆定律与重心法则有什么关系?在 4. 三元合金的匀晶转变和共晶转变与二元合金的匀晶转变和共晶转变有何区E 1 图① 衡结晶过程,写出反应式及室温组织。 2) 求合金3室温组织中各组织组成物及相组成相对重量。 3) 画出M-N 及B-H 变温出各相区,并指出各种三元合金成分特点。 共晶相图投影图,分析1、2、3、4、5、 6合金的平衡结晶过程,写出反应式及 室温组织。 E 1 C 图② 三元相图的分析中怎样用杠杆定律和重心法则 别?

5. 三元相图的垂直截面与二元相图有何不同:?为什么二元相图中可应用杠杆定律而三元相图的垂直截面中却不能? 6. 图 ③、④、⑤ 为A-B-C三元合金相图在T E 温度时的四相平衡转变水平截面图 形:(1)说明在T E 温度时各发生何种类型的四相平衡转变?并写出反应式。(2) 在稍大于或略低于T E 温度时各发生何种类型的二元反应?写出反应式。 7. 在成分三角形分别标出含A20%, B40%的ABC 三元合金以及含A55%, B20%的ABC 三元合金的成分点。 8. 分析三元匀晶相图中成分为O 的合金的平衡凝固过程。 9. 在Pb-Sn-Sb 三元系成分三角形内画出下列合金的位置。 1)20%Pb-60%Sb; 2)30%Pb-30%Sn 10..温度为189时,Sb-10%Pb-40%Sn 合金的平衡组织中包含C D δγβ、、三个相。这三个相的成分分别为: Sn Pb Sn Pb Sn Pb %15%65%40%3%50%5??????δγβ、、。 求该合金在上述温度下所含三个平衡相所占的分数。 11.二元与三元固溶体转变与共晶转变的自由度有无区别?如何解释 12.为什么三元相图的一般垂直截面的两相区内,杠杆定律不适用,举例说明之。 13.在三元相图中,是否只有单析溶解度曲面或双析溶解度曲面投影内的合金,才有一个次生相或两个次生相析出? 14.在三元相图中,液相面投影图十分重要,是否根据它就可以判断该合金系凝固过程中所有的相平衡关系? 15.在实际应用中一般不直接使用完整的三元相图,而是使用其等温截面图或变温截面图。那么,这两种图各有什么特点和作用?

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中编译的时候就会出现以下的编

第7章 三元相图作业答案

第六章 三元相图作业答案 Chapter 6 Ternary Phase Diagram 作业1:30kg 成分为O (20%A ,50%B ,30%C )的合金与10kg 成分为Z (20%A ,10%B ,70%C )的合金熔化在一起后, 形成新合金x, 试求x 合金中A 、B 、C 组元的含量各是多少,并在浓度三角形中标出各合金。 解答: 30 7050101030--=--=C C B B X X X X X B %=40% X C %=40% X A %=20% 作业2:某三元合金K 在温度为t1时分解为B 组元和液相两个相的相对量 2=L B W W 。已知合金K 中A 组元和C 组元重量比为3,液相含B 量为40%, 试求合金K 的成分。

解答: B B L B X X BK KL W W --===100402 X B -40=200-2X B 3X B =240 X B =80% 已知 X A +XB=100%-80%=20% X A /X C =3 故 X A =15% X C =5% 作业3: A 、 B 、 C 三组元固态完全不互溶,右图为其三元相图投影图。已知合金O 的成分为80%A 、10%B 、10%C ,a 点的成分为60%A 、20%B 、20%C ,E 点的成分为50%A 、10%B 、40%C 。 (1)写出图中合金I 和P 的室温平衡组织。 (2)简要写出合金O 的结晶过程和室温平衡组织。 (3)计算室温下合金O 的组织组成物的相对含量。

解: (1) I :B+(A+B+C ) P :(B+C )+(A+B+C ) (2) 合金O 加热到液相面温度以上后,缓慢降 温,首先遇到液相面Ae 1Ee 3A ,开始结晶出初晶A ,这时液相的成分等于合金成分,两相平衡相联结线的投影是AO 线。继续冷却时,不断析出初晶A ,液相中A 组元的含量 不断减少,B 、C 组元的含量不断增加,液相成分沿AO 的延长线变化。当液相成分到达a 点时,开始发生三相共晶转变,L →(A+B )。此后在温度继续下降时,液相中不断凝固出两相共晶(A+B ),液相成分沿aE 线变化,直到E 点发生四相共晶转变L →(A+B+C )。在略低于E 点温度凝固完毕,不再发生其它转变。故合金在室温下的平衡组织为A+(A+B )+(A+B+C )。(3分) (3) 作aD//BC ,OF//BC ,aM//AB ,EN//AB ,延长Ea 交AB 于q ()%5060 100) 80100(60100%=----=== AD DF Aa Oa A (1分) %2540 20 405.05.0%)1()%(=-?=?=-= +AN MN A Eq Ea B A (1分) (A+B+C)%=1-A%-(A+B)%=25% (1分) 作业4 图示为A 、B 两组元固态完全不溶解、C 组元固态部分溶解的三元相图 的投影图。 (1).假定T A >T B >T C >T e1>T e3>T e2>T E ,画出T 温度(T e3>T>T e2)的等温截面图, 并标注出各相区;(5分) (2).画出XY 变温截面图,并标注出各相区;(5分) (3).分析合金O 的相变过程。(2分)

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;

【例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.360docs.net/doc/d15522958.html,); strcat(str,https://www.360docs.net/doc/d15522958.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.

一个类作为另一个类的友元类

#include class B;//提前引用声明 class A { private: int age1; int score1; public: A(int a,int b):age1(a),score1(b){}//用初始化表对类A中的数据成员进行初始化friend B;//声明类B为类A的友元类 }; class B { private: int age2; int score2; public: B(int a,int b):age2(a),score2(b){} void display1(); void display2(A &a); void display3(A &a,B &b); }; void B::display1() { cout<<"类B中的数据为:"<

实用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;

vc中操作符重载作为友元函数错误处理

VC6.0中重载操作符函数无法访问类的私有成员 在C++ 中,操作符(运算符)可以被重载以改写其实际操作。 同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成员, 这个定义通常在头文件中完成。 在Visual C++中定义一般的函数为朋友函数通常是没有问题的。 然而对某些重载操作符的函数, 即使我们将它们定义为类的朋友函数,VC的编译器仍然会显示出错信息, 认为这些朋友函数无权访问类的私有成员。 我认为这应该是VC6.0的bug。 以下代码就是个例子: // 头文件“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; }

《无机材料科学基础》课后习题第六章.doc

第10章习题?解答 1. 解释下列名词:凝聚系统,介稳平衡,低共熔点,双升点,双降点,马鞍点,连线规则,切线规则,三角形规则,重心规则。 解:凝聚系统:不含气相或气相可以忽略的系统。 介稳平衡:即热力学非平衡态,能量处于较高状态,经常出现于硅酸盐系统中。 低共熔点:是一种无变量点,系统冷却时儿种晶相同时从熔液中析出,或加热时同时融化。 双升点:处于交叉位的单转熔点。双降点:处于共轴位的双转熔点。 马鞍点:三元相图界线上温度最高点,同时又是二元系统温度的最低点。 连线规则:将一界线(或其延长线)与相应的连线(或其延长线)相交,其交点是该界线上的温度最高点。切线规则:将界线上某一点所作的切线与相应的连线相交,如交点在连线上,则表示界线上该处具有共熔性质;如交点在连线的延长线上,则表示界线上该处具有转熔性质,远离交点的晶相被回吸。 三角形规则:原始熔体组成点所在副三角形的三个顶点表示的物质即为其结晶产物;与这三个物质相应的初初晶区所包围的三元无变量点是其结晶结束点。 重心规则:如无变点处于其相应副三角形的重心位,则该无变点为低共熔点:如无变点处于其相应副三角形的交义位,则该无变点为单转熔点;如无变点处于其相应副三角形的共轴位,则该无变点为双转熔点。 2. 从SiCh的多晶转变现象说明硅酸盐制品中为什么经常出现介稳态晶相? 解:在573笆以下的低温,SiO2的稳.定晶型为b 一石英,加热至573°C转变为高温型的a 一石英,这种转变较快;冷却时在同一温度下以同样的速度发生逆转变。如果加热速度过快,则a 一石英过热而在I6OO°C 时熔融。如果加热速度很慢,则在870°C转变为a 一鳞石英。a 一鳞石英在加热较快时,过热到1670°C时熔融。当缓慢冷却时,在870°C仍可逆地转变为a —石英;当迅速冷却时,沿虚线过冷,在163°C转变为介稳态的b 一鳞石英,在1171转变为介稳态的& 一鳞石英。加热时g 一鳞石英仍在原转变温度以同样的速度先后转变为b 一鳞石英和a 一鳞石英。a 一鳞石英缓慢加热,在1470V时转变为 a 一方石英,继续加热到I713°C熔融。当缓慢冷却时,在1470°C时可逆地转变为a 一鳞石英:当迅速冷却时,沿虚线过冷, 在180?270°C转变为介稳状态的b 一方石英;当加热b 一方石英仍在180-270°C迅速转变为稳定状态的 a 一方石英。爆融状态的SiO2由于粘度很大,冷却时往往成为过冷的液相—一石英玻璃。虽然它是介稳态, 由于粘度很大在常温下可以长期不变。如果在IOOO"C以上持久加热,也会产生析晶。熔融状态的SiO”只有极其缓慢的冷却,才会在17I3°C可逆地转变为a —方石英。对Si。?的相图进行分析发现,SiO?的所有处于介稳状态的熔体的饱和蒸汽压都比相同温度范围内处于热力学稳定态的熔体的饱和蒸汽压高。而理论和实践i正明,在给定的温度范围,具有最小蒸汽压的相一定是最稳定的相。所以由于晶型转变速度不同,在不同的加热或冷却速率下,硅酸盐制品中经常出现介稳态晶相。 3. SiCb具有很高的熔点,硅酸盐玻璃的熔制温度也很高。现要选择一种氧化物与SiO?在800°C的低温下形成均一的二元氧化物玻璃,请问,选何种氧化物?加入量是多少? 解:根据Na2O-SiO2系统相图可知最低共峪点为799C。故选择Na2O能与SiO?在800C的低温下形成均—的二元氧化物玻璃。 4. 具有不一致熔融二元化合物的二元相图(图10-12 (c))在低共熔点E发生如卜?析晶过程:L=A+C, 已知E点的B含量为20%,化合物C的B含量为64%。今有G,C?两种配料,己知G中B含量是C?中B含量的1.5倍,且在高温熔融冷却析晶时,从该二配料中析出的初相(即达到低共熔温度前析出的第一种晶体)含量相等。请计算C” C2的组成。

C++友元习题

01.分析以下程序的执行结果 02.#include<> 03.class Sample 04.{ 05.int n; 06.public: 07.Sample(int i){n=i;} 08.friend int add(Sample &s1,Sample &s2); 09.}; 10.int add(Sample &s1,Sample &s2) 11.{ 12.return +; 13.} 14.void main() 15.{ 16.Sample s1(10),s2(20); 17.cout< 30.class B; 31.class A 32.{ 33.int i; 34.public: 35.int set(B&); 36.int get(){return i;} 37.A(int x){i=x;} 38.}; 39.class B 40.{ 41.int i; 42.public: 43.B(int x){i=x;} 44.friend A;

45.}; 46.int A::set(B &b) 一个学生类student,包括学生姓名、成绩,设计一个友元函数,比较两个学生成绩的 高低,并求出最高分和最低分的学生。 47.解: 48.#include<> 49.#include<> 50.class student 51.{ 52.char name[10]; 53.int deg; 54.public: 55.student(char na[],int d) 56.{ 57.strcpy(name,na); 58.deg=d; 59.} 60.char *getname(){ return name;} 61.friend int compare(student &s1,student &s2) 62.{ 63.if> 64.return 1; 65.else if== 66.return 0; 67.else return -1; 68.} 69.}; 70.void main() 71.{ 72.student st[]={student("王华",78),student("李明",92),student("张伟",62),student("孙强",88)}; 73.int i,min=0,max=0; 74.for(i=1;i<4;i++) 75.{ 76.if(compare(st[max],st[i])==-1) 77.max=i; 78.else if(compare(st[i],st[min])==1) 79.min=i; 80.} 81.cout<<"输出结果:"<

相关文档
最新文档