




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计学习笔记 本笔记中的程序均在Microsoft Visual C+ 6.0中测试正确目 录目 录2一、C+的认识和总结31.1 类的认识31.1.1 类的定义31.1.2 类的对象41.1.3 类成员的访问41.1.4 构造函数51.1.5 拷贝构造函数61.1.6 析构函数71.2 类的继承81.3 虚函数101.4 运算符的重载121.5 友元的使用131.6 类模板141.7 this指针14二、C/C+程序代码设计规范142.1 命名规范142.2 表达式设计142.3 条件语句设计152.4 循环语句设计152.5 常量设计152.6 函数设计152.7 注释规范16三、
2、函数参数的传递方式163.1 函数调用的作用163.2 函数参数传递机制163.3 判断二种传递方式173.4 引用和取地址的区别173.5 关于引用的一点迷惑17四、C/C+中的位运算的用法174.1 位运算符介绍174.2逻辑运算174.2.1 & (按位与)174.2.2 | (按位或)184.2.3 (按位异或)184.2.4 (取反)184.3 移位操作符184.3.1 (右移)19五、实践笔记19一、C+的认识和总结这部分笔记是学习C+时自己对一些基础和概念的总结,刚开始接触C+的类的时候,总是觉得一头雾水的,总不明白为什么会有各种定义,或者类中所定义的内容到底是什么意思,该怎么用
3、。通过看书和网上查找资料,做了几个程序后,对其有一点点认识和理解。1.1 类的认识1.1.1 类的定义结构体只描述了一个物体的属性,而类不仅描述了一个物体的属性,而且还描述了一个物体的行为。在类中,如果没有指名成员的类型,则默认为私有成员;在结构体中,如果没有指名成员的类型,则默认为公有成员。一个类里面包括:成员变量和成员函数。成员变量:该类事物所具有的属性。成员函数:该类事物所具有的行为。类的完整声明class Cpublic:公用的数据和成员函数 .;private:私有的数据.;protected:保护的数据和成员函数.; /分号不能丢示例一class CUserpublic:char
4、m_Username128; /成员变量char m_Password128;bool Login(); /成员函数;bool CUser:Login() /相关操作示例二class CUser /声明一个类public:char m_Username128;/定义数据成员char m_Password128;/定义数据成员bool Login() /定义方法/相关操作;二种方法一样,但是一比较常用,因为方式一把定义和使用分开,是程序的可读性提高。1.1.2 类的对象对象就是类的实例化。类是一种数据类型,对象就是这个类数据类型的变量。(可以这么去理解)class Pen /声明一个类 Penp
5、ublic: /表示下面声明的变量都是公有的int size; /声明一个公有的成员变量sizevoid write(); /声明一个公有的成员函数write;Pen pen ; /这里是声明一个Pen类的对象理解: CPen 就相当于一个笔的模型,这就是这个类不是其他的东西(比如车、房子、桌子.),而已经是个笔了。pen前提下它是一支笔,至于是 钢笔、油笔、铅笔、还是别的笔,就是对象。类是不占内存空间的,只有实例化对象后才占内存。1.1.3 类成员的访问当定义一个类的对象之后,就可以对这个类的成员进行访问调用了。class Pen/声明一个类 Penpublic: /表示下面声明的变量都是公
6、有的int size;/声明一个公有的成员变量sizevoid write(); /声明一个公有的成员函数write;int main()Pen pen ; /定义一个对象penpen.size=10;/为对象pen的size赋值cout the size is pen.size 来访问成员。Pen * p = new Pen;p-size = 20;p-write(); /调用成员函数使用类的对象时,为什么要初始化? 因为在使用类的对象的时候,必须进行初始化,否则对象里面是垃圾值。1.1.4 构造函数构造函数是特殊的成员函数,它的函数名必须与类的名称一致,并且不是由用户来调用的,而是在建立对
7、象的同时自动执行的。并且构造函数没有返回值,可以有参数,可以重载。为什么要构造函数?因为在类中,私有成员和保护成员不能通过类的示例对象进行初始化。而使用构造函数来进行对象的成员初始化。class Aprivate:int m_size = 10; /error,不能在类中进行初始化public:int m_size = 10; /这样是可以的,但这样数据就可以被外界更改,失去了数据封装性。示例:class Penpublic:Pen(int size=10);/声明具有默认参数的默认构造函数int GetSize();/成员函数的声明int SetSize(int size);void Wri
8、te();private:int m_size;Pen:Pen(int size)m_size=size;void Pen:Write()coutthe size of pen is m_sizeendl;int main()Pen pen1;/默认参数的构造函数的调用pen1.Write();Pen pen2(15);/参数取代默认参数的构造函数调用pen2.Write();return 0;/*the size of pen is 10the size of pen is 15Press any key to continu*/1.1.5 拷贝构造函数当需要很多相同的对象时,就要进行多次重
9、复的初始化,所以需要拷贝构造函数来实现。拷贝构造函数:深拷贝(通常用于当构造函数分配有堆内存资源(动态分配)时),浅拷贝(一般的拷贝)。示例:#include stdafx.h#includeusing namespace std;class Pen/声明一个Pen类private:int m_size;public:Pen(int size);Pen(Pen &pen);/声明一个Pen类的复制构造函数(拷贝构造函数)int GetSize();void Write();Pen:Pen(int size)m_size=size;Pen:Pen(Pen &pen)/复制构造函数的定义(拷贝构造
10、函数的定义方式)m_size=pen.GetSize();coutsize and long;int Pen:GetSize()return m_size;void Pen:Write()coutthe value of m_size is GetSize()endl;int main()Pen pen1(10);pen1.Write();Pen pen2(pen1);/调用复制构造函数pen2.Write();return 0;经验:如果你的类需要析构函数来析构资源,则它也需要一个拷贝构造函数。因为对象都是自动析构的,如果需要一个自定义的析构函数,那就意味着也需要一个拷贝构造函数。如果不自定
11、义构造函数、析构函数、拷贝构造函数,则系统会调用默认的相应的函数。1.1.6 析构函数因为当使用完对象时,要进行清理,所以需要析构函数。什么是析构函数?特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。只有在类对象生命期结束的时候,由系统自动调用。一个类可以有多个构造函数,但是只能有一个析构函数。析构函数的定义方法:在构造函数名前加上“”,表示“逆构造函数”。如: 构造函数 pen() 析构函数 pen()示例:#include stdafx.h#includeusing namespace std;class Penpublic:Pen(int size=10);Pen(
12、);/声明析构函数int GetSize();int SetSize(int size);void Write();private:int m_size;Pen:Pen(int size)m_size=size;Pen:Pen()/定义析构函数coutthis is destructor calledm_sizeendl;void Pen:Write()coutthe size of pen is m_sizeendl;int main()Pen pen1;pen1.Write();Pen pen2(15);pen2.Write();return 0;/*the size of pen is
13、10the size of pen is 15this is destructor called15this is destructor called10Press any key to continue*/1.2 类的继承继承是一种编程技术,也是面向对象程序设计的一个非常重要的特征。是C+语言的精华和真谛。类继承的新类称为派生类或子类,原有类称为基类或父类。继承父类的子类,可以调用父类的成员数据或成员函数。继承的分类:单一继承:以一个基类派生新类。多重继承:继承多个基类。派生新类的语法单一继承:语法: class 派生类名 : 访问限定符 基类名例如: class A : public B多
14、重继承:语法: class 类名称 : 访问限定符1 基类1名称, 访问限定符2 基类2名称.例如: class C: public class A, public class B覆盖成员函数如果在派生类中声明一个成员函数,这个成员函数与基类的一个成员函数相同,当定义派生类的对象时,通过对象调用这个成员函数时,那么访问的是派生类中的还是基类中的呢?访问的是派生类中的成员函数。这就叫做成员函数的覆盖。注意:如果此时想要派生类去调用基类的成员函数,这要加上作用域限定符“:”。如:rect.CShare:display()示例:#include stdafx.h#includeusing names
15、pace std;class CShape/声明一个CShape类private:int m_color;/声明一个私有成员变量public:CShape(int color=10);/声明带有默认参数的构造函数void display();CShape:CShape(int color)/默认参数的构造函数的定义m_color=color;/对成员变量进行赋值void CShape:display()/CShape成员函数的定义coutThis is a Shapeendl;class CRect :public CShape/声明一个派生自CShape类的CRectprivate:int
16、m_size;/声明一个私有成员变量public:CRect(int size=20);/声明默认参数的构造函数void display();CRect:CRect(int size)/默认参数的构造函数的定义m_size=size;void CRect:display()/CRect的成员函数的定义coutThis is a Rectendl;int main()CShape shape;shape.display();/调用CShape类的成员函数CRect rect;/定义CRect类的对象rect.display();/调用派生类CRect的成员函数rect.CShape:displa
17、y();/通过限定符来用派生类调用基类的成员函数return 0;/*This is a ShapeThis is a RectThis is a ShapePress any key to continue*/1.3 虚函数利用虚函数可以使用相同的代码实现不同的功能调用。虚函数可以使操作趋于一般化。虚函数的声明:和普通的成员函数的声明相似,只是在前面加上了关键字virtual。class Apublic:virtual void display();示例:#include stdafx.h#includeusing namespace std;class CSubject/声明一个CSubj
18、ect类public:virtual void display();/声明一个虚函数;void CSubject:display()/定义CSubject的虚函数coutthis is Subjectendl;class CChinese: public CSubject/声明一个派生自CSubject的CChinese类public:virtual void display();void CChinese:display()/定义CChinese的虚函数coutthis is Chinesedisplay();/通过指针调用基类的虚函数p=&chinese;/将派生类地址赋值给基类指针p-d
19、isplay();/调用派生类的虚函数return 0;/*this is Subjectthis is ChinesePress any key to continue*/首先定义基类CSubject,在基类中声明一个虚函数display,来输出一句话。在基类的基础上派生各个学科的类,并在每个派生类的外都改写display这个虚函数,输出一句特定的话。在主函数main中,首先声明CSubject类的指针变量p,然后定义每个类的对象。将CSubject的对象地址传递给指针p,通过指针p调用CSubject的display函数。然后将每个派生类的对象的地址传递给指针p,通过指针p调用各个派生类的
20、display函数。利用这样的方法就可以使用指针p调用所有类的display函数了。如果在基类中声明成员函数为虚函数,在将派生类的对象传递给基类指针,通过这个基类指针就可以调用派生类中的虚函数,这样就建立了一般化操作。纯虚函数基类是为了派生类而将成员函数抽象出来,那么就用一种方法来表示这种特殊的抽象,这就是纯虚函数。如在上例中,CSubject类,世界上没有“学科”这个科目,所以不应该有分数输出,学科只是一个抽象的概念,那么可以用虚函数来表示它,如:class CSubject/声明一个CSubject类public:virtual void display()=0;/声明一个纯虚函数;纯虚函
21、数只有函数的名称而不具备函数的功能,只是为了派生类的特殊功能保留函数的名称。注意:如果在一个类中声明纯虚函数,而在派生类中却没有重新对该函数进行定义,则纯虚函数在派生类中仍然是纯虚函数。纯虚函数的一般形式:virtual 函数类型 函数名称 (参数列表) = 0;如:virtual void display()=0;纯虚函数是没有函数体的,也就是说在基类中不需要对纯虚函数进行定义。最后的“=0”并不是表示函数的返回值为0,它只是起形式上的作用,用来说明这个虚函数是纯虚函数。这是一条声明语句,所以在句子后面有“;”。下面摘录自:C+程序设计教程(修订版)-设计思想与实现 钱能 (十六章第九节),
22、来说明虚函数的一些限制和注意事项。虚函数的限制一个类中将所有成员函数都尽可能地设置为虚函数对编程固然方便,Java语言中正是这样做的,但是会增加一些时空上的开销。对于C+来说,在对性能上有偏激追求的编程中,只选择设置个别成员函数为虚函数。设置虚函数,需注意的事项:a) 只有类的成员函数才能说明为虚函数。b) 静态成员函数不能是虚函数。c) 内联函数不能是虚函数。d) 构造函数不能是虚函数。e) 析构函数可以使虚函数,而且通常声明为虚函数。1.4 运算符的重载为了解决二个对象的运算问题。只需要定义一个重载运算符函数,在需要执行被重载的运算时,系统就会自动调用该函数。运算符的重载相当于函数的重载。
23、格式:函数类型 operator 运算符号 (参数列表) 对运算符的重载处理.格式说明:operator 是关键字专门用来定义重载运算符函数的。函数声明:Man operator+(Man &a);函数定义:Man Man:operator+(Man &a)Man c;c.age=age+a.age;c.height=height+a.height;return c;注意:重载运算符的限制(摘录自:C+程序设计教程(修订版)-设计思想与实现)a) C+中不允许用户定义新的运算符,只能对已有对的运算符进行重载b) 不能改变原有运算符操作数的个数c) 不能改变原有运算符的优先级d) 不能改变原有运
24、算符的结合性e) 不能改变原有运算符的语法结构对于C+中的大多数运算符来说都可以进行重载,但是“:”、“?”、“:”和“.”运算符不能被重载。重载的规则如下:a) 一元操作数可以是不带参数的成员函数,或者是带一个参数的非成员函数b) 二元操作数可以是带一个参数的成员函数,或者是带二个参数的非成员函数c) “=”、“”、“-”和“()”运算符中鞥定义为成员函数d) “-”运算符的返回值必须是指针类型或者能够使用“-”运算符类型的对象e) 重载“+”和“-”运算符时,带一个int类型参数,表示后置运算;不带参数表示前置运算。拷贝构造函数和赋值运算符的区别:拷贝构造函数用已存在的对象创建一个相同的新
25、对象,而赋值运算符用已存在的对象赋予一个已存在的同类对象。1.5 友元的使用友元:可以访问类的私有成员。友元函数:将普通函数声明为友元函数,或者将其他类中的成员函数声明为友元成员函数。定义: friend 函数定义; 如:friend int max(int a);友元类:将B类声明为A类的友元,那么B类中所有的函数都可以访问A类中的成员。声明友元类的一般形式:friend 类名;关于友元的注意事项:a) 友元的关系是单向的,而不是双向的。如果B类是A类的友元类,不等于A类是B类的友元类,A类的成员函数不能访问B类中的私有成员。b) 友元关系不能传递。如果A是B的友元,B是C的友元,并不意味着
26、A是C的友元。c) 友元关系也不能继承。如果A是B的友元,C派生于A,并不意味着C是B的友元。d)在实际工作中,如果没有必要的话,一般并不将整个类都声明为友元。只是将特定的成员函数声明为友元,这样程序更加安全一些。1.6 类模板类模板能够为类的数据成员、成员函数的参数、返回值提供动态参数化的机制,使得用户可以方便地设计出功能更为灵活的类。定义格式:template返回值 类名:函数名(参数列表) 函数体内容; 示例:类模板中的每个成员函数定义都要在前面加上template。templateT Calculate:Add()return m_a + m_b;1.7 this指针this指针是隐含
27、在每个类成员函数的指针,其指向正在操作此函数的类对象。this指针的作用域是类内部,当在类的非静态成员函数中访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。二、C/C+程序代码设计规范2.1 命名规范类的命名推荐用“名词”或“形容词名词”的形式,如CAnalyzer、CFastVector、IUnknown、IDBWriter、TTimer、TThread等。函数的名称由一个或多个单词组成。为了便于界定,每个单词的首字母应大写。函数名应使用“动词”或“动词名词”(动宾词组)的形式,如GetName( )、SetValue( )等。保护成员函数的开头应当加一个下划线
28、“_”以示区别,如_SetState( )。类似地,私有成员函数的开头应当加两个下划线“_”,如_DestroyImp( )。2.2 表达式设计在C+编程中,表达式设计的一般规范如下。1) 如果代码中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。2) 不要编写过于复杂的复合表达式。3) 不要有多用途的复合表达式。4) 不要把程序中的复合表达式与“真正的数学表达式”混淆。如(a=b+)!=3,这个表达式虽然简洁,但是过于复杂,用途多,容易混淆。2.3 条件语句设计在C+编程中,条件语句设计的一般规范如下。1) 不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。 2)
29、 应将整型变量用“=”或“!=”直接与0比较。3) 应将指针变量用“=”或“!=”与NULL比较,指针变量的零值是“空”(NULL)。尽管NULL的值与0相同,但是两者意义不同。 4) 在使用switch语句时,每个case语句的结尾需要加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。 5) 注意最后一个default分支,即使程序真的不需要default处理,也应该保留语句“default : break;”,避免使别人误以为忘记了default处理。2.4 循环语句设计在C+编程中,循环语句设计的一般规范如下。1) 在多重循环中,应尽量将最长的循环放在最内层,最短的循环放在
30、最外层,以减少CPU跨切循环层的次数。 2) 如果循环体内存在逻辑判断,并且循环次数很多,应将逻辑判断移到循环体外面。3) 建议for语句的循环控制变量的取值采用“半开半闭区间”的写法。2.5 常量设计在C+编程中,常量设计的一般规范如下。1) 尽量使用含义直观的常量来表示那些在程序中多次出现的数字或字符串。2) 在C+程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。3) 需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为了便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。4) 如果某常量与其他常量密切相关,应在定义中包含这种关系,而
31、不应给出一些孤立的值。 5) 类中的常量不能直接被初始化,只能在类构造函数的初始化表中初始化。2.6 函数设计在C+编程中,函数设计的一般规范如下。1) 参数要完整,不能只有参数的类型而省略参数名称,如果函数没有参数,用void填充。 2) const修饰函数参数,对非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。对内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”,否则既达不到提高效率的目的,又降低了函数的可理解性。3) 避免函数有太多参数,尽量控制在5个参数以内。如果参数太多,在使用时容易使参数类型或顺序出错。4) 不要将正
32、常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。 5) 有时候函数原本不需要返回值,但为了增加灵活性,如支持链式表达,可以附加返回值。6) return语句不可返回指向“栈内存”的指针或引用,因为该内存在函数体结束时会被自动销毁。2.7 注释规范良好的代码注释有利于增强代码的可读性,同时增加代码的可维护性,大大降低软件的维护成本。注释规范的通则如下。1) 注释是对代码的“提示”,而不是文档,代码中的注释不可喧宾夺主,若注释太多会让人眼花缭乱,注释应简单清晰。2) 如果代码原本就简单清晰,则不必加注释,否则会显得多此一举。 3) 当代码较长,特别是有多重嵌套时
33、,应在一些段落的结束处加注释,便于阅读。三、函数参数的传递方式3.1 函数调用的作用1. 用实参数向形式参数传递数据;2. 为获得数据参数及在函数体中声明的变量分配存储空间;3. 中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调函数。当参数表为空时,表示该函数不从调用函数接受数据。3.2 函数参数传递机制 堆栈存储区是主调函数(过程)和被调用函数(过程)在调用发生时进行通信的主要区域。在C+语言中,函数参数的传递方式主要有二种,分别是值传递和引用传递(引用和指针)。值传递(passl-by-value): 被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存
34、放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。引用传递(pass-by-reference): 被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。3.3 判断二种传递方式当参数为数组、指针或引用类型,则此函数采用的是引用传递方式,否则便是值传递方式。例子:传递指针,void
35、 ValuePass(int* var) 传递引用:void ValuePass(int& var)传递值: void ValuePass(int var)3.4 引用和取地址的区别int i;int& Val = i; / 这是一个引用的定义,Val是i的别名,Val不占任何内存和空间,/ 它就是i的声明。引用在声明时必须被初始化,否则出错。i = &Val; / 这是取Val的地址给i3.5 关于引用的一点迷惑a) 引用可以引用任何数据类型,但不能引用数组,因为数组不是一个名副其实的数据类型。b) 引用不能引用void,因为void本质上不是一个类型。c) 引用本身不是数据类型,所以没有引
36、用的引用,也没有引用的指针。四、C/C+中的位运算的用法4.1 位运算符介绍C语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数。位逻辑运算包括&(按位与)、|(按位或)、(按位异或)、(取反)四种运算,移位运算有(右移)两种运算。其中位单目运算符。4.2逻辑运算4.2.1 & (按位与)参与运算的量,如果相对应的两位都为1,则该位的结果值为1,否则为0,即:0&0=0 0&1=0 1&0=0 1&1=1如:a的值为0x1234,b的值为0x00,a&b运算的结果c应为: a 0001 0010 0011 0100 & b 0000 0000 1111 1111 c 0000
37、 0000 0011 0100按位与常用于将某个运算量的某些位清0或提取某些位的值。如上例子,将变量的高8位清0,同时保留或提取低8位的值,可用一个高8位为0,低8位为1的值0x00ff和它进行按位与。4.2.2 | (按位或)参与运算的量,如果相对应的两位都为0,则该位的结果值为0,否则为1,即:0|0=0 0|1=1 1|0=1 1|1=1如:a的值为0x1234,b的值为0x00,a|b运算的结果c应为: a 0001 0010 0011 0100 |b 0000 0000 1111 1111 c 0001 0010 1111 1111 按位或常用于将某个运算量的某些位置1,如本例中将变
38、量的低8位置1,高8位不变,可用一个高8位为0,低8位为1的值0x00ff和它进行按位或。4.2.3 (按位异或)参与运算的量,如果相对应的两位相异,则该位的结果为1,否则为0,即:00=0 01=1 10=1 11=0如:a的值为0x1234,b的值为0x00,ab运算的结果c应为: a 0001 0010 0011 0100 b 0000 0000 1111 1111 c 0001 0010 1100 1011 按位异或有“与1异或”该位翻转,“与0异或”该位不变的规律。如本例中用0x00ff进行按位异或,使变量a的低8位翻转,高8位不变。4.2.4 (取反)将参与运算量的相对应位的值取反
39、,即1变0,0变1。如:a的值为0x1234,a运算的结果c应为: a 0001 0010 0011 0100 c 1110 1101 1100 10114.3 移位操作符4.3.1 (左移)按位左移是将一个运算量的各位依次左移若干位,低位补0,高位舍弃不要。假设机器字长为8位,变量a的值为16,将a左移二位,即a=a (右移)按位右移是将一个运算量的各位依次右移若干位,低位被移出,高位对无符号数补0,对有符号数要按最高符号位自身填补。右移一位相当于该数除以2,但有可能带来误差。假设机器字长为8位,变量a值为15,将a右移二位,即a=a2: 右移前 0000 1111 右移后 0000 001
40、1 如果a是带符号的负数,a=-16,存放在机器中的补码为1111 0000,则a=a2,值为- 4。 右移前 1111 0000 右移后 1111 1100移位操作可用于整数的快速乘除运算,左移一位等效于乘2,而右移一位等效于除以2。五、实践笔记const定义了const(常量)类型,const 最初的想法是代替C语言中的#define的。常量名不能放在赋值语句的左边。常量和变量的区别常量不能通过常量名去修改其所处的内存空间,而变量却可以。sizeof 它不是函数,也不是运算符,用于判断数据类型长度符的关键字。示例:char a = ab cdf; cout sizeof(a) endl;
41、/ 7,注意空格和0int b20 = 0; cout sizeof(b) endl; / 20 * 4 sizeof与 strlen() 区别:strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个0结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到0停止。而sizeof() 返回的是变量声明后所占的内存数,不是实际长度。示例:char str20=; int a = strlen(str); /a=10; strlen 计算字符串的长度,以结束符/0为字符串结束。 int b = sizeof(str); /b=20; s
42、izeof 计算的则是分配的数组 str20 所占的内存空间的大小,不受里面存储的内容改变。namespace#include 意味着 #include using namespace std;因为在标准化之前不存在名字空间,.h中的所有内容都是暴露的。namespace定义只能出现在全局域或另一个namespace中。每个编译单元都有一个未命名的namespace。通过将变量放入这个namespace中就可以不必将它们声明为static的(内部联接)。C+中要达到文件内的静态就使用这种方法。类中声明的友元也会进入这个类所在的namespace。using namespace只在当前域内有效(
43、将namespace中的所有名称注入当前域)。using namespace中引入的名称可以被覆盖。比如需要在C+中调用C的库中的函数:extern C float f(int a, char b); 否则的话联接程序可能无法解析函数调用。通常编译器都会自动处理这种情况。函数的作用域1. 函数的声明和定义默认情况下在整个程序中是extern的.2. 静态函数: 函数前加上statica) 不能被其它源文件所调用;b) 允许其他源文件建立并使用同名函数c) 文件作用域(在所用函数定义之外说明的,其作用域从说明点开始,一直延伸到源文件结束)下声明的inline函数和const常量都默认为static存储类型如加上extern则为外部存储类型.变量的作用域和生成期:1. 全局变量:函数外定义的变量a) 由编译器建立(但定义之前的所有函数定义不会知道该变量),默认初始化为0;b) 存在于整个应用程序的运行期间.c) 其他程序文件中的函数或本文件中变量定义之前的所有函数定义需调用此变量必须在程序文件中提前用extern对该变量进行声明.d) static型只允许在本程序文件中引用;e) 缺
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手机连接器精密设计规范-编制说明(征求意见稿)
- 四年级上册数学口算题
- 二年级下册《混合运算》练习题-二年级下学期的混算题
- 高中语文第六册诉肺腑 第2课时旧人教版第二课时
- 公司返聘人员合同范例
- 介绍工地合同范例
- 人人车电子合同范例
- 公司股东质押合同范例
- 代维分包合同范例
- 人才房申购合同范例
- 2024年0316云南公务员《申论》(县乡)卷
- 鉴乐·赏舞知到智慧树章节测试课后答案2024年秋绥化学院
- 2025年浙江杭州建德市林业总场下属林场招聘8人高频重点模拟试卷提升(共500题附带答案详解)
- 2025年无锡职业技术学院单招职业适应性测试题库及参考答案
- 第一篇 专题一 第2讲 牛顿运动定律与直线运动
- 规划高中生涯模板
- 2025年江苏无锡市江阴市新国联集团有限公司子公司招聘笔试参考题库附带答案详解
- 中国卒中学会急性缺血性卒中再灌注治疗指南 (2024)解读-指南解读系列
- 第二单元 第二次工业革命和近代科学文化 说课稿 2024-2025学年统编版九年级历史下册
- TSDHCIA 016-2021 化工行业智能化水平评估规范
- 年产8.5万吨钙基高分子复合材料项目可行性研究报告模板-立项备案
评论
0/150
提交评论