C++编程注意事项

上传人:飞*** 文档编号:53958352 上传时间:2018-09-06 格式:PDF 页数:25 大小:123.45KB
返回 下载 相关 举报
C++编程注意事项_第1页
第1页 / 共25页
C++编程注意事项_第2页
第2页 / 共25页
C++编程注意事项_第3页
第3页 / 共25页
C++编程注意事项_第4页
第4页 / 共25页
C++编程注意事项_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《C++编程注意事项》由会员分享,可在线阅读,更多相关《C++编程注意事项(25页珍藏版)》请在金锄头文库上搜索。

1、C+编程注意事项及常识1.类和对象C+程序是由许多类所构成的,类是C+的灵魂。程序 =算法+数据结构类是对象的抽象,而对象是类的具体实例。对于类体内定义的函数,一般都省写inline,如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置(inline)函数。如果在类体外定义inline 函数,则必须将类定义和成员函数的定义都放在同一个头文件中(或者写在同一个源文件中)。每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间。p-hour 表示 p 当前所指向的对象t 中的成员 hour, (*p).hour也是对象 t 中的成员 hour,

2、因为 (*p) 就是对象 t。在 p 指向 t 的前提下, p-hour,(*p).hour 和 t.hour 三者等价。类是一种抽象的数据类型,并不是一个实体, 也不占存储空间,而对象是实际存在的实体,是占存储空间的,其数据成员是有值的,可以被引用的。如果在类的定义中既不指定private,也不制定 public,则系统就默认认为是私有的。当接口与实现 (对数据的操作) 分离时, 只要类的接口没有改变,对私有实现的修改不会影响程序的其他部分。类声明头文件就成为用户使用类库的有效方法和公用接口。包含成员函数定义的文件就是类的实现。2.关于类和对象的进一步讨论构造函数来处理对象的初始化。构造函数

3、的名字必须与类名同名,不具有任何类型,不返回任何值。构造函数的赋值语句是写在构造函数函数体中的,只有在调用构造函数时才执行这些赋值语句,为当前的对象中的数据成员赋值。构造函数不需用户调用,也不能被用户调用。在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句, 但是一般不提倡在构造函数中加入与初始化无关的内容。如果用户自己没有定义构造函数,C+系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。带参数的构造函数中的形参,其对应的实参在定义对象时给定。用这种方法可以方便地实现对不同的对象进行不同的初始化。还可以使用参数初始化表来实现对数据成员的

4、初始化,例如:Box:Box(int h,int w,int l):height(h),width(w),length(l) 可以定义多个构造函数,但是形参不能相同,编译系统是根据函数调用的形式来确定对应的函数的。在调用构造函数时不必给出实参的构造函数,称为默认构造函数,一个类只能有一个默认构造函数否则,系统就无法辨别应执行哪个构造函数。尽管在一个类中可以包含多个构造函数,但是对每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。析构函数也是一个特殊的成员函数,对象生命周期结束时会自动执行析构函数。st

5、atic 局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main 函数结束或调用exit 函数结束程序时,才调用 static 局部对象的析构函数。析构函数不返回任何值,没有函数类型,也没有函数参数。由于没有函数参数, 它不嗯给你被重载。 一个类可以有多个构造函数,但是只能有一个析构函数。析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作。它还可以被用来执行 “用户希望在最后一次使用对象之后所执行的任何操作”。想让析构函数完成任何工作,都必须在定义的析构函数中指定。先构造的后析构,后构造的先析构(越早被创建,对象越早被撤销。)数组不仅可以由简单变量组成

6、,也可以由对象组成。在建立数组时,同样要调用构造函数。在需要时可以在定义数组时提供实参以实现初始化。如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供实参。编译系统只为每个对象元素的构造函数传递一个实参,所以在定义数组时提供的实参个数不能超过数组元素个数。在建立对象数组时,分别调用构造函数,对每个元素初始化。每一个元素的实参分别用括号包起来,对应构造函数的一组形参,不会混淆。指针可以用来指向一般的变量,也可以指向对象。对象空间的起始地址就是对象的指针。在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,成为this。它是指向本类对象的指针。它的值是当前被调用的成

7、员函数所在的对象的起始地址。this 指针是隐式使用的,它是作为参数被传递给成员函数的。如果一个对象被声明为常对象,则不鞥呢调用该对象的非const 型成员函数。把函数声明为可变的数据成员(mutable int count;),就可以用声明为 const 的成员函数来修改它的值。常数据成员只能通过构造函数的参数初始化表对常数据成员进行初始化。如:const int hour; Time:Time(int h):hour(h) 如果要求所有的数据成员的值都不允许改变,则可以将所有的数据成员声明为const,或将对象声明为const(常对象),然后用 const 成员函数引用数据成员,这样起到

8、“双保险” 的作用,切实保证了数据成员不被修改。常成员函数不能调用另一个非const 成员函数。指针变量声明为const 型并将之初始化, 这样指针值始终保持为其初值,不能改变,即其指向始终不变。ru Time t1(10,12,15),t2; Time *const ptr1= ptr1= /错误, ptr1 不能改变指向定义指向对象的常指针的一般形式为类名 *const 指针变量名 =对象地址 ; Time *const ptr1= 定义常变量的指针变量的一般形式为const 类型名*指针变量名;如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它。可以用 new 运算符动态建立

9、对象, 用 delete运算符撤销对象。new Box;编译系统开辟了一段内存空间,并在此内存空间中存放一个Box 类对象,同时调用该类的构造函数,以使该对象初始化。但是无法访问,因为没有名字。称为无名对象,存在但没有名字。用 new 运算符动态地分配内存后,将返回一个指向新对象的指针的值,即所分配的内存空间的起始地址。C+还允许在执行new 时,对新建立的对象进行初始化。Box *pt=new Box(12,15,18); 调用对象既可以通过对象名,也可以通过指针。在不再需要使用由new 建立的对象时,可以用delete 运算符予以释放。如delete pt; 对象之间的赋值也是通过赋值运算

10、符“=”进行的,本来赋值运算符“ =”只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的。一般形式为对象名 1=对象名 2 对象的赋值只能堆其中的数据成员赋值,而不能对成员函数赋值。类的数据成员中不能包括动态分配的数据。对象的赋值,形式为类名 对象 2(对象 1); 复制构造函数也是构造函数,但它只有一个参数,这个参数是本类的对象,而且采用对象的引用的形式(一般约定加const声明,使参数值不能改变, 以免在调用此函数时因不慎而使对象值被修改) 。此复制构造函数的作用就是将实参对象的各数据成员值一一赋给新的对象中对应的数据成员。C+还提供另一种方便用

11、户的复制形式,用赋值号代替括号。其一般形式为类名 对象名 1=对象名 2;对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象, 才能进行赋值。 而对象的赋值则是从无到有地建立一个新对象, 并使它与一个已有的对象完全相同(包括对象的结构和成员的值)。如果想在同类的多个对象之间实现数据共享,也不要用全局对象,可以用静态的数据成员。静态的数据成员在内存中只占一份空间, 每个对象都可以引用这个静态数据成员。只要在类中定义了静态数据成员, 即使不定义对象, 也为静态数据成员分配空间, 它可以被引用。 在一个类中可以有一个或多个静态数据成员。静态数据成员可以初始化,但只能在类体外进行初始化。

12、形式为:数据类型类名:静态数据成员名=初值;注意:不能用参数初始化表对静态数据成员初始化。将变量定义为公用的静态数据成员,所以在类外可以直接引用。 如果静态数据成员被定义为私有的,则不能在类外直接引用,而必须通过公用的成员函数引用。同理,成员函数也可以定义为静态的。与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员。静态成员函数与非静态成员函数的根本区别是:非静态成员函数有 this 指针,而静态成员函数没有this 指针。由此决定了静态成员函数不能访问本类中的非静态成员。静态成员函数可以直接引用本类中的静态数据成员,因为静态数据成员同样是属于类的,可以直

13、接引用, 静态成员函数主要用来访问静态数据成员,而不访问静态成员。 并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。友元可以访问与其有好友关系的类中的私有成员。友元包括友元函数和友元类。如果在本来以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在本类进行声明时在类体中用friend 对该函数进行声明, 此函数就称为本类的友元函数。如果在类的定义体中未声明display 函数为 friend 函数,它是不能引用 Time 中的私有成员的,但注意引用这些私有数据成员时, 必

14、须加上对象名, 因为 display 函数不是 Time 类的成员函数,不能默认引用Time 类的数据成员,必须指定要访问的对象。类的提前声明的使用范围是有限的,只有在正式声明一个类以后才能用它去定义类对象。一个函数(包括普通函数和成员函数)可以被多个类声明为“朋友”,这样就可以引用多个类中的私有成员。将一个类( B)声明为另一个类( A)的“朋友”,这时B 类就是 A 类的友元类,友元类B 中的所有函数都是A 类的友元函数,可以访问A 类中的所有成员。声明友元类的一般形式为friend 类名;友元的关系是单向的不是双向的,友元的关系不能传递,工作中,除非确实有必要,一般并不把整个类声明为友元

15、类。可以定义一个可对任何类型变量进行操作的函数模板。template 类模板是类的抽象,类是类模板的实例。3.运算符的重载运算符重载实质上是函数的重载。一般格式为函数类型operator 运算符名称(形参表列)对运算符的重载处理 operator+是一个函数名。运算符被重载后,其原有的功能仍然保留,没有丧失或改变。C+不允许用户自己定义新的运算符,只能对已有的C+运算符进行重载。 不能重载的运算符只有5 个(“.”, “.*”, “:”,“sizeof”,“ ?:”)重载不能改变运算符运算对象的个数。重载不能改变运算符的结合性。 重载运算符的函数不能有默认的参数。重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个类对象(或类对象的引用)。用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“ coutns1:payendl; 可以看到命名空间的声明方法和使用方法与类差不多。但他们之间有一点差别: 在声明类时在右花括号的后面有一分号,而在定义命名空间时,花括号的后面没有分号。引用命名空间成员的方法是:命名空间名 :命名空间成员名可以为命名空间起一个别名,用来代替较长的命名空间。格式为:namespace 别名=命名空间名 ; 使用 using 命名空间成员名。using声明的有效范围是从using语句开始到 using所在的作用域结束。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号