类的封装性

类的封装性
类的封装性

C++讲稿

1.输入、输出语句

输出语句

例输出10、16、8进制整数

//ex2_8.cpp

#include "iostream.h"

#include "iomanip.h"

void main()

{

int a=1508;

cout<

cout<

cout<

}

运行结果是:

Decimal :1508

Hexadecimal :5e4

Octal :2744

表2.5 I/O流的常用控制符

例2.8从键盘输入三个实数,求其中的最大值,输出时要求10个有效位数。

//ex2_10.cpp

#include "iostream.h"

#include "iomanip.h"

void main()

{

double a,b,c;

cin>>a>>b>>c;

double d=a>b?a:b;

double e=c>d?c:d;

cout<<"max="<

}

运行结果是:

456.78476 23784.657648 99.5↓

max=23784.65765

2.函数重载

函数重载

同一个函数名可以用于多个函数的定义,即用于多个函数的实现,称函数重载。函数的函数名相同,它们的差别就在于参数的类型或个数不相同。编译系统能够唯一地确定调用哪个函数,就利用调用时所传递的实参类型和个数,以及它们的顺序是否跟该函数的定义和说明一致。因此实现同名函数重载,一定要在函数定义时函数参数的类型和个数或顺序上有所不同,否则实现不了同名函数的重载。

例函数重载举例

//ex5_4.cpp

#include "iostream.h"

int max(int,int);

int max(int,int,int);

double max(double,double);

double max(double,double,double);

void main()

{

cout<<"maxi2="<

cout<<"maxi3="<

cout<<"maxd2="<

cout<<"maxd3="<

}

int max(int x,int y)

{

return x>y? x:y;

}

int max(int x,int y,int z)

{

int c=max(x,y);

return z>c? z:c;

}

double max(double x,double y)

{

if(x>y)

return x;

else

return y;

}

double max(double x,double y,double z)

{

double c=max(x,y);

double d=max(c,z);

return d;

}

运行结果:

maxi2=6

maxi3=7

maxd2=6.3

maxd3=7.8

以上例题可见,4个函数的函数名都是max,但形参的类型和个数不同,编译系统根据实参的类型和个数可以区分出要调用的是哪个函数。

函数参数的默认值

调用函数时,若所用的实参有一个经常用的值,此时说明函数原型时,可以用该值作为函数参数的默认值,凡给过默认值的参数,在调用时可以给实参,也可以不给实参(此时实参为默认值)。下例是个延时函数,调用时给实参按实参延时,不给实参按默认值延时。

例函数默认值举例

//ex5_5.cpp

#include "iostream.h"

void delay(int t)

{

if(t==0)

return;

for(int i=0;i

cout<<"i="<

}

void main()

{

void delay(int=1000); // 声明默认值参数

delay(0);

delay(50);

delay(500);

delay();

delay(5000);

}

运行结果:

i=50

i=500

i=1000 (默认值参数得到的结果)

i=5000

如果函数参数有多个,可以全部声明为默认参数,也可以只有部分参数声明为默认值。部分参数有默认值时,默认参数应从右至左逐个给出。若有三个函数参数的add()函数,默认值有如下声明:

int add(int=5,int=7,int=8); // 正确,全部参数声明为默认值

int add(int,int=7,int=8); // 正确,两个参数声明为默认值

int add(int,int,int=8); // 正确,一个参数声明为默认值

int add(int=5,int=7,int);// 错,违背了自右至左逐个给出的原则

int add(int,int=7,int); // 错,违背了自右至左逐个给出的原则

注意,带有默认参数的重载函数,可能会引起调用的歧义性,如有一组重载函数的原型说明如下:

int fu(int);

int fu(int, int=8);

int fu(int, int=8,int=9);

则调用时若用表达式fu(12),编译系统就区分不出调用上面三个函数中的哪一个,因此在声明函数参数默认值时,应避免这种情况的发生,上面这样的重载函数,不声明默认值时,它们的重载仍然有效。

3.类

类的成员有二种,数据成员和成员函数,数据成员又称为属性,成员函数又称为方法、操作或实现。通常成员函数是处理数据成员的,如果成员函数与数据成员毫无关系,那么该成员函数就没有存在的必要了。类的定义格式一般分成二部分,一部分是说名部分,说明类中的数据成员和成员函数,另一部分是实现部分,就是定义成员函数。说明部分表明了该类有什么功能,实现部分是实现这些功能的详细过程,用户通常只关心说明部分,以便知道如何来使用该类的功能。

类的一般定义格式如下:

(1)说明部分

class 类名

{

public:

数据成员和成员函数

private:

数据成员和成员函数

protected:

数据成员和成员函数

};

(2)成员函数的实现部分

简单复数运算类示例

//ex7_1.h

#include "iostream.h"

#include "math.h"

//类的说明部分

class CComplex

{

private:

double real;

double imag;

public:

void Init(double r,double i);

double GetReal();

double GetImag();

double GetAbs();

};

//类的实现部分

void CComplex::Init(double r,double i)

{

real=r;

imag=i;

}

inline double CComplex::GetReal()

{

return real;

}

inline double CComplex::GetImag()

{

return imag;

}

double CComplex::GetAbs()

{

double t;

t=real*real+imag*imag;

return sqrt(t);

}

4.对象

类是一种抽象的数据类型,编译系统并不为之分配可供使用的内存,用户只能使用类的“变量”。这好比C语言中的结构体,实际应用中只能使用结构体的变量而不能直接使用结构体类型一样。由类定义的“变量”通常称为“对象”或“实例”。属于同一类的对象,具有相同的属性和方法,属于不同类的对象,一般是不会具有完全相同的属性和方法。由类定义对象的方法与由结构体定义变量的方法极其相似。通常有二种方法定义对象。

(1)在声明类的同时,直接定义对象,格式为:

class 类名

{

声明类的成员

}对象名;

(2)声明类以后,在使用对象前定义,这时可以省略关键字class直接使用类名,格式为:类名对象名;

对象的使用

例7.2写出程序的运行结果

//ex7_2.cpp

#include "ex7_1.h"

void main()

{

CComplex A,*PA=&A;

A.Init(1.5,2.4);

cout<<"real of complex A="<GetReal()<

cout<<"image of complex A="<GetImag()<

cout<<"Abs of complex A="<GetAbs()<

}

程序运行结果为:

real of complex A=1.5 1.5

image of complex A=2.4 2.4

Abs of complex A=2.83019 2.83019

例7.3指出下面程序中的语法错误。

//ex7_3.cpp

#include "iostream.h"

#include "math.h"

class CPoint

{

int x;

int y;

public:

void SetX(int k){x=k;}

void SetY(int k){y=k;}

int GetX(){return x;}

int GetY(){return y;}

};

void main()

{

CPoint p1,p2;

p1.x=5; //错误:p1.x是私有成员.改用p1.SetX(5);

p1.y=10; //错误:p1.y是私有成员改用p1.SetY(10);

p2.SetX(15);

p2.SetY(20);

double d1=p1.x*p1.x+p1.y*p1.y;//错误:p1.x和p1.y 是私有成员改用:

//double d1=p1.GetX()*p1.GetX()+p1.GetY()*p1.GetY();

d1=sqrt(d1);

double d2=p2.GetX()*p2.GetX()+p2.GetY()*p2.GetY();

d2=sqrt(d2);

cout<<"p1到原点的距离为"<

cout<<"p2到原点的距离为"<

}

5.构造函数

定义

类是一种用户自定义的数据类型,它可能很简单,也可能很复杂。类定义一个对象时,编译系统将为对象分配内存,并进行必要的初始化工作。对象的初始化是由构造函数完成的,构造函数是类的成员函数,如果用户不定义构造函数,系统会自动生成一个缺省的构造函数。当对象的初始化较为复杂时,用户应该自定义构造函数。

构造函数是类的一个特殊的成员函数,它有如下一些特点:

(1)构造函数的名字必须和类的名字相同

(2)构造函数无类型说明,它不能有返回值,在构造函数内不能有return语句,构造函数可以被重载。

(3)在定义类时若没有定义构造函数,编译系统会在内部自动生成一个不带参数的缺省构造函数,其格式如下:

类名::缺省构造函数名(){ }

(4)创建对象时,系统自动调用构造函数,一般不要在程序中显式调用构造函数。

例7.6 设计一个计时器,其初始化值可以是秒数,或分钟数和秒数,或小时数、分钟数和秒数,若无初始化值,缺省值取为0,输出为秒数。

//ex7_6.cpp

class CTimer

{

int seconds;

public:

CTimer(){seconds=0;}

CTimer(int i){seconds=i;}

CTimer(int i,int j){seconds=i*60+j;}

CTimer(int i,int j,int k){seconds=(i*60+j)*60+k;}

int GetTimer(){return seconds;}

};

#include "iostream.h"

void main()

{

CTimer t1,t2(30),t3(1,5),t4(1,20,6);

cout<<"t1: "<

cout<<"t2: "<

cout<<"t3: "<

cout<<"t4: "<

}

程序运行结果为:

t1:0

t2:30

t3:65

t4:4806

程序中采用重载构造函数的方法来适应各种形式的初始化。如果使用带缺省值参数的构造函数,则构造函数CTimer(){seconds=0;}和CTimer(int i){seconds=i;}可以合并写成:CTimer(int i=0) {seconds=i;}

需要注意的是重载没有参数和带缺省参数的构造函数时,有可能产生二义性。例如上例中若重载的构造函数写成:

CTimer( ) { } //不带参数的构造函数

CTimer(int i=0) {seconds=i;} //带缺省参数的构造函数

在定义以下对象时将发生语法错误。

CTimer t1; //存在二义性

由于在定义对象t1时系统将自动调用构造函数,这时系统将不能判断是调用构造函数CTimer()还是调用构造函数CTimer(int i=0)因而发生二义性错误。

6.析构函数

析构函数的功能是在释放对象之前做一些必要的清理工作。它的功能和构造函数相反,构造函数是在创建对象时做初始化工作,而析构函数是在删除或释放对象前做好清理准备工作,使对象所占的内存能正常地释放交还给系统。

析构函数是类的成员函数,它有以下几个特点:

(1)析构函数名是由“~”加上类名组成

(2)析构函数无类型说明,也没有参数,析构函数不可以重载

(3)如果在类中没有显式定义析构函数,编译系统会提供一个缺省的析构函数。其格式如下:

类名::~缺省析构函数名(){ }

(4)释放对象时,系统自动调用析构函数

例7-9写出程序运行结果.。

//ex7_9.cpp

#include "iostream.h"

class CDate

{

int year;

int month;

int day;

public:

CDate(int y,int m,int d)

{

year=y;

month=m;

day=d;

cout<<"Constructor called.\n";

}

~CDate() {cout<<"Destructor called.\n";}

void Print(){cout<

};

void main()

{

CDate today(2000,9,1),tomorrow(2000,9,2);

cout<<"Today is:";

today.Print();

cout<<"Tomorrow will be:";

tomorrow.Print();

}

程序运行结果为:

Constructor called.

Constructor called.

Today is: 2000.9.1

Tomorrow will be: 2000.9.2

Destructor called.

Destructor called.

该程序中定义二个对象today和tomorrow,在创建对象时系统自动调用构造函数,对对象的数据成员进行初始化,同时执行了构造函数中的输出语句。因而程序运行结果开始输出二个字符串“Constructor called”,中间二行是程序中的输出语句所致,程序执行完毕,在释放对象之前将自动调用析构函数,由于要释放二个对象,因而将分别调用它们的析构函数,从而构成了最后二句“Destructor called.”的输出。

7.对象初始化

本节通过一些具体例子,说明在对象初始化时要注意的问题,这些问题通常不被人们重视,但它们经常会导致理解上的错误,有时会导致语法错误。本节所举的例题主要想说明以下几点:

(1)对象可以作为类的成员,这时在构造函数中必须对对象成员进行初始化。

(2)有关显式调用构造函数的说明。

(3)在定义对象数组时,通常要存在一个无参数的构造函数或者存在一个所有参数带缺省值的构造函数。

(4)使用运算符new和delete处理对象时,编译系统会自动调用构造函数和析构函数。(5)单参数的构造函数具有类型转换功能。

例7.10对象作为类的成员示例

//ex7_10.cpp

#include "iostream.h"

class CMemberObject

{

int x;

public:

CMemberObject(int i){x=i;}

void Print()

{

cout<<"Member of class CMemberObject="<

}

};

class CContainer

{

int y;

CMemberObject X,R;

public:

CContainer(int i);

void Print()

{

cout<<"Member of class CContainer="<

}

void PrintX()

{

X.CMemberObject::Print(); //X.Print();

}

void PrintR()

{

R.CMemberObject::Print(); //R.Print();

}

};

CContainer::CContainer(int i):X(101),R(-55){y=i;}

void main()

{

CContainer A(72);

A.Print();

A.PrintX();

A.PrintR();

}

运行程序结果为:

Member of class CContainer=72

Member of class CMemberObject=101

Member of class CMemberObject=-55

在类的定义中,把另一个已定义的类的对象作为成员是常有的事,例如在本例中,类CMemberObject的对象X和R是类CContainer的成员。程序必须对内部对象成员进行初始化,初始化的工作在类的构造函数中进行。类CContainer的构造函数为:CContainer::CContainer(int i):X(101),R(-55)

{y=i;}

构造函数中的冒号“:”把构造函数名与其实现部分分开,冒号之后增加的部分称作为初始化表,对象成员的初始化在初始化表中进行,各个对象成员的初始化用逗号“,”分开,它们的次序可以是任意的。在例题中也可把数据成员y的初始化放入初始化表中,结果是一样的,这时构造函数变成:

CContainer::CContainer(int 0):x(101), R(-55) y(i){ }

例题中在使用对象成员的输出函数时,表达的方式如下:

X.CMemberObject::Print( );

类名CMemberObject作为成员函数Print()的限定符,这仅为了强调成员函数Print()是属于类CMemberObject而不是属于类CContainer,在例题中该语句也可写成X.Print( );

程序运行结果是一样的。

例7.11显式调用构造函数示例

//ex7_11.cpp

#include "iostream.h"

#include "string.h"

class CStudent

{

int num;

char name[20];

double average;

public:

CStudent(){cout<<"Constructor1 called.\n";}

CStudent(int n,char* p,double a)

{

num=n;

strcpy(name,p);

average=a;

cout<<"Constructor2 called.\n";

}

~CStudent(){ cout<<"Destructor called.\n";}

void Print(){cout<

};

void main()

{

CStudent S1(1220,"LiMing",82.5),S2;

S2=CStudent(1221,"Fang",89.1);

S1.Print();

S2.Print();

}

程序运行结果为:

Constructor2 called.

Constructor1 called.

Constructor2 called.

Destructor called.

1220, LiMing, 82.5

1221, Fang, 89.1

Destructor called.

Destructor called.

程序中定义了对象S1和S2,编译系统将二次调用构造函数和析构函数。由程序运行结果可知,程序在运行中,实际上是三次调用了构造函数和析构函数,多一次调用构造函数和析构函数是由赋值语句

S2=Student(1221,”Fang”,85.1);

引起的。从形式上看S2的值好象是等于构造函数的返回值,事实并非如此,因为构造函数中既无return语句,也无返回值。实际上该赋值语句显式调用了构造函数,这将产生一个临时对象。临时对象的生存期一般都很短暂,当赋值语句执行后,临时对象就消失了。与一般对象一样,在创建临时对象时将调用构造函数,在撤消临时对象前将调用析构函数。所以本例运行结果中的第三、四句就是由临时对象的建立和撤消所产生的。

如果把例7-11中的主程序改成如下:

void main()

{

CStudent S1(1220,"LiMing",82.5);

CStudent S2=CStudent(1221,"Fang",89.1);

S1.Print();

S2.Print();

}

这时的运行结果与原先相比少了第三、四句,其原因是语句

Student S2=CStudent(1221, “Fang”, 89.1);

定义了对象S2,虽然显式调用了构造函数进行初始化,但不是进行赋值运算,因而没有产生临时对象,所以在运行结果中比原先少调用了一次构造函数和析构函数。实际上语句CStudent S2=Cstudent(1221, “Fang”, 89.1);

与语句

CStudent S2(221, “Fang”, 89.1);

除了书写形式不同外,本质上是一样的,这是C++中初始化的两种不同写法。

例7.12对象数组的使用示例

//ex7_12.h

#include "iostream.h"

#include "string.h"

class CTeacher

{

int num;

char name[20];

double pay;

public:

CTeacher(){cout<<"Constructor1 called.\n";}

CTeacher(int n,char* m,double p)

{

num=n;

strcpy(name,m);

pay=p;

cout<<"Constructor2 called.\n";

}

~CTeacher(){ cout<<"Destructor called.\n";}

void Print(){cout<

};

//ex7_12.cpp

#include "Ex7_12.h"

void main()

{

CTeacher T1[2];

CTeacher T2[2]={CTeacher(416,"Wang",1248.9),CTeacher(418,"Cheng",2245.7)};

T1[0]=CTeacher(421,"Wu",1921.5);

T1[1]=CTeacher(425,"Zhou",1764.9);

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

{

T1[i].Print();

T2[i].Print();

}

}

程序运行结果为:

Constructor1 called.

Constructor1 called.

Constructor2 called.

Constructor2 called.

Constructor2 called.

Destructor called.

Constructor2 called.

Destructor called.

421, Wu, 1921.5

416, Wang, 1248.9

425, Zhou, 1764.9

418, Cheng, 2245.7

Destructor called.

Destructor called.

Destructor called.

Destructor called.

程序中定义了二个对象数组,T1和T2,对象数组T1未给初始化值,以后再对数组成员赋值,对象数组T2通过调用构造函数使之初始化。在定义对象数组时,每个数组成员都将调用构造函数,这就是程序运行结果的前四句。数组T1经显式调用构造函数给数组成员赋值,这时将产生临时对象,赋值完毕,临时对象撤消之前将调用析构造函数,从而产生了程序运行结果中的第5到第8句输出语句。程序结束前所有对象数组成员都将撤消,编译系统将自动调用析构函数,从而产生程序运行结果中的最后四句。

如果在程序中,省略类的无参数构造函数,将会引起语法错误,原因是如果类中已有构造函数存在,系统不再提供缺省的无参构造函数,不带初始化值的对象数组T1将无法调用带参数构造函数。通常对于存在对象数组的类,总要要定义一个无参数或带缺省参数的构造函数,确保定义对象数组时不会发生语法错误。

例7.13运算符new和delete使用示例。

//ex7_13.cpp

#include "ex7_12.h"

void main()

{

CTeacher *p,*q;

p=new CTeacher[3];

q=new CTeacher(425,"Zhou",1764.9);

*p=CTeacher(416,"Wang",1248.9);

*(p+1)=CTeacher(418,"Cheng",2245.7);

*(p+2)=CTeacher(421,"Wu",1921.5);

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

(p+i)->Print();

q->Print();

delete [] p;

delete q;

}

程序运行结果为:

Constructor1 called.

Constructor1 called.

Constructor1 called.

Constructor2 called.

Constructor2 called.

Destructor called.

Constructor2 called.

Destructor called.

Constructor2 called.

416, Wang, 1248.9

418, Cheng, 2245.7

421, Wu, 1921.5

425, Zhou, 1764.9

Destructor called.

Destructor called.

Destructor called.

Destructor called.

在程序中使用运算符new动态分配对象内存时,系统将自动调用构造函数,在使用运算符delete删除由new分配的对象内存时,系统将自动调用析构函数。本例题中使用new动态分配了一个对象数组和一个对象,共计动态分配了4个对象内存,因而将4次调用构造函数,同样在调用delete释放这些对象时,又将4次调用析构函数,从而形成输出结果中的前4句和最后4句。程序中3次显式调用构造函数对对象数组成员赋值,这将使系统3次建立临时对象,每次临时对象创建和撤消都将调用构造函数和析构函数,由于连续3次创建和撤消临时对象,程序执行时将连续三次调用构造函数和析构函数,这样在输出结果中将多了三组语句:

Constructor2 called.

Destructor called.

若在初始化时显式调用构造函数,将不会创建临时对象,因而也就不会调用析构函数了,这就是语句

q=new CTeacher(425, “Zhou”, 1764.9);

不会调用析构函数的原因。

例7.14 构造函数作数据类型转换示例。

//ex7_14.cpp

#include "iostream.h"

class CExample

{

double m;

public:

CExample(double i=0)

{

m=i;

cout<<"Constructor called.\n";

}

~CExample(){ cout<<"Destructor called.\n";}

void Print(){cout<<"m="<

};

void main()

{

CExample X(20);

X=15; //X=CExample(15);

X.Print();

}

程序运行结果为:

Constructor called.

Destructor called.

m=15

Destructor called.

主程序中语句

X=15;

有点特殊,等式左边是一个CExample的对象,等式右边是一个整数,若要把一个整数强制转换成同类对象,一般要使用类型强制转换函数,它是类的成员函数,其一般格式及使用方法见第9章。例7.14中由于存在单个参数的构造函数,因而该类提供一种将其它数据类型的数值或变量转换成该类对象的方法。例题中数据类型的转换过程如下:整型数15首先转换成双精度型数15.0,进而显式调用构造函数,产生临时对象完成赋值运算,使对象X的数据成员的值为15.0。由输出结果可以看到,对象X的数据成员X.m的值确实是15,在输出结果中有两组调用构造函数和析构函数的输出,其中一组是由定义对象X引起的,另一组是由于临时对象的创建和撤消引起的。

本节通过一些具体例子说明由于类这一数据结构的引入,在初始化方面引起许多新问题。在定义对象时要调用构造函数,撤消对象时要调用析构函数,编译系统将提供缺省的构造函数和析构函数。在简单情况下,用户使用缺省的构造函数和析构函数是不会有问题的,如果在较复杂的情况下,用户通常必须自定义构造函数、拷贝构造函数和析构函数或者重载构造函数,以免出错。

8.类和对象的进一步用法

this指针、静态成员、友元

1)this指针

类可以定义很多对象,当对象使用类中的成员时,编译系统必须分清类的成员正在被哪一个对象使用,这主要靠this指针。this指针是一种特殊的指针,它隐含于每一个类的成员函数中(静态函数除外),调用对象成员函数前,编译系统就把该对象地址赋给this指针,使this指针指向该对象,然后开始调用成员函数,并使用隐含的this指针。this指针也可以被显式调用,但很少这样使用。可以用下面三句话来理解this指针:this指针是一个指向对象的指针。

this指针是一个隐含于成员函数中的对象指针。

this指针是一个指向正在调用成员函数的对象的指针。

例7.15分析程序中this指针的作用

//ex7_15.cpp

#include "iostream.h"

class CPoint

{

int x,y;

public:

CPoint(int i=0,int j=0)

{

x=i; //this->x=i;

y=j; //this->y=j;

}

void Init(CPoint& k)

{

if(this==&k) return;

*this=k;

}

void Print(){cout<

};

void main()

{

CPoint a(5,8),b(12,56),c;

c.Init(b);

a.Print();

b.Print();

c.Print();

}

程序运行结果为:

5,8

12,56

12,56

程序中有二处出现this指针,它们都在成员函数Init( )中,函数Init( )的功能是用已知对象给另一对象赋值,显然已知对象对自身赋值是多余的,函数中的语句if(this==&k) return;

就是为了防止自身赋值而设置的。现在分析该语句的工作过程。由主函数中语句"c.Init(b);"知,成员函数Init( )是由对象c调用的,因而函数Init( )具有的this指针指向对象c,则this的值为&c,k是函数参数,函数实参为b,因而&k的值为&b,显然表达式this==&k不成立,程序执行赋值语句"*this=k;"。该语句的功能是把对象k中的成员值赋给this指针指向的对象,而k是对象b的引用,因而实现了对象b给对象c的赋值功能,程序运行结果也说明了这点。另外在程序中多处应用了隐含的this指针,例如构造函数为:CPoint(int i=0, int j=0)

{x=i; y=5;}

实际上构造函数已经使用了隐含的this指针,如果显式写出this指针,构造函数为:CPoint(int i=0, int j=0)

{this->x=i; this->y=j;}

由于this指针的功能,使各个对象可以正确调用类中的成员函数和数据成员。如果把例题中的构造函数的参数i和j改用x和y,就必须显式使用this指针,以免差错,修改后的构造函数如下:

CPoint(int x=0, int y=0)

{this->x=x; this->y=y;}

如果省略了this指针,编译系统将无法区分x、y是类的成员变量还是函数的参数,从而无法执行正确的操作了。

2)静态成员

在定义类的成员时,若使用了关键字static,该成员称为静态成员。其定义格式为:static 成员(变量或函数);

静态成员最主要的特征是该成员属于类的全体对象,而不仅仅是归属于某一特定对象。静态成员在类的对象间是共享的,编译系统在定义类的第一个对象时为静态成员分配内存,以后

定义对象时不再为静态成员分配内存了,因而所有的对象共享静态成员。静态成员可以是数据成员也可以是成员函数,它们都有一些各自的特点,简述如下:

(1)静态数据成员

静态数据成员是属于类或类的对象全体,它不为某个对象所独享。假定类CWithStatic 是一个带有静态数据成员的类,静态数据成员为count,下面的程序段将说明静态数据成员的特点。

class CWithStatic

{

int k;

static int count;

……

};

int SWithStatic::Count=0;

void main( )

{

CWithStatic a(8),b[3];

……

}

图7.3说明了静态数据成员count被

定义的对象a和对象数组b所共享,实际

上不管定义了多少个对象,每个对象的静

态数据成员都使用一个共用的内存。从上

面的程序段还可以看到,静态数据成员的

图7.3对象共享静态数据成员

初始化在类的外部进行,其语句为:

int CWithStatic::Count=0;

注意在类外初始化静态数据成员时,不必再加上关键字static。使用静态数据成员应该注意以下二点:

1)静态数据成员属于类或属于对象全体,其表达式可用

类名::静态数据成员

或对象名.静态数据成员

建议读者使用前者,如果使用后者,容易造成一种错觉,使人误以为静态数据成员是属于某个对象的。

2)静态数据成员的初始化在类外进行。

例7.16分析程序中静态数据成员的作用

//ex7_16.cpp

#include "iostream.h"

class CWithStatic

{

public:

int k;

static int count;

CWithStatic(int i=0){k=i; count++;}

~CWithStatic(){count--;}

};

int CWithStatic::count=0;

void main()

{

CWithStatic a(8),b[3];

b[0]=7;

b[1]=9;

b[2]=11;

cout<<"a.k:"<

cout<<"a.count: "<

cout<<"b[0].k: "<

cout<<"b[0].count: "<

cout<<"b[1].k: "<

cout<<"b[1].count: "<

cout<<"b[2].k: "<

cout<<"b[2].count: "<

cout<<"CWithStatic::count: "<

}

程序运行结果为:

A.k: 8

A.count: 4

b[0].k: 7

b[0].count: 4

b[1].k: 9

b[1].count: 4

b[2].k: 11

b[2].count: 4

CWithStatic::count: 4

从运行结果可以看到静态数据成员count属于类,由于各个对象的数据成员count共用一个内存,它们的数值应该是一样的,均为4。建议使用形式CWithStatic::count,使人一目了然地知道count是属于类的静态变量。静态数据成员count作用是统计类CWithStatic的对象数目,在程序中使用了对象a和对象数组b,共计定义了4个对象,所以count值为4。仔细分析程序可以发现在给对象数组各元素赋值时,曾使用过3个临时对象,程序执行过程中实际上使用过7个对象,由于临时对象在赋值语句结束后就被撤消,程序中3次隐含调用析构函数,因而count的值为4,而不是7。如果删除程序中的析构函数,再次运行程序,可以发现count的值将是7。由程序还可以看到,静态数据成员在类外进行初始化,不要试图在类中定义静态变量时对其赋初值,这样将产生语法错误,因为编译系统是不给类分配内存的。

由于静态成员是属于对象全体的,因而静态成员函数亦是属于类的,而不是属于某个特定的对象,由此可推知静态函数不具有this指针。由于静态函数没有this指针,通常它只访问属于全体对象的成员——静态成员,也可以访问全局变量。静态函数若访问非静态成员,必须指明其所属的对象,这样既麻烦,又无多大的实际意义,因而一般情况下,静态函数不访问类的非静态成员,因为这些成员是属于特定对象的。归结起来使用静态函数要注意以下两点:

1)静态成员函数属于类,它的表示形式为:

类名::成员函数

或对象名.成员函数

与数据成员一样,建议使用前一种表示形式。

2)静态成员函数没有this指针,因而它不能直接访问非静态成员,通常静态成员函

数只访问静态成员(数据和函数)或全局变量。

3)友元

常见芯片封装类型的汇总

常见芯片封装类型的汇总 芯片封装,简单点来讲就是把制造厂生产出来的集成电路裸片放到一块起承载作用的基板上,再把管脚引出来,然后固定包装成为一个整体。它可以起到保护芯片的作用,相当于是芯片的外壳,不仅能固定、密封芯片,还能增强其电热性能。所以,封装对CPU和其他大规模集成电路起着非常重要的作用。 今天,与非网小编来介绍一下几种常见的芯片封装类型。 DIP双列直插式 DIP是指采用双列直插形式封装的集成电路芯片,绝大多数中小规模集成电路均采用这种封装形式,其引脚数一般不超过100个。采用DIP封装的CPU芯片有两排引脚,需要插入到具有DIP结构的芯片插座上。当然,也可以直接插在有相同焊孔数和几何排列的电路板上进行焊接。DIP封装的芯片在从芯片插座上插拔时应特别小心,以免损坏引脚。DIP封装结构形式有多层陶瓷双列直插式DIP,单层陶瓷双列直插式DIP,引线框架式DIP (含玻璃陶瓷封接式,塑料包封结构式,陶瓷低熔玻璃封装式)等。 DIP是最普及的插装型封装,应用范围包括标准逻辑IC,存储器和微机电路等。 DIP封装 特点: 适合在PCB(印刷电路板)上穿孔焊接,操作方便。 芯片面积与封装面积之间的比值较大,故体积也较大。 最早的4004、8008、8086、8088等CPU都采用了DIP封装,通过其上的两排引脚可插到主板上的插槽或焊接在主板上。 在内存颗粒直接插在主板上的时代,DIP 封装形式曾经十分流行。DIP还有一种派生方式SDIP(Shrink DIP,紧缩双入线封装),它比DIP的针脚密度要高六倍。 现状:但是由于其封装面积和厚度都比较大,而且引脚在插拔过程中很容易被损坏,可靠性较差。同时这种封装方式由于受工艺的影响,引脚一般都不超过100个。随着CPU内

(完整版)√MOS器件及其集成电路的可靠性与失效分析

MOS 器件及其集成电路的可靠性与失效分析(提要) 作者:Xie M. X. (UESTC ,成都市) 影响MOS 器件及其集成电路可靠性的因素很多,有设计方面的,如材料、器件和工艺等的选取;有工艺方面的,如物理、化学等工艺的不稳定性;也有使用方面的,如电、热、机械等的应力和水汽等的侵入等。 从器件和工艺方面来考虑,影响MOS 集成电路可靠性的主要因素有三个:一是栅极氧化层性能退化;二是热电子效应;三是电极布线的退化。 由于器件和电路存在有一定失效的可能性,所以为了保证器件和电路能够正常工作一定的年限(例如,对于集成电路一般要求在10年以上),在出厂前就需要进行所谓可靠性评估,即事先预测出器件或者IC 的寿命或者失效率。 (1)可靠性评估: 对于各种元器件进行可靠性评估,实际上也就是根据检测到的元器件失效的数据来估算出元器件的有效使用寿命——能够正常工作的平均时间(MTTF ,mean time to failure )的一种处理过程。 因为对于元器件通过可靠性试验而获得的失效数据,往往遵从某种规律的分布,因此根据这些数据,由一定的分布规律出发,即可估算出MTTF 和失效率。 比较符合实际情况、使用最广泛的分布规律有两种,即对数正态分布和Weibull 分布。 ①对数正态分布: 若一个随机变量x 的对数服从正态分布,则该随机变量x 就服从对数正态分布;对数正态分布的概率密度函数为 222/)(ln 21)(σμπσ--?=x e x x f 该分布函数的形式如图1所示。 对数正态分布是对数为正态分布的任 意随机变量的概率分布;如果x 是正态分布 的随机变量,则exp(x)为对数分布;同样, 如果y 是对数正态分布,则log(y)为正态分 布。 ②Weibull 分布: 由于Weibull 分布是根据最弱环节模型 或串联模型得到的,能充分反映材料缺陷和 应力集中源对材料疲劳寿命的影响,而且具 有递增的失效率,所以,将它作为材料或零件的寿命分布模型或给定寿命下的疲劳强 度模型是合适的;而且尤其适用于机电类产品的磨损累计失效的分布形式。由于它可以根据失效概率密度来容易地推断出其分布参数,故被广泛地应用于各种寿命试验的数据处理。与对数正态分布相比,Weibull 分布具有更大的适用性。 Weibull 分布的失效概率密度函数为 m t m t m e t m t f )/()(ηη--?= 图1 对数正态分布

封装失效分析1

第二单元 集成电路芯片封装可靠性知识—郭小伟 (60学时) 第一章、可靠性试验 1.可靠性试验常用术语 试验名称 英文简称 常用试验条件 备注 温度循环 TCT (T/C ) -65℃~150℃, dwell15min, 100cycles 试验设备采用气冷的方式,此温度设置为设备的极限温度 高压蒸煮 PCT 121℃,100RH., 2ATM,96hrs 此试验也称为高压蒸汽,英文也称为autoclave 热冲击 TST (T/S ) -65℃~150℃, dwell15min, 50cycles 此试验原理与温度循环相同,但温度转换速率更快,所以比温度循环更严酷。 稳态湿热 THT 85℃,85%RH., 168hrs 此试验有时是需要加偏置电压的,一般为Vcb=0.7~0.8BVcbo,此时试验为THBT 。 易焊性 solderability 235℃,2±0.5s 此试验为槽焊法,试验后为10~40倍的显微镜下看管脚的 上锡面积。 耐焊接热 SHT 260℃,10±1s 模拟焊接过程对产品的影响。 电耐久 Burn in Vce=0.7Bvceo, Ic=P/Vce,168hrs 模拟产品的使用。(条件主要针 对三极管) 高温反偏 HTRB 125℃, Vcb=0.7~0.8BVcbo, 168hrs 主要对产品的PN 结进行考核。回流焊 IR reflow Peak temp.240℃ (225℃) 只针对SMD 产品进行考核,且 最多只能做三次。 高温贮存 HTSL 150℃,168hrs 产品的高温寿命考核。 超声波检测 SAT CSCAN,BSCAN,TSCAN 检测产品的内部离层、气泡、裂缝。但产品表面一定要平整。

集成电路封装考试答案

集成电路封装考试答案 https://www.360docs.net/doc/1e14779559.html,work Information Technology Company.2020YEAR

名词解释: 1.集成电路芯片封装: 利用膜技术及微细加工技术,将芯片及其他要素在框架或基板上布置、粘贴固定及连接,引用接线端子并通过可塑性绝缘介质灌装固定,构成整体立体结构的工艺。 2.芯片贴装: 3.是将IC芯片固定于封装基板或引脚架芯 片的承载座上的工艺过程。 4.芯片互联: 5.将芯片与电子封装外壳的I/O引线或基 板上的金属布线焊区相连接。 6.可焊接性: 指动态加热过程中,在基体表面得到一个洁净金属表面,从而使熔融焊料在基体表面形成良好润湿能力。 7.可润湿性: 8.指在焊盘的表面形成一个平坦、均匀 和连续的焊料涂敷层。 9.印制电路板: 10.为覆盖有单层或多层布线的高分子复 合材料基板。 11.气密性封装: 12.是指完全能够防止污染物(液体或固 体)的侵入和腐蚀的封装。 13.可靠性封装: 14.是对封装的可靠性相关参数的测试。 15.T/C测试: 16.即温度循环测试。17.T/S 测试: 18.测试封装体抗热冲击的能力。 19.TH测试: 20.是测试封装在高温潮湿环境下的耐久 性的实验。 21.PC测试: 22.是对封装体抵抗抗潮湿环境能力的测 试。 23.HTS测试: 24.是测试封装体长时间暴露在高温环境 下的耐久性实验。封装产品长时间放置在高温氮气炉中,然后测试它的电路通断情况。 25.Precon测试: 26.模拟包装、运输等过程,测试产品的 可靠性。 27.金线偏移: 28.集成电路元器件常常因为金线偏移量 过大造成相邻的金线相互接触从而产生短 路,造成元器件的缺陷。 29.再流焊: 30.先将微量的铅锡焊膏印刷或滴涂到印 制板的焊盘上,再将片式元器件贴放在印制板表面规定的位置上,最后将贴装好元器件分印制板放在再流焊设备的传送带上。

1-3-半导体封装件的可靠性评价方法

1-3-半导体封装件的可靠性评价方法

半导体封装件的可靠性评价方法 Lunasus 科技公司,佐土原宽 Lunasus 科技公司细川丰 本章将依据半导体封装件可靠性评价的基本考虑方法,以故障机理为基础的实验条件介绍,并根据韦布图来解说可靠性试验下的(产品)寿命推导方法。 封装件开发及材料变化过程中的可靠性评价方法 为实现半导体封装件功能和电气特性的提高,在推动多引脚化的同时,也要发展高密度封装化下的小型、薄型化。最近,搭载多个芯片的SiP(System in Package,系统级封装)和芯片尺寸(与封装尺寸)非常相近的CSP(Chip Size Package,芯片级封装)已开始量产,封装件的构造多种多样。另外,为达成封装件低成本化和环保的要求,采用规格更高的封装件材料的开发正在活跃起来。但封装件构造的复杂化和新型材料的使用不能对制造品质和可靠性造成影响。这里将对新型封装件的开发和材料改变下的可靠性评价方法进行解说。 最近的半导体封装件多数属于树脂灌封型,对半导体单体的可靠性评价包括,高温保存(或动作)实验,耐湿性实验以及温度循环实验。另外,对于有可能要进行表面装配的高密度封装器型,需考虑焊接装配过程中的热应力情况,因此焊锡耐热性实验也是不可缺少的。这些可靠性试验,是对半导体封装件在实际使用过程中所预想发生的各种故障进行短时间评价的加速性实验方法。接下来需要先确定半导

体所发生的各种故障的主要加速原因是什么后才能进行实验。例如,对于树脂封装件来讲,湿度(水分)是造成硅芯片上金属线路受到腐蚀(图1)的主要原因之一,而温度可以加快水分浸入封装件内的速度,所以高温、高湿下的实验才有效果。与此同时,在电压也是故障主因的场合,有必要进行高温、高湿下的通电实验。 如上所述,对于封装件相关的各种故障,通过对机理的解析,找出加速实验的主要因子,设定合适的可靠性实验条件,这些就是可靠性评价的基础。 针对封装件构造的可靠性试验 正如开头所述,为实现封装件的高功能、高密度化,封装件的外观形状的主流是QFP(Quad Flat Package,四面扁平封装)和BGA

名词解释

2、对象:是由数据字段(变量)及相关方法所组成的软件包(software bundle) 3、封装:OOP将数据成员(Data Member)和属于此数据的操作方法(operating method),都放在同一个实体(entity)或称对象(object)中,这就是所谓的封装。 4、类:一个类就是一个蓝图或原型,定义了通用于一特定种类的所有对象之变量及方法。 5、多态:在同一个类中可有许多同名的方法,但其参数数量与类型(type)不同,而且运作(operation)过程与回传值(return value)也可能会不同,这种情况称为多态。 6、方法重载:是指调用一个类中具有同名异式方法,但在执行时期(run-time)才根据其参数数量与类型来判断要调用此方法的哪一种operation。 7、包是一种将相关类及接口组织起来的集合体。目的是为了类及接口名称的管理与存取保护。 8、实际参数:等到方法真正要被调用时,才被变量或其他数据所取代,而这些被称为实际参数(actual parameters)。 10、方法覆盖:是Java中解决多态问题的一种方法,是指在继承父类的子类中用与父类同样的方法名,对父类的方法体进行改写。 11、接口:是Java为解决多重继承问题所产生的。接口没有实例。接口内的方法全部是抽象的,可以不加abstract。接口内的字段必须用static与final来修饰。 14、静态成员类:指在一类中被定义且用static修饰的类。 17、匿名类:指没有名称的局部类,常用于事件处理时。 18、构造函数:是一种特殊的方法,其特点是方法名和所在的类名相同,作用是对对象内容做一些初值设置,构造函数可以重载,当New一个类要产生实例时,构造函数被执行。 23、变量:是指一个存储地址,而且有其相关类型。变量有:类变量、实例变量、局部变量、方法参数和构造函数参数,异常处理者参数、数组组件。 24、字段是加修饰符的变量。 25、修饰符:提供了对类、字段及方法的存取控制。 26、类字段:是用static修饰的字段。 27、类方法:是用static修饰的方法。 28、实例字段:是指不用static修饰的字段,可供实例方法使用。 29:实例方法:是指不用static修饰的方法,它可以使用类中所有的字段和方法。 30:静态初始者:是一种可在类加载时,做一些起始操作的一段程序区块,它是由static加上一组大括号所组成。 31:传值调用:若方法的参数之类型为原生类,称为传值调用。 32:传址调用:若方法的参数之类型为参考类,称为传址调用。

半导体器件封装的可靠性研究

无锡工艺职业技术学院电子信息工程系 毕业设计论文 半导体器件封装的可靠性研究 专业名称应用电子技术 学生姓名 学号 指导教师鲍小谷 毕业设计时间2010年2月20日~6月12日

半导体器件是经过衬底制备、外延、氧化、光刻、掺杂、封装等工序做出来的。但要保证做出的产品在正式生产后可以让顾客使用,且安全可靠、经久耐用,就必须在研究发展期间就将可靠度设计于产品质量中,因此试验的工作是不可少的。 试验是评估系统可靠度的一种方法,就是将成品或组件仿真实际使用环境或过应力的情况下予以试验,利用过程中失效之左证数据来评估可靠度。当然佐证资料越多,对所估计的可靠度信心也越大,可是人们又不希望采用大量样本来进行试验。若不做试验或做某种程度的试验,就根本不知道产品可靠的程度。 本文主要介绍了可靠性试验在半导体器件封装中是怎样使用的,从而来突出可靠性试验在封装中起着很重要的作用。 关键词:半导体器件;封装类型;可靠性;试验 Abstract Semiconductor substrate after the preparation, epitaxy, oxidation, lithography, doping, packaging and other processes done. However, to ensure that products made after the official production for customers to use, and safe, reliable, and durable, it is necessary to research and development in reliability during the design will be in product quality, and therefore the work of test is indispensable. Trial is to assess the system reliability of the method is that simulation will be finished products or components of the actual use of the environment or the circumstances have to be stress test, using the process of failure data to assess the reliability of proof. Of course, the more supporting information, the reliability of the estimate the greater the confidence, but people do not want to adopt a large number of samples tested. Do not test or do some degree of testing, simply do not know the extent of product reliability. This paper introduces the reliability test in semiconductor devices is how to use the package, and thus to highlight the reliability test in the package plays a very important role. Key words: Semiconductor devices; Package type; Reliability; Trial

名词解释题

第1章名词解释 1、软件开发工具:在高级程序设计语言(第三代语言)的基础上,为提高软件开发的质量和效率,从规划、分析、设计、测试、成文和管理各阶段,对软件开发者提供各种不同程度帮助(支持)的一类广泛的软件。 2、第一代语言:即机器语言,是用0、1组成的二进制字符串书写的程序,用纸带等光电设备或通过控制台上的扳键送入机器,得以存储和执行。 3、第四代语言(4GL):第四代语言的原意是非过程化的程序设计语言。针对以处理过程为中心的第三代语言,它希望通过某些标准处理过程的自动生成,使用户可以只要求做什么,而把具体的执行步骤的安排交给软件自动处理。 4、CASE工具:CASE工具指“计算机辅助软件工程”或“计算机辅助系统工程”,它的基本思想与软件开发工具完全一致,即应用计算机自身处理信息的巨大能力,帮助人们开发复杂的软件或应用系统。 5、所见即所得:“所见即所得”原则力图实现编程工作的可视化,即随时可以看到结果,程序的调整与后果的调整同步进行。 6、需求分析:从用户提出的初始要求出发,经过大量的调查研究,抽象出应用领域中实际的信息需求,设计出在计算机系统内外的、合理的信息流程,并规定软件的功能与性能要求,最后形成严格的、明确的、可供实际开发使用的“软件功能说明书”,这个阶段称为需求分析。 7、总体设计:根据软件功能说明书的要求,完成软件的总体设计,包括整个软件的结构设计、公用数据库文件或数据库的设计、各部分的连接方式及信息交换的标准等。 8、结构设计:所谓结构设计是把软件划分成若干个模块,指定每个模块的功能要求以及它们之间的相互关系。 9、模块测试:根据整体设计时制定的各个模块的设计任务书,对程序员完成的模块进行验收,看它们是否实现了所要求的功能和性能指标。 10、总体测试:每个模块都达到了设计任务书的要求后,还要测试整个系统是否达到了预期的目标,另外还要检查完成的软件与编写的文档是否一致,这个工作成为总体测试。 11、设计工具:设计工具是最具体的,它是指在实现阶段对人们提供帮助的工具,是最直接帮助人们编写与调试软件的工具。 12、分析工具:分析工具主要指用于支持需求分析的工具。它帮助人们认识与表述信息需求和信息流程,从逻辑上明确软件功能与要求。 13、计划工具:计划工具从宏观角度看待软件开发,它不仅从项目管理的角度帮助人们组织与实施项目,而且把有关进度、资源、质量、验收情况等信息管理起来,同时考虑到了项目的反复循环、版本更新,实现了“跨生命周期”的信息管理与共享,为信息和软件重用创造了条件。 14、工具的可靠程度:软件开发工具应具有足够的可靠性,即在各种各样的干扰下仍能保持正常工作,而不致丢失或弄错信息。 第2章名词解释 1、软件危机:指随着软件功能越来越多,规模越来越大,复杂性越来越高,引出一系列问题:软件产品交付拖延、错误多、不可靠、费用增大、不能适应应用变化等,因此怀疑大型软件的复杂性是否超越了人的处理能力。 2、水波效应:因修改程序带来的连带影响。当人们修改程序的某一处时,由于没有充分考虑到这一修改对相关部分带来的影响,结果出现了新的错误。 3、黑箱检验:输入一些信息,通过观察是否能得出预期输出来判断软件是否正确的一种软件测试方法。黑箱检验只能证明程序有错,而不能证明程序没错。 4、模块的凝聚性:模块的功能在逻辑上尽可能的单一化、明确化,最好做到模块与任务的一一对应,即每个模块完成一个任务,反之每一项任务仅由一个模块来完成。这也称为模块的凝聚性。 5、模块间的耦合(耦合性):模块之间的联系及相互影响称为耦合。 6、模块间逻辑耦合:如果模块间传递的是控制信号,则称模块间具有逻辑耦合。 7、(对象的)封装性:把对象的静态属性和相关操作作为一个整体,对外不必公开这些属性与操作。 8、(对象的)遗传性:对象所具有的性质,包括静态属性和动态操作,自然地成为其子类的性质,不必加以重复说明或规定。 9、即插即用程序设计:即插即用程序设计是一种软件开发方法,它的基本思想是用制造硬件的思路来生产软件。一部分人专门生产软件组件,一部分人设计整个软件结构,并且把软件组件插入这个结构,以便迅速完成大型软件的研制

1-3 半导体封装件的可靠性评价方法

半导体封装件的可靠性评价方法 Lunasus 科技公司,佐土原宽 Lunasus 科技公司细川丰 本章将依据半导体封装件可靠性评价的基本考虑方法,以故障机理为基础的实验条件介绍,并根据韦布图来解说可靠性试验下的(产品)寿命推导方法。 封装件开发及材料变化过程中的可靠性评价方法 为实现半导体封装件功能和电气特性的提高,在推动多引脚化的同时,也要发展高密度封装化下的小型、薄型化。最近,搭载多个芯片的SiP(System in Package,系统级封装)和芯片尺寸(与封装尺寸)非常相近的CSP(Chip Size Package,芯片级封装)已开始量产,封装件的构造多种多样。另外,为达成封装件低成本化和环保的要求,采用规格更高的封装件材料的开发正在活跃起来。但封装件构造的复杂化和新型材料的使用不能对制造品质和可靠性造成影响。这里将对新型封装件的开发和材料改变下的可靠性评价方法进行解说。 最近的半导体封装件多数属于树脂灌封型,对半导体单体的可靠性评价包括,高温保存(或动作)实验,耐湿性实验以及温度循环实验。另外,对于有可能要进行表面装配的高密度封装器型,需考虑焊接装配过程中的热应力情况,因此焊锡耐热性实验也是不可缺少的。这些可靠性试验,是对半导体封装件在实际使用过程中所预想发生的各种故障进行短时间评价的加速性实验方法。接下来需要先确定半导

体所发生的各种故障的主要加速原因是什么后才能进行实验。例如,对于树脂封装件来讲,湿度(水分)是造成硅芯片上金属线路受到腐蚀(图1)的主要原因之一,而温度可以加快水分浸入封装件内的速度,所以高温、高湿下的实验才有效果。与此同时,在电压也是故障主因的场合,有必要进行高温、高湿下的通电实验。 如上所述,对于封装件相关的各种故障,通过对机理的解析,找出加速实验的主要因子,设定合适的可靠性实验条件,这些就是可靠性评价的基础。 针对封装件构造的可靠性试验 正如开头所述,为实现封装件的高功能、高密度化,封装件的外观形状的主流是QFP(Quad Flat Package,四面扁平封装)和BGA(Ball

微电子封装必备答案

微电子封装答案 微电子封装 第一章绪论 1、微电子封装技术的发展特点是什么?发展趋势怎样?(P8、9页) 答:特点: (1)微电子封装向高密度和高I/O引脚数发展,引脚由四边引出向面阵排列发展。 (2)微电子封装向表面安装式封装发展,以适合表面安装技术。 (3)从陶瓷封装向塑料封装发展。 (4)从注重发展IC芯片向先发展后道封装再发展芯片转移。 发展趋势: (1)微电子封装具有的I/O引脚数将更多。 (2)微电子封装应具有更高的电性能和热性能。 (3)微电子封装将更轻、更薄、更小。 (4)微电子封装将更便于安装、使用和返修。 (5)微电子封装的可靠性会更高。 (6)微电子封装的性能价格比会更高,而成本却更低,达到物美价廉。 2、微电子封装可以分为哪三个层次(级别)?并简单说明其内容。(P15~18页)答:(1)一级微电子封装技术 把IC芯片封装起来,同时用芯片互连技术连接起来,成为电子元器件或组件。 (2)二级微电子封装技术 这一级封装技术实际上是组装。将上一级各种类型的电子元器件安装到基板上。 (3)三级微电子封装技术 由二级组装的各个插板安装在一个更大的母板上构成,是一种立体组装技术。 3、微电子封装有哪些功能?(P19页) 答:1、电源分配2、信号分配3、散热通道4、机械支撑5、环境保护 4、芯片粘接方法分为哪几类?粘接的介质有何不同(成分)?。(P12页) 答:(1)Au-Si合金共熔法(共晶型) 成分:芯片背面淀积Au层,基板上也要有金属化层(一般为Au或Pd-Ag)。 (2)Pb-Sn合金片焊接法(点锡型) 成分:芯片背面用Au层或Ni层均可,基板导体除Au、Pd-Ag外,也可用Cu (3)导电胶粘接法(点浆型) 成分:导电胶(含银而具有良好导热、导电性能的环氧树脂。) (4)有机树脂基粘接法(点胶型) 成分:有机树脂基(低应力且要必须去除α粒子) 5、简述共晶型芯片固晶机(粘片机)主要组成部分及其功能。 答:系统组成部分: 1 机械传动系统 2 运动控制系统 3 图像识别(PR)系统 4 气动/真空系统 5 温控系统 6、和共晶型相比,点浆型芯片固晶机(粘片机)在各组成部分及其功能的主要不同在哪里?答: 名词解释:取晶、固晶、焊线、塑封、冲筋、点胶

塑料封装可靠性问题浅析

塑料封装可靠性问题浅析 1、引言 塑料封装器件很容易由于多种原因而导致早期失效。这些缺陷产生的根源很多, 他们能够导致在塑封体各个部位产生一系列的失效模式和失效机理。缺陷的产生主要是由于原材料的不匹配、设计存在缺陷或者不完善的制造工艺。塑料封装器件同样也存在着非缺陷机理性失效, 比如PEM在空气中吸潮, 所吸收的潮气将会导致很多的问题出现, 包含在这一类失效中的就是所谓的磨损型失效机理。这些类型的失效在后面将会进行详细的论述。同时也将讨论避免产生缺陷的各种方法以及生产过程的优化和完善的设计。这些都是为了保证最后成品的质量和可靠性。 2、塑料封装器件的缺陷及其预防 有些缺陷很自然地归类于热机性能造成的, 而其他的缺陷通常和一些特殊的制成有关系, 比如芯片的制造、芯片的粘接、塑封、芯片的钝化、引线框架芯片基板的制造、焊丝或者后道成品包装。这些都将在下面的讨论中看到, 同时其中的某些缺陷在分类上还是相互交叉的。 2.1、热机缺陷 某些缺陷能够导致失效, 而这些缺陷都与热以及微观物质的移动有密切关系, 产生的主要原因就是环氧塑封料和不同接触界面材料的线膨胀系数不一致比如说, 当EMC固化时, 热收缩应力也随之产生这些应力将会导致巨大的拉伸和剪切应力, 作用于直接接触的芯片表面特别是在邑片的角部, 应力将会成几何级数增长, 很容易导致芯片薄膜钝化层或者芯片焊接材料以及, 芯片本身的破裂。这些应力同样也容易导致EMC和芯片/芯片基板/引线框架之间出现分层断裂以及分层将会导致电路断开、短路以及间歇性断路问题出现。同样它们也为潮气和污染源更容易进人塑封体内部提供了通路。 这些类型的缺陷可以通过以下措施来避免:在选择塑封料、引线框架、芯片焊接剂以及芯片钝化层的原材料时, 所有材料的线膨胀系数必须尽可能地相互匹配;芯片上部和下部塑封料的厚度应该尽可能地接近;尽量避免在设计和排版过程中出现边缘尖端以及尖角, 这样可以防止出现应力集中, 从而避免断裂的出现;最后, 提倡使用低应力塑封料以及低应力芯片焊接剂, 可以最大限度防止在封装的过程中出现多余应力。 2.2、芯片缺陷 芯片缺陷通常都是和半导体圆片制造以及塑料封装器件特有的缺陷(比如在应力作用下所产生的金属化分层以及钝化层破裂现象)有关系的。这里不再详细描述所有缺陷, 仅限于讨论对塑封体结构关系非常密切的缺陷以及塑封体独有的缺陷。 2.3、芯片粘接缺陷

半导体名词解释

ACTIVE AREA主动区(工作区) 主动晶体管(ACTIVE FRANSISTOR)被制造的区域即所谓的主动区(active area)在标准之MOS制造过程中ACTIVE AREA是由,一层氮化硅光罩及等接氮化硅蚀刻之后的局部特区氧化(LOCOS OXIDATION)所形成的,而由于利用到局部场氧化之步骤.所以Active AREA 会受到鸟嘴(BIRD’S BEAK)之影响而比原先之氮化硅光罩所定义的区域来得小以长0.6UM 之场区氧化而言大概会有O.5 UM之BIRD'S BEAK存在也就是说ACTIVE AREA比原在之氮化硅光罩定义之区域小O.5UM Acetone丙酮 1.丙碗是有机溶剂的一种,分子式为CH30HCH3 2.性质:无色,具剌激性薄荷臭味之液体 3.用途:在FAB内之用途,主要在于黄光室内正光阻之清洗、擦拭 4﹒毒性:对神经中枢具中度麻醉性,对皮肤粘膜具轻微毒性,长期接触会引起皮肤炎,吸入过量之丙酮蒸气会刺激鼻、眼结膜、咽喉粘膜、甚至引起头痛、念心、呕吐、目眩、意识不明等。 5﹒允许浓度:1000ppm ADI显影后检查 After Developing Inspection之缩写 目的:检查黄光室制程;光阻覆盖→对准→曝光弓显影。发现缺点后,如覆盖不良、显影不良‥‥等即予修改(Rework)﹒以维产品良率、品质。 方法:利用目检、显微镜为之。 AEI蚀刻后检查 1. AEI 即After Etching Inspection,在蚀刻制程光阻去除、前反光阻去除后,分别对产品实施主检或抽样检查。 2. AEI之目的有四: 2-1提高产品良率,避免不良品外流。 2-2达到品质的一致性和制程之重复性。 2-3显示制程能力之指针。 2-4防止异常扩大,节省成本 3. 通常AEI检查出来之不良品,非必要时很少做修改。因为重去氧化层或重长氧化层可能造成组件特性改变可靠性变差、缺点密度增加。生产成本增高,以及良率降低之缺点。Air Shower空气洗尘室 进入洁净室之前,须穿无尘衣,因在外面更衣室之故﹒无尘衣上沽着尘埃,故进洁净室之前﹒须经空气喷洗机将尘埃吹掉。 Alignment对准 目的:在IC的制造过程中,必须经过6至10次左右的对准、曝光来定义电路图案,对准就是要将层层图案精确地定义显像在芯片上面。

类的封装性

C++讲稿 1.输入、输出语句 输出语句 例输出10、16、8进制整数 //ex2_8.cpp #include "iostream.h" #include "iomanip.h" void main() { int a=1508; cout<>a>>b>>c;

double d=a>b?a:b; double e=c>d?c:d; cout<<"max="<

封装测试题目

名词解释:集成电路芯片封装: 芯片贴装: 芯片互联: 可焊接性: 可润湿性 印制电路板: 气密性封装: 可靠性封装: T/C测试: T/S 测试: TH测试: PC测试: HTS测试:Precon测试金线偏移:再流焊:

简答: 1.芯片封装实现了那些功能 2.芯片封装的层次 3.简述封装技术的工艺流程 4.芯片互联技术有哪几种分别解释说明 5.常用的芯片贴装有哪三种请对这三种芯片贴装方法做出简单说明。 6.请说明热压焊和超声焊的工艺原理,并指出优缺点。 7.厚膜技术的概念 8.薄膜制备的技术有哪几种请举例说明。 9.通过厚膜与薄膜技术的比较分析,简述它们各自的优缺点 10.助焊剂的主要成分是什么 11.焊接前为何要前处理: 12.无铅焊料选择的一般要求是什么13.常见的印制电路板有哪几种 14.印制电路板的检测项目包括哪些具体说明电性能试验的内容。 15.软式印制电路板的概念,并说明它的应用领域。 16.表面贴装技术的优点有哪些 17.简述回流焊的基本工艺流程 18.波焊为引脚插入式器件的常见焊接技术,基本工艺步骤是什么 19.涂封的材料主要有哪几种 20.什么是顺形涂封它的基本方法是什么 21.封胶技术有什么作用 22.什么是陶瓷封装优点与缺点 23.画出陶瓷封装的工艺流程框图 24.生胚片刮刀成型的工艺过程 25.什么是塑料封装简述优缺点

26.按塑料封装元器件的横截面结构类型,有哪三种形式 27.解释塑料封装中转移铸膜的工艺方法 28.气密性封装的作用和必要性有哪些 29.气密性封装的材料主要有哪些哪种最好 30.玻璃气密性封装的应用途径和使用范围有哪些 31.请解释产品的可靠性的浴盆曲线(画图) 32.可靠性测试项目有哪些 33.请解释T/C与T/S的区别 34.简述金线偏移的产生原因 35.波峰焊工艺与再流焊的工艺不同点 36.说明翘曲的产生机理和解决办法

相关文档
最新文档