当前位置:文档之家› C学习笔记

C学习笔记

C++学习笔记

成功在于勤奋与努力------Akenzhang

1.默认参数可以在方法声名或者方法定义中任一处定义,但不能两处同时都定义。

另外,在方法声名时,也可以不用指明参数名称。

如:

# include <>

void repchar(char='*',int=45);态成员;

由于静态成员是属于整个类的,故调用的方法有两种:

①. 对象.静态成员;

②.类名.静态成员;

A.静态函数不能调用非静态成员,静态成员只能操纵类的静态数据成员,看反过来可

以;

B.静态成员应在main()程序开始之前创建并初始化,如:

C.int alpha::count=0; 性;

2.如何利用delete删除指针内存

对于普通指针,可以直接利用:delete p;

对于数组指针,可以delete [] p;

只要是使用new来分配对象数组,就必须在delete语句中使用[],因为指向对象的指针与指向数组的指针之间在语法上没什么区别。因此,如果不带括号的delete,就不能删除全部数组。

对象数组的初始化:

如:

假设有:

class Employer{

private:

char Name[40];

int Age;

double Salary;

……

}

Employer ManyEmps[3]=

{

Employer(“Slaycke Xulberg”,33,9600),

Employer(“aken”,30,9500),

Employer(“zhang”,28,3500)

}

3.如何处理C中出现的死循环:

do

{

j=scanf(“%d”,&x);

if(j<1)

{

fflush(stdin); cout<<变量--------在这里,“变量”可以是任何基本数据类型。

4.默认情况下,C++输出到小数点后6位,使用precision()更改输出的小数点的位数,对

尾数进行四舍五入:

(数字);

5.输入流:

A.()与()区别:

get()输入流中保留换行符;(str,50)它会读取最多49个字符或一直遇到换行符。

getline()输入流会弃掉换行符;如:(str,255);

get()函数不能从流中提取终止符,终止符仍留在流中。getline()函数可以从流中提取终止符,但终止符被丢弃。

如果输入的为字符时,常用()来忽略前面的空格。

B.skipws在提取>>时会跳过空白字符,而没有时,默认是取消前面的空格的。

(ios::skipws); 则不会忽略前面的空格。

C. 一般情况下,很少有cin>>与(str,数字)混合使用的。因为,cin>>在读取时会留有前面

的一个空格在缓冲区里面。而(str,数字)则会将回车符号保留在缓冲区里面。

6.C++中常见的文件操作方法有:

A.首先应定义一个文件流对象(ifstream,ofstream),他们都来自相同的类fstream;

B.将该文件流对象与具体的文件关联起来,以便当操作该文件对象时实质就是操作该

文件;

C.将文件流与物理文件关联有两种方法:

第一种是实例化文件对象时应用文件类的构造函数来指定文件位置与指定打开的方式:

(i fstream fin(“文件位置与文件名”); o fstream fou(“文件位置与文件名”))

f stream f(“文件位置与文件名”,ios::打开模式);

第二种是通过文件对象的open方法来指定文件的物理位置。

其中文件的打开方式有好几种:ios::in,ios::out,ios::app等。

若已经定义好fout为ofstream的一个对象,即可以:

(“文件位置与文件名”,ios::打开模式);

D.调用文件对象的方法,将读取的内容存入字符串或将字符串的内容写入文件:

(str,xxx);

(数据块的读,fin流中的数据读入到str中;第一个参数为将读入的数据储存到变量的地址指针,第二个变量为变量的大小。若为类即为sizeof(类名))

如:((char *)str,大小数字);

cout<<"二进制读出的字符串为:"<

若为对象即为:((char *)&a,sizeof(a));

(str,sizeof(xxx));

(数据块的写,将str中的数据写入到流fout中。第一个为要写入到文件的内容的变量的地址指针。第二个变量为变量的大小。若为类即为sizeof(类名))

E.常用的方法(在文件内写入与写出内容)

a.fout<<输出变量或输出内容;

b.fin>>读入变量或内容;

c.如何将文件的内容读入到某个变量:

有两种方法:①. 利用fin>>变量名;

②. (buffer,80)

如:

while(buffer,80))

{

in>>buffer;

out<

out<<'\n';

}

*关闭打开的文件:();

F.如何相文件中写入数据:

char *str;

str=new char[50];

(str,50); 创建一个文件流,方法有:

ifstream fin; (输入流)

或ofstream fout; (输出流)

或fstream f; (输入输出流)

②.使用函数open()将流关联到文件上来:

(“文件位置”,打开模式);

常见的打开模式有:ios::app; ios:: ate; ios::binary; ios::in; ios::out; ios::trunc;

③.判断文件是否被正确打开(如果文件打开失败,即流对象的数返回假):

if(!f){cout<<”文件打开失败”;}

④.向文件流写入或输出内容;

f<<输出的变量或输出的内容;

f>>输入的边量或输入的内容;

当然向文件读入或写的方法有多种。对文本文件进行读写操作最简单的办法是使用运算符<<和>>.

⑤.关闭文件流:();

G.需要记住的是:在我们使用运算符>>来读入文本文件时,将会发生字符转换。例如,

空白字符将被忽略。如果想在读入文本文件是不发生字符转换,必须以二进制模式打开文件。同时,使用>>读入字符串时,在遇到第一个字符串后输入将会停止;J.如何将文件以二进制格式写入文件:

①. 声名文件流:

fstream f;

②. 将文件流与文件关联:

(“文件位置”,ios::out | ios::binary);

③. 将变量信息写入文件:--------------可以按照下例子循环写入。

((char *)&类名,sizeof(类名));

((char *)&变量名,变量大小);

④. 关闭文件流。

如:

Data obj;

fstream f;

char reply='Y';

("",ios::out | ios::app);

while(reply=='Y' || reply=='y')

{

cout<<"请输入个人的详细信息:"<

();

((char *)&obj,sizeof(obj));

cout<<"要继续吗?[Y/N]";

cin>>reply;

}

();

H.如何从文件中读取内容:

①. 声名文件流:

fstream f;

②. 将文件流与文件关联:

(“文件位置”,ios::in | ios::binary);

③.将文件内容读入到变量中:

((char *)&类名,sizeof(类名));------------------可以按照下例子循环读取。

④. 关闭文件流。

如:

("",ios::in);

((char *)&obj,sizeof(obj));

while(!()) read()函数不仅可以从键盘输入中读取字符,也可以从任意输入流中获取信息;

②.read()函数不仅可以用于文本文件,也可以用于二进制文件;

③.read()成员函数的使用格式read(char* but,int size),buf用来存放读取到的字符指针或

字符数组,size用来指定从输入流中读取字符的个数。

7.友元函数的特点:

A.可以访问类的私有部分;

B.因为友元函数不是对象,故没有this指针;

C.在类内声明友元函数时,可以放在类的私有或共有部分声名,但一定在类的外部定

义;

D.调用时,像C语言的普通函数般调用,不用加类名与作用域运算符;

E.友元函数的功能可以通过继承方法替代,且尽量少用友元函数,因为它破坏了面向

对象原则。

F.如果一个函数需要访问不同类中的私有对象或属性,使用友元函数非常有用。这时

应注意向前声名;可以设置一个函数,分别为不同类的友元函数,这样这个函数就

可以同时访问不同类的私有属性,进而达到数据交换的目的。

G.只有需要直接访问两个或更多的类的私有成员时,才需要将该函数声名为友元函

数;

8.友元类:

若将一个类(A)声名为另一个类(B)的友元类,即该该类(A)的所有成员函数都可以访问类(B)的私有成员了。

9.有关运算符重载的几个要点:

A.重载不能改变操作符的基本功能;

B.重载不应该改变已经在语言中定义的优先顺序;

C.重载一个操作符不应该改变它本来的意义;

D.只能对已有的操作符进行重载,不能使用新的操作符号;

E.操作符号重载只对类可用。不能对预定义的基本类型重新定义操作符。

F.不能被重载的操作符:sizeof(),点运算符“.”,作用解析符(::),三元运算符(?:),

指向成员的指针(.*)

不应该被重载的运算符:逻辑与操作符(&&),逻辑或操作符(||)和逗号操作符(,)10.C++中,可以通过使用类来新建数据类型,和使用操作符重载来新建操作符,C++语言

提供了将自身重新定义成一个新语言的功能。操作符重载也被称作运算多态性。

11.C++运算符重载有前载与后载之分:(以下说友元操作符函数)

两者代码的区别是:

A.当为前缀是,直接让对象的每个数值型属性增加1,最后返回(*this)本对象;

B.当为后缀时,首先创建一个对象的实例,让其等与本对象(*this),然后让对象的每

个数值属性增加1,最后返回先前实例的对象;

C.如参考下列代码:

前缀:

three_d three_d::operator++()

{

x++;

y++;

return (*this); 术运算符和比较运算符只能对基本数据类型进行操作,而不能对派生的或者用户定义的数据类型进行操作;

②.注意区分运算符的返回类型及参数列表。注意使用的是成员函数操作符还是友元

函数操作符;

③. 若在重载操作符时,需要改变某值,即不能将其设定为const,如:

void operator-=(point &pnt1,const point &pnt2)

性。

12.使用友元函数的优点:

A.可以直接使用函数名来调用,不用使用对象的名字;

B.在某些重载某些特殊的运算符时,友元函数很有用;

C.友元函数简化了某些I/O操作;

D.在某些情况下,可能有两个或者多个类包含了与程序其他部分相关联的成员。

这样,仅一个友元函数就可以同时访问两个或多个不同类的成员。

13.友元类访问另一个类的私有变量:

将一个类声名为另一个类的友元类,这样,这个友元类内的所有函数便都可以访问主类内的私有变量了。

(如:《面向对象基础:C++实现》P148-P149)

14.C++中,若要某个指针为空,可以有两中方法:(假设ptr为一个指针)

A.ptr=0;

B.ptr=NULL;

15.C++中字符串的长度不包括尾的’\0’,但在为字符串分配空间时,应加上该结尾符:

(假设ptr为指针,其长度为length)

ptr=new char[length+1];

如果在ptr=new char[length+1]之前已经为ptr分配内存,则应该将其释放:delete ptr;

16.C++重载运算符时,成员重载与友元重载的一个很大的区别是:

参数的个数将不一样。如,重载+时,成员重载+时只需要一个参数,其中调用+的为隐式子this参数;而通过友元重载时,应为显示参数,即会有两个参数。

17.C++的复制构造函数的使用注意事项:

A.复制构造函数的参数一定要是对象的引用,否则会出现一种不断调用复制

构造函数的死循环;复制构造函数就是将本类型的一个对象当做参数传给构造函数来初始化对象,但参数一定要是本类型对象的一个引用。

B.在下列三种情况下要用到复制构造函数:

①. 将对象初试化为对象的另一个对象,即将另一个对象赋予该对象;

②. 将对象作为参数传递给函数;

③. 函数返回对象;

C.注意下列区别:

String s1=s2与String s1;s1=s2是不同的,第一种会调用到复制构造函数,如果没有复制构造函数,系统会提供一个默认的赋值运算符函数;第二种是调用赋值操作符函数,如果没有赋值运算符函数,系统会提供一个默认的赋值运算符函数。

String(String &ss) 用户自定义类型到基本数据类型的转换:

这种成员函数的特点:首先,没有返回类型;

其次,但一定要有返回值;

接着,是以基本数据类型名做为成员函数名;

(b)..不同类的对象的转换:

这种不同类对象之间的转换时,应注意:

首先,两个不同类的对象之间的转换可以使用两种方

法实现:使用构造函数或使用转换函数;

其次,构造函数通常在目标类中定义,而转换函数通

常在源类中定义;

接着,函数名是以类名做为转换函数的函数名;

最后,objectA=objectB; objectA为目标类,而objectB

为源类。

ObjectA = objectB

(常定义构造函数<目标>)(常定义转换函数<源>)

18.虚函数:

A.当使用指针来访问类时,可以使用类成员访问操作符(->)来访问类的成员。基类的

指针可以指向派生类的对象,可以将派生类的地址赋予基类的指针。

如果要调用派生类的函数,该函数必须在基类中被声名为虚函数,随后在每个派生

类中被重新定义

B.虚函数关键词virtual表示该函数对不同的派生类可以有不同的版本;

A.虚函数在基类中定义,而不用在派生类中再次声名,即关键词只用在基类中出现即

可,不用在派生类中再次出现;

B.基类中的虚函数可以被声名为:virtual void 虚函数()=0;

C.虚函数的目的是使得基类的指针可以指向派生类的成员,并可以执行派生类中的方

法。

D.构造函数不能是虚构函数;

E.虚函数必须在类中定义,不能在类外定义;

F.基类的指针可以指向派生类的对象,但只有基类的指针指向派生类重定义的虚函数

时才会发生多态;

G.父类指针(或引用)可以指向(或引用)子类对象。当通过父类的指针或引用调用

子类的指针或引用调用成员函数时,如果这个函数在父类中被定义为虚函数,那么将通过动态绑定类调用子类中定义的函数。以次相反,如果这个函数在父类中没有定义为虚函数,那么通过父类指针(或引用)将只能调用父类中定义的函数,即使这个指针指向一个子类也是如此;

H.调用析构函数是为了释放由构造函数分配的内存空间。如果基类的析构函数是非虚

的,则不能用指向派生类的指针调用派生类的析构函数,所以最好通过动态绑定,使用虚析构函数来有效地释放内存空间。一般来将,在所有作为基类的类中都提供一个虚析构函数是一个非常好的做法。

19.抽象类是包含一个或多个纯虚函数的类。抽象类用于提供接口而不会暴露任何实现细

节。所以不能使用抽象类来创建对象,只能用作其他类的基类。但可以创建抽象类的指针。(抽象类不能创建对象,但可以创建指针)

20.关于基类与派生类的调用顺序:

A.基类构造函数的调用顺序与基类在派生类声名的顺序相同,最后调用派生类的构造

函数;

B.析构函数的调用顺序与构造函数的调用顺序相反,首先调用派生类的析构函数,然

后调用基类的析构函数;

C.构造函数的调用顺序:基类构造函数->内部类的构造函数->派生类的构造函数;

析构函数的调用顺序:派生类的构造函数->内部类(或对象)的构造函数->派生类的构造函数;

21.派生类中如何调用基类的构造函数?如下为一个例子:

HourlyWorker(const char *s,double wage,double hours):Employee(s) 如果是在模板中,注意书写格式:

public:

Derived(T1 x=0,T2 y=0):Base(x) 给类模板声名实例时,应指明类的类型。如:

HR hr2("akenzhang",;

类名<实际的类型> 实例名(参数列表)

B. 函数模板与类模板的区别:

对于函数模板,未知数据类型是放在函数内的;而对于类模板,未知数据类型是放在类内的。

22.在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则需在函数体

外进行模板声明,并且在函数名前的类名后缀上“<模板类名>”.如:

template

vector::vector(int i)

{

…… .

}

template

T&vector::operator[](int i)

{

.

}

又如模板类的继承:

template

class Triangle:public Base::Base (public表示继承的方式;Base表示作用域,记住:Base中的Tx应为Triangle内定义的类型。)

23.类模板实例化时,

类模板的使用实际上是将类模板实例化成一个具体的类,它的格式为:

类名<实际的类型> 实例名(参数列表)

24.double型不能使用n++;

25.C++规定用’\0’来表示空字符,它的值是0。由于空字符将作为字符串的终止符,所以字

符串的大小应该被声名为数组中所能容纳的最大字符数再加上1。(参考《C++捷径教程》P64)

26.C++中,”>>”在遇到第一个空白字符时将停止读入字符。空白字符包括空格、制表符和

换行符;

而gets()函数将连续读入你从键盘输入的字符,直到你按下回车。

但使用gets()时,应包含头文件.

27.将字符转换成大写,可以应用头文件内的函数toupper()来转换字符成大写格式。

如:

for(int I=0;I<100;I++)

str[i]=toupper(str[i]);

28.一个未被初试化的指针被使用是会发生致命错误,要避免这些错误,可以将指针初始化

为空值。任意类型的指针都可以被初始化为空值。

Float *p=0;

Char *p=0;

If(p) 如果指针不是空指针则测试成功

29.注意:当使用引用作为参数时,C++编译器将自动的知道参数代表一个地址,这时候不

能使用*,若使用*将产生一个错误。所有涉及到引用参数的操作将自动作用于调用函数的实际操作。

30.函数返回值是一个引用时:

当函数返回一个引用时,它返回的是一个指向返回值的隐式指针。这样,对返回值的任何改变也将改变返回值对应的变量。

A.如:

double &change(int i)

{

return val[i];

}

change(1)=10;

这句将会改变val[1]的值。

31.对象赋值仅仅是使得这些对象的值相等,而这两个对象仍然是相互独立的。也就是说修

改一个对象的值不会影响到另一个对象。但若使用C++默认的赋值,它是将第一个对象的数据按位复制到第二个对象,这时候,实际上是创建了两个指向相同内存地址的对象。我们可以利用自定义复制构造函数或赋值构造函数解决这个问题。

32.注意:可以通过对象调用析构函数,但不能通过对象调用构造函数;

33.在程序中,静态变量和静态对象一样,只被构造一次。块作用域的静态变量,在首瓷进

入到定义该对象的函数时,构造该静态对象,以后进入该函数时不再构造静态对象; 34.C++“#include ”内有string类,可以定义相关字符串对象,所定义的对象具有

如下方法:

(str2);比较两个字符串的大小

(str2); 将字符串str2加至str1的末尾

(n); 提取第n个位置的字符。

(); 求取str1的长度(即字符个数)

(); 求取str1的长度(即字符个数)

(n) 从字符串索引位置n开始到尾部的部分

(3,"okokok"); 从索引的位置3开始插入字符串“okokok”

(3,6); 从索引的位置3开始删除6个字符

35.

计算机C语言趣味的程序设计——题目百例

Contest - 2011级C语言课程大作业 Start Time: 2012-02-19 16:25:00 End Time: 2012-03-01 22:00:00 Current Time: 2012-2-23 15:51:18 Status:Running Public

写在最前: 本文档中的题目;在不不同的编译器中可能会有提示错误,呵呵,小小的动动手改下变量的定义就可以运行了……………….. 由于能力不足..有题目未解决的…或者有错误的我会…认真听取大家的..意见的…. 呵呵……..有一两个….偷了下懒哦……… 提供原题目还有本人自己的解答的源代码。感谢大家的。。。。建议……………. 问题A: 趣味程序设计_狼追兔子 时间限制: 1 Sec 内存限制: 128 MB 提交: 341 解决: 63 [提交][状态][讨论版] 题目描述 一只兔子躲进了n个环形分布的洞的某一个中。狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中? 输入 有多组测试数据,读取到文件结尾符为止。每组测试数据输入n(2≤n≤100),即洞穴个数。输入到文件结尾符为止。 输出 兔子可能藏匿的洞。如果不止一个,按从小到大的顺序输出。如果不存在,输出空行。

样例输入 10 8 15 样例输出 2 4 7 9 2 4 5 7 8 9 11 12 14 提示 用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。 #include #include int ok[110]; int main() { int n,s,i,find; while(scanf("%d",&n)!=EOF) { memset(ok,0,sizeof(ok)); for(i=1;i<=200;i++) if(!ok[find=(i*(i+1)/2)%n]) if(find==0) ok[n]=1; else ok[find]=1; for(s=0,i=1;i<=n;i++) s+=ok[i]; for(i=1,find=0;i<=n;i++) if(!ok[i]) { if(find!=(n-s-1)) { printf("%d ",i);find++;

c语言趣味编程实例

1、编程序求5X+2Y+Z=50 的所有非负整数解。 #include int main() { int x, y, z; int count = 0; for (x = 0; 5 * x <= 50;x++) for (y = 0; 2 * y <= 50; y++) for (z = 0; z <= 50; z++) { if (5 * x + 2 * y + z == 50) { count++; printf("%d :", count); printf("x=%d,y=%d,z=%d", x, y, z); printf("\n"); } } return 0; } 2、把25个字母A、B、C、···、X、Y按如下要求打印出来:从最中间的字母M 开始打印,然后一左一右依次打印出其它字母,即M,L,N,K,O,...。 要求:初始化时按字母表顺序赋值。 #include int main() { char x[] = "ABCDEFGHIJKLMNPQRST"; int k; int n = 0; while (x[n]) { n++; if (x[n] == 'M') { k = n;break; } } printf("%c,",x[k]); for (int i = 1; i <= 12; i++) if (i <= 11) printf("%c,%c,", (x[k] - i), (x[k] + i)); else printf("%c,%c。", (x[k] - i), (x[k] + i)); printf("\n");

数据通信基本知识

数据通信基本知识 -------------------------------------------------------------------------- 所有计算机之间之间通过计算机网络的通信都涉及由传输介质传输某种形式的数据编码信号。传输介质在计算机、计算机网络设备间起互连和通信作用,为数据信号提供从一个节点传送到另一个节点的物理通路。计算机与计算机网络中采用的传输介质可分为有线和无线传输介质两大类。 一、有线传输介质(Wired Transmission Media) 有线传输介质在数据传输中只作为传输介质,而非信号载体。计算机网络中流行使用的有线传输介质(Wired Transmission Media)为:铜线和玻璃纤维。 1. 铜线 铜线(Copper Wire)由于具有较低的电阻率、价廉和容易安装等优点因而成为最早用于计算机网络中的传输介质,它以介质中传输的电流作为数据信号的载体。为了尽可能减小铜线所传输信号之间的相互干涉(Interference),我们使用两种基本的铜线类型:双绞线和同轴电缆。 (1)双绞线 双绞线(Twisted Pair)是把两条互相绝缘的铜导线纽绞起来组成一条通信线路,它既可减小流过电流所辐射的能量,也可防止来自其他通信线路上信号的干涉。双绞线分屏蔽和无屏蔽两种,其形状结构如图1.1所示。双绞线的线路损耗较大,传输速率低,但价格便宜,容易安装,常用于对通信速率要求不高的网络连接中。 (2)同轴电缆 同轴电缆(Coaxial Cable)由一对同轴导线组成。同轴电缆频带宽,损耗小,具有比双绞线更强的抗干扰能力和更好的传输性能。按特性阻抗值不同,同轴电缆可分为基带(用于传输单路信号)和宽带(用于同时传输多路信号)两种。同轴电缆是目前LAN局域网与有线电视网中普遍采用的比较理想的传输介质。 2.玻璃纤维 目前,在计算机网络中十分流行使用易弯曲的石英玻璃纤维来作为传输介质,它以介质中传输的光波(光脉冲信号)作为信息载体,因此我们又将之称为光导纤维,简称光纤(Optical Fiber)或光缆(Optical Cable)。 光缆由能传导光波的石英玻璃纤维(纤芯),外加包层(硅橡胶)和保护层构成。在光缆一头的发射器使用LED光发射二极管(Light Emitting Diode)或激光(Laser)来发射光脉冲,在光缆另一头的接收器使用光敏半导体管探测光脉冲。 模拟数据通信与数字数据通信 一、通信信道与信道容量(Communication Channel & Channel Capacity) 通信信道(Communication Channel)是数据传输的通路,在计算机网络中信道分为物理信道和逻辑信道。物理信道指用于传输数据信号的物理通路,它由传输介质与有关通信设备组成;逻辑信道指在物理信道的基础上,发送与接收数据信号的双方通过中间结点所实现的逻?quot;联系",由此为传输数据信号形成的逻辑通路。逻辑信道可以是有连接的,也可以是无连接的。物理信道还可根据传输介质的不同而分为有线信道和

通过实例学习C#开发中的泛型

C#中所谓泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。 C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。 C#泛型机制简介 C#泛型能力由CLR在运行时支持,区别于C++的编译时模板机制,和java 的编译时的“搽拭法”。这使得泛型能力可以在各个支持CLR的语言之间进行无缝的互操作。 C#泛型代码在被编译为IL和元数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以“on-demand”的方式,发生在JIT编译时。 C#泛型编译机制 第一轮编译时,编译器只为Stack类型产生“泛型版”的IL代码和元数据,并不进行泛型类型的实例化,T在中间只充当占位符。 JIT编译时,当JIT编译器第一次遇到Stack时,将用int类型替换“泛型版”IL代码与元数据中的T -- 进行泛型类型的实例化。 CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码,但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。 C#泛型的几个特点 如果实例化泛型类型的参数相同,那么JIT编译器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能导致的代码膨胀的问题。 C#泛型类型携带有丰富的元数据,因此C#的泛型类型可以应用于强大的反射技术。 C#的泛型采用“基类、接口、构造器、值类型/引用类型”的约束方式来实现对类型参数的“显示约束”,提高了类型安全的同时,也丧失了C++模板基于“签名”的隐式约束所具有的高灵活性。 C#泛型类与结构 class C{} //合法 class D:C{} //合法

C语言经典编程

猴子吃桃 1、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思维的方法,从后往前推断。 2.程序源代码: main() { int day,x1,x2; day=9; x2=1; while(day>0) {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/ x2=x1; day--; } printf("the total is %d\n",x1); } 回文数问题 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 1. 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法) 2.程序源代码: main( ) { long a,b,c,d,e,x; scanf("%ld",&x); a=x/10000;/*分解出万位*/ b=x%10000/1000;/*分解出千位*/ c=x%1000/100;/*分解出百位*/ d=x%100/10;/*分解出十位*/ e=x%10;/*分解出个位*/ if (a!=0) printf("there are 5, %ld %ld %ld %ld %ld\n",e,d,c,b,a); else if (b!=0) printf("there are 4, %ld %ld %ld %ld\n",e,d,c,b); else if (c!=0) printf(" there are 3,%ld %ld %ld\n",e,d,c); else if (d!=0) printf("there are 2, %ld %ld\n",e,d); else if (e!=0) printf(" there are 1,%ld\n",e); } 杨辉三角 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: 1 1 1

通信原理基础知识整理

通信常识:波特率、数据传输速率与带宽的相互关系 【带宽W】 带宽,又叫频宽,是数据的传输能力,指单位时间能够传输的比特数。高带宽意味着高能力。数字设备中带宽用bps(b/s)表示,即每秒最高可以传输的位数。模拟设备中带宽用Hz表示,即每秒传送的信号周期数。通常描述带宽时省略单位,如10M实质是10M b/s。带宽计算公式为:带宽=时钟频率*总线位数/8。电子学上的带宽则指电路可以保持稳定工作的频率围。 【数据传输速率Rb】 数据传输速率,又称比特率,指每秒钟实际传输的比特数,是信息传输速率(传信率)的度量。单位为“比特每秒(bps)”。其计算公式为S=1/T。T为传输1比特数据所花的时间。 【波特率RB】 波特率,又称调制速率、传符号率(符号又称单位码元),指单位时间载波参数变化的次数,可以以波形每秒的振荡数来衡量,是信号传输速率的度量。单位为“波特每秒(Bps)”,不同的调制方法可以在一个码元上负载多个比特信息,所以它与比特率是不同的概念。 【码元速率和信息速率的关系】 码元速率和信息速率的关系式为:Rb=RB*log2 N。其中,N为进制数。对于二进制的信号,码元速率和信息速率在数值上是相等的。 【奈奎斯特定律】 奈奎斯特定律描述了无噪声信道的极限速率与信道带宽的关系。 1924年,奈奎斯特(Nyquist)推导出理想低通信道下的最高码元传输速率公式:理想低通信道下的最高RB = 2W Baud。其中,W为理想低通信道的带宽,单位是赫兹(Hz),即每赫兹带宽的理想低通信道的最高码元传输速率是每秒2个码元。对于理想带通信道的最高码元传输速率则是:理想带通信道的最高RB= W Baud,即每赫兹带宽的理想带通信道的最高码元传输速率是每秒1个码元。 符号率与信道带宽的确切关系为: RB=W(1+α)。 其中,1/1+α为频道利用率,α为低通滤波器的滚降系数,α取值为0时,频带利用率最高,但此时因波形“拖尾”而易造成码间干扰。它的取值一般不小于0.15,以调解频带利用率和波形“拖尾”之间的矛盾。 奈奎斯特定律描述的是无噪声信道的最大数据传输速率(或码元速率)与信道带宽之间的关系。 【香农定理】 香农定理是在研究信号经过一段距离后如何衰减以及一个给定信号能加载多少数据后得到了一个著名的公式,它描述有限带宽、有随机热噪声信道的最大数据传输速率(或码元速率)与信道带宽、信噪比(信号噪声功率比)之间的关系,以比特每秒(bps)的形式给出一个链路速度的上限。

C语言标准库函数

标准库函数 本附录描述了标准C支持的库函数①。使用此附录时,请记住下列要点。 为了简洁清楚,这里删除了一些细节。如果想看全部内容,请参考标准。本书的其他地方已经对一些函数(特别是printf函数、scanf函数以及它们的变异函数)进行了详细介绍,所以这里 只对这类函数做简短的描述。为了获得关于某个函数更详细的信息(包括如何使用这个函数的示 例),请见函数描述右下角用楷体列出的节号。 每个函数描述结尾都有其他与之相关函数的列表。相似函数非常接近于正在描述的函数。相关函数经常会和在描述的函数联合使用。(例如,calloc函数和realloc函数与malloc函数“类似”, 而free函数则与malloc函数“相关”。)也可参见的函数和在描述的函数没有紧密联系,但是却 可能有影响。 如果把函数行为的某些方面描述为由实现定义的,那么这就意味着此函数依赖于C库的实现方式。 函数将始终行为一致,但是结果却可能会由于系统的不同而千差万别。(换句话说,请参考手册了 解可能发生的问题。)另一方面,未定义的行为是一个不好的消息:不但函数的行为可能会因系统 不同而不同,而且程序也可能会行为异常甚至崩溃。 中许多函数的描述提到了定义域错误和取值范围错误。在本附录的末尾对这两种错误进行了定义。 601 下列库函数的行为是会受到当前地区影响的: 字符处理函数(除了isdigit函数和isxdigit函数)。 格式化输入/输出函数。 多字节字符和字符串函数。 字符串转换函数。 Strcoll函数、strftime函数和strxfrm函数。 例如,isalpha函数实际上检测字符是否在a到z之间或者在A到Z之间。在某些区域内也把其他字符看成是字母次序的。本附录描述了在"C"(默认的)地区内库函数的行为。 一些函数实际上是宏。然而,这些宏的用法和函数完全一样,所以这里不对它们区别对待。 abort 异常终止程序 void abort(void); 产生SIGABRT信号。如果无法捕获信号(或者如果信号处理函数返回),那么程序会异常 终止,并且返回由实现定义的代码来说明不成功的终止。是否清洗输出缓冲区,是否关 闭打开的流,以及是否移除临时文件都是由实现定义的。 相似函数exit函数、raise函数 相关函数assert函数、signal函数 也可参见atexit函数 26.2节abs 整数的绝对值 int abs(int j); 返回整数j的绝对值。如果不能表示j的绝对值,那么函数的行为是未定义的。 ①这些材料经ANSI许可改编自American National Standards Institude ANSI/ISO 9899?1990。这个标准的副本可从 ANSI购买(ANSI, 11 West 42nd Street, New York, NY 10036)。

第8章_泛型编程习题_参考答案

《面向对象程序设计》习题 第8章泛型编程 一、选择题(共40分,每题2分) 二、填空题(共20分,每空2分) 1. 逻辑数据类型 2. 函数类 3. 函数模板类模板 4.函数类型形参类型 5.2 6. 尖括号 三、下列程序有2个错,找出并修改(共6分) 错1:public: A(T a, b) // A(T a,T b) {x=a,y=b;s=x+y;} 错2: int main() { A add(10,100); // A add(10,100); add.show(); return 0; } 四、看程序写结果(共12分,每题4分) 1. 2. 3.

五、编程题(22分) 1.设计一个函数模板,实现两数的交换,并用int、float、double、char类型的数据进行测试。 #include #include using namespace std; template void change(T &x, T &y) { T temp; temp=x; x=y; y=temp; } int main() { int a=12, b=34; float c=1.1, d=2.2; double e=1.23456789, f=2.23456789; char u='A', v='B'; cout<<"交换前:a="< 19/// 20public T this[int index] 21 { 22get 23 { 24if (index >= arr.Length) 25 { 26throw new System.Exception("数组下标越界 "); 27 } 28else

29 { 30return arr[index]; 31 } 32 } 33set 34 { 35if (index >= arr.Length) 36 { 37throw new System.Exception("数组下标越界 "); 38 } 39else 40 { 41 arr[index]=value; 42 } 43 } 44 } 45 } 调用: 1protected void Page_Load(object sender, EventArgs e) 2 { 3 MyList list = new MyList(4); 4 5 list.Add(1); 6 list.Add(4); 7 list.Add(5); 8 list.Add(6); 9for (int i = 0; i < list.count; i++) 10 { 11 Response.Write(list[i].ToString()); 12 } 13 } 注意: 1、是在运行时,将堆空间里的对象内部所有的占位符都替换成传入的类型. 2、泛型是指带类型参数的类,而不是类型参数本身。

1C语言入门_3简单函数_3形参和实参解读

第 3 章 简单函数 3. 形参和实参
下面我们定义一个带参数的函数, 我们需要在函数定义中指明参数的个数和每个 参数的类型,定义参数就像定义变量一样,需要为每个参数指明类型,参数的命 名也要遵循标识符命名规则。例如: 例 3.4. 带参数的自定义函数
#include
void print_time(int hour, int minute) { printf("%d:%d\n", hour, minute); }
int main(void) { print_time(23, 59); return 0; }
需要注意的是, 定义变量时可以把相同类型的变量列在一起,而定义参数却不可 以,例如下面这样的定义是错的:
void print_time(int hour, minute) {

printf("%d:%d\n", hour, minute); }
学习 C 语言的人肯定都乐意看到这句话:“变量是这样定义的,参数也是这样 定义的,一模一样”,这意味着不用专门去记住参数应该怎么定义了。谁也不愿 意看到这句话:“定义变量可以这样写,而定义参数却不可以”。C 语言的设计 者也不希望自己设计的语法规则里到处都是例外, 一个容易被用户接受的设计应 该遵循最少例外原则(Rule of Least Surprise)。其实关于参数的这条规定也不 算十分例外,也是可以理解的,请读者想想为什么要这么规定。学习编程语言不 应该死记各种语法规定,如果能够想清楚设计者这么规定的原因(Rationale), 不仅有助于记忆,而且会有更多收获。本书在必要的地方会解释一些 Rationale, 或者启发读者自己去思考, 例如上一节在脚注中解释了 void 关键字的 Rationale。 [C99 Rationale]是随 C99 标准一起发布的,值得参考。 总的来说,C 语言的设计是非常优美的,只要理解了少数基本概念和基本原则就 可以根据组合规则写出任意复杂的程序, 很少有例外的规定说这样组合是不允许 的,或者那样类推是错误的。相反,C++的设计就非常复杂,充满了例外,全世 界没几个人能把 C++的所有规则都牢记于心,因而 C++的设计一直饱受争议, 这个观点在[UNIX 编程艺术]中有详细阐述。 在本书中,凡是提醒读者注意的地方都是多少有些 Surprise 的地方,初学者如 果按常理来想很可能要想错, 所以需要特别提醒一下。而初学者容易犯的另外一 些错误, 完全是因为没有掌握好基本概念和基本原理,或者根本无视组合规则而 全凭自己主观臆断所致, 对这一类问题本书不会做特别的提醒,例如有的初学者 看完第 2 章 常量、变量和表达式之后会这样打印π 的值:
double pi=3.1416; printf("pi\n");
之所以会犯这种错误,一是不理解 Literal 的含义,二是自己想当然地把变量名 组合到字符串里去, 而事实上根本没有这条语法规则。如果连这样的错误都需要 在书上专门提醒,就好比提醒小孩吃饭一定要吃到嘴里,不要吃到鼻子里,更不 要吃到耳朵里一样。 回到正题。我们调用 print_time(23, 59)时,函数中的参数 hour 就代表 23,参 数 minute 就代表 59。确切地说,当我们讨论函数中的 hour 这个参数时,我们 所说的“参数”是指形参(Parameter),当我们讨论传一个参数 23 给函数时, 我们所说的“参数”是指实参(Argument),但我习惯都叫参数而不习惯总把 形参、实参这两个文绉绉的词挂在嘴边(事实上大多数人都不习惯),读者可以 根据上下文判断我说的到底是形参还是实参。 记住这条基本原理: 形参相当于函

趣味c语言编程100例

趣味 c 语言编程100 例 【程序 1】 题目:有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、 2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) / *以下为三重循环 */ for( j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /* 确保 i 、 j、 k 三位互不相同 */ printf("%d,%d,%d\n",i,j,k); } } 程序 2】 题目:企业发放的奖金根据利润提成。利润 (I) 低于或等于 10 万元时,奖金可提 10% ;利润高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10% 提成,高于 10 万元的部分,可可提成 7.5% ; 20 万到 40 万之间时,高于 20 万元的部分,可提成 5% ; 40 万到 60 万之间时高于

40 万元的部分,可提成 3% ;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5% ,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总 数? 1. 程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2. 程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15; if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bonus1+(i-100000)*0.075; else if(i<=400000) bonus=bonus2+(i-200000)*0.05; else if(i<=600000) bonus=bonus4+(i-400000)*0.03;

数据通信基本知识03794

数据通信基本知识 所有计算机之间之间通过计算机网络的通信都涉及由传输介质传输某种形式的数据编码信号。传输介质在计算机、计算机网络设备间起互连和通信作用,为数据信号提供从一个节点传送到另一个节点的物理通路。计算机与计算机网络中采用的传输介质可分为有线和无线传输介质两大类。 一、有线传输介质(Wired Transmission Media) 有线传输介质在数据传输中只作为传输介质,而非信号载体。计算机网络中流行使用的有线传输介质(Wired Transmission Media) 为:铜线和玻璃纤维。 1. 铜线 铜线(Copper Wire)由于具有较低的电阻率、价廉和容易安装等优点因而成为最早用于计算机网络中的传输介质,它以介质中传输的电流作为数据信号的载体。为了尽可能减小铜线所传输信号之间的相互干涉(Interference) ,我们使用两种基本的铜线类型:双绞线和同轴电缆。 (1) 双绞线 双绞线(Twisted Pair) 是把两条互相绝缘的铜导线纽绞起来组成一条通信线路,它既可减小流过电流所辐射的能量,也可防止来自其他通信线路上信号的干涉。双绞线分屏蔽和无屏蔽两种,其形状结构如图 1.1 所示。双绞线的线路损耗较大,传输速率低,但价格便宜,容易安装,常用于对通信速率要求不高的网络连接中。 (2) 同轴电缆 同轴电缆(Coaxial Cable) 由一对同轴导线组成。同轴电缆频带宽,损耗小,具有比双绞线更强的抗干扰能力和更好的传输性能。按特性阻抗值不同,同轴电缆可分为基带(用于传输单路信号)和宽带(用于同时传输多路信号)两种。同轴电缆是目前LAN局域网与有线电视网中普遍采用的比较理想的传输介质。 2. 玻璃纤维目前,在计算机网络中十分流行使用易弯曲的石英玻璃纤维来作为传输介质,它以介质中传输的光波(光脉冲信号)作为信息载体,因此我们又将之称为光导纤维, 简称光纤(Optical Fiber) 或光缆(Optical Cable) 。 光缆由能传导光波的石英玻璃纤维(纤芯),外加包层(硅橡胶)和保护层构成。在光缆一头的发射器使用LED光发射二极管(Light Emitting Diode) 或激光(Laser)来发射光脉冲,在光缆另一头的接收器使用光敏半导体管探测光脉冲。 模拟数据通信与数字数据通信 一、通信信道与信道容量(Communication Channel & Channel Capacity) 通信信道(Communication Channel) 是数据传输的通路,在计算机网络中信道分为物理信道和逻辑信道。物理信道指用于传输数据信号的物理通路,它由传输介质与有关通信设备组成;逻辑信道指在物理信道的基础上,发送与接收数据信号的双方通过中间结点所实现的逻?quot; 联系",由此为传输数据信号形成的逻辑通路。逻辑信道可以是有连接的,也可以是无连接的。物理信道还可根据传输介质的不同而分为有线信道和 无线信道,也可按传输数据类型的不同分为数字信道和模拟信道。信道容量(Channel

如何学好并精通C语言

程序员之路——如何学习C语言并精通C语言 程序员之路——如何学习C语言 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C 语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。 一、要读就读好书,否则不如不读 所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。 大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:) Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。 如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦你仔细读完并能透彻理解,你便可以放心大胆地在简历上写“精通C语言”了。 切记一个原则,不要读自己目前还看不懂的书,那是浪费生命。如果你看不懂,那你一定是缺失了某些必需基础知识。此时,你要仔细分析自己需要补充哪些内容,然后再去书店寻找讲述的这些内容的书籍。把基础知识补充完毕再回头来学习,才会真正的事半功倍。 二、Unix/Linux还是Windows,这是个很大的问题 不同的编程环境会造就出不同思维的程序员。Windows的程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更加钟爱Makefile与控制台。显而易见,集成开发环境更容易上手,在Windows上学习C语言,只需要会按几个基本的Visutal C++工具栏按钮就可以开始写Hello, World!了,而在Unix下,你需要一些控制台操作的基本知识。有人也许认为Unix的环境更简洁,但习惯的力量是很大的,大家都很熟悉Windows的基本操作,而为了学习C语言去专门装一个Unix系统,似乎有点不划算。 对于一个只懂得Windows基本操作、连DOS是什么都不知道的新手而言,尽快做一些有趣而有意义的事情才是最重要的。用C语言写一个小程序远比学习ls、cat等命令有趣,况且我们要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程、Makefile的写法等等等等。 所以我建议初学者应该以Visual C++ 6.0(不是VisualC++ .NET)或者Dev C++作为主要的学习环境,而且千万不要在IDE的使用技巧上过多纠缠,因为今后你一定要转向Unix环境的。Visual C++ 6.0使用很方便,调试也很直观,但其默认的编译器对C标准的支持并不好,而Dev C++使用gcc编译器,对C99的标准都支持良好。使用顺带提一下,很多大学的C语言课程还在使用Turbo C 2.0作为实验环境,这是相当不可取的,原因其一是TC 2.0对C标准几乎没有支持,其二是TC 2.0编译得到的程序是16位的,这对今后理解32位的程序会造成极大的困扰(当然,用djgpp之类的东西可以使TC

C++高级参考手册04

第4章初始化与清除 第2章利用了一些分散的典型C语言库的构件,并把它们封装在一个s t r u c t中,从而在库的应用方面做了有意义的改进。(从现在起,这个抽象数据类型称为类)。 这样不仅为库构件提供了单一一致的入口指针,也用类名隐藏了类内部的函数名。在第3章中,我们介绍了存取控制(隐藏实现),这就为类的设计者提供了一种设立界线的途径,通过界线的设立来决定哪些是用户可以处理的,哪些是禁止的。这意味着数据类型的内部机制对设计者来说是可控的和能自行处理的。这样让用户也清楚哪些成员是他们能够使用并加以注意的。 封装和实现的隐藏大大地改善了库的使用。它们提供的新的数据类型的概念在某些方面比从C中继承的嵌入式数据类型要好。现在C ++编译器可以为这种新的数据类型提供类型检查,这样在使用这种数据类型时就确保了一定的安全性。 当然,说到安全性,C ++的编译器能比C编译器提供更多的功能。在本章及以后的章节中,我们将看到许多C ++的另外一些性能。它们可以让我们程序中的错误暴露无遗,有时甚至在我们编译这个程序之前,帮我们查出错误,但通常是编译器的警告和出错信息。所以我们不久就会习惯:在第一次编译时总听不到编译器那意味着正确的提示音。 安全性包括初始化和清除两个方面。在C语言中,如果程序员忘记了初始化或清除一个变量,就会导致一大段程序错误。这在一个库中尤其如此,特别是当用户不知如何对一个s t r u c t 初始化,甚至不知道必须要初始化时。(库中通常不包含初始化函数,所以用户不得不手工初始化s t r u c t)。清除是一个特殊问题,因为C程序员一旦用过了一个变量后就把它忘记了,所以对一个库的s t r u c t来说,必要的清除工作往往被遗忘了。 在C ++中,初始化和清除的概念是简化类库使用的关键所在,并可以减少那些由于用户忘记这些操作而引起的许多细微错误。本章就来讨论C ++的这些特征。 4.1 用构造函数确保初始化 在s t a s h和s t a c k类中都曾调用i n i t i a l i z e()函数,这暗示无论用什么方法使用这些类的对象,在使用之前都应当调用这一函数。很不幸的是,这要求用户必须正确地初始化。而用户在专注于用那令人惊奇的库来解决他们的问题的时候,往往忽视了这些细节。在C ++中,初始化实在太重要了,所以不能留给用户来完成。类的设计者可以通过提供一个叫做构造函数的特殊函数来保证每个对象都正确的初始化。如果一个类有构造函数,编译器在创建对象时就自动调用这一函数,这一切在用户使用他们的对象之前就已经完成了。对用户来说,是否调用构造函数并不是可选的,它是由编译器在对象定义时完成的。 接下来的问题是这个函数叫什么名字。这必须考虑两点,首先这个名字不能与类的其他成员函数冲突,其次,因为该函数是由编译器调用的,所以编译器必须总能知道调用哪个函数。S t r o u s t r u p的方法似乎是最容易也是最符合逻辑的:构造函数的名字与类的名字一样。这使得这样的函数在初始化时自动被调用。 下面是一个带构造函数的类的简单例子:

C语言库函数参考手册

C语言库函数参考手册 转载说明:可能有些函数已经过时,但从学习的角度来看,还是有一定的参考价值。 分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0 int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9') 返回非0值,否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F) 返回非0值,否则返回0 int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0 int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0 int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0 int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0 int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n') 返回非0值,否则返回0 int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0 int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则返回0 int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z') int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z') 数学函数,所在函数库为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fabs(double x) 返回双精度参数x的绝对值 long labs(long n) 返回长整型参数n的绝对值 double exp(double x) 返回指数函数ex的值 double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值 double log(double x) 返回logex的值 double log10(double x) 返回log10x的值 double pow(double x,double y) 返回xy的值 double pow10(int p) 返回10p的值 double sqrt(double x) 返回+√x的值 double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度double atan(double x) 返回x的反正切tan-1(x)值,x为弧度double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度

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