- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
走向C 之路
(欢迎baj队长携夫人莅临指导,)WindyWinter感谢诸位前来捧场。 在软件工程学提出面向对象的程序设计方法后,C被迅速扩充为Objected-C,这些内容后来成为C++的一部分。 在这一节中,我们只关注现象。 我们给出一个类声明的例子。 声明一个类,用class关键字,样式和声明一个结构是差不多的。不同的是多了private和public这两个关键字,他们被称作成员的访问权限。声明在public之下的成员用法与结构中的一样,在任何地方都可以直接访问这个成员;声明在private之下的成员,则只能被本类中的成员函数访问,在类外部是不可见的。不过,这一点我们很快就会做出修正。除了这两种访问权限之外,还有一种protected,后面也会讲到他的意义,protected成员的访问权限与private成员一致。 如果声明一个成员之前没有出现访问权限的标识,则默认为private。struct也可以声明一个类,与class的唯一区别是——struct中没有访问权限的成员默认为public。 person类中,三个成员变量与update()函数均是private的,在类之外不能访问。get_namecard()是public的成员函数,可以在类外部被访问。 名称为person,没有返回值类型的那个函数叫做类的构造函数;名称为~person (tilde person)的函数叫做类的析构函数,马上就会讲到他们的作用。最后我们定义了一个person类型的对象,或者叫person类的实例。C中定义结构类型的变量,要在结构名前面加struct关键字,C++中不再有结构的概念,被统一为类,前面说过,类应当被视为一种类型,一个整体,故而声明类类型的变量直接用类的名字就可以了。 我们在person类中声明了一个成员函数get_namecard(),那么,这个函数该怎么定义?一种方法是在声明的地方定义,另一种方法就是将定义写在类声明的外面,用域运算符,就是这两个冒号,指明get_namecard()是person的成员函数。 域运算符也可以用来指明某个标识符是定义在某个namespace中的。这样,可以不写using namespace xxx而引用该namespace下的标识符。 C++标准库的所有内容都统一声明在namespace std中。 通常情况下,指明this和不指明this完全等价,不过存在特殊的情况,想必大家都遇到过,C语言里一个局部变量可以屏蔽全局变量,使得在局部变量的生存周期内被屏蔽的全局变量无效,(提问,有没有人知道是什么特殊情况了?)——某成员函数的形参恰好与类的成员变量同名,在该函数中,成员变量被形参屏蔽,访问时需要用this指针指明。 成员变量被附加的const属性实际上来自于this指针的常量性,其道理很浅显——一个常量实例的任何成员都是右值。这也说明,this指针的存在,是成员函数可以访问成员变量的原因,所以,上面的“与不指明this没有区别”,应该改为“不指明this与指明this没有区别”。 这样的声明,意在向别人说明,调用这个函数之后,成员变量不会发生任何变化。 冒号之后到括号之前,是构造函数特有的初始化列表,每一个成员变量用括号的形式初始化(只能用括号的形式),成员变量之间用逗号分隔。 这三个构造函数分别是不同类型的构造函数: 不带任何参数的叫默认构造函数,如果定义对象时,既没有使用括号的形式初始化,也没有使用=的形式初始化,那么默认构造函数将被调用; 带同类型引用或常量引用为参数的,叫拷贝构造函数,定义对象时,如果用=形式初始化,拷贝构造函数将被调用; 带其他类型参数的,是一般的构造函数,定义对象时,用括号的形式初始化,实际上就是调用对应的构造函数。 当前两种构造函数缺省时,编译器将自动合成缺省的构造函数: 对于内置类型的成员变量,缺省默认构造函数不做任何事情,缺省拷贝构造函数复制其值; 对于类类型的成员变量,缺省默认构造函数将调用该成员变量的默认构造函数,缺省拷贝构造函数调用该成员的拷贝构造函数, 若该成员变量的默认构造函数或拷贝构造函数不可用(下面将会说明为什么不可用),那么将无法通过编译。 不能显式调用构造函数——即构造函数只会在对象定义时被调用一次,今后再无它途。 编译器合成的缺省构造函数有时在编程上带来很多麻烦。 这个构造函数提供了一个C风格字符串到string的隐式类型转换。 分配空间后,该空间的内部结构仍然是不明确的,只有在上面调用过构造函数,一个对象才被真正的创建出来。new运算符将在分配出来的空间上调用构造函数,malloc却无此功能,因此,C++中一般不再使用malloc。 tilde 这也是delete和free的区别,delete将调用析构函数,销毁对象;free只是释放空间。注意,
文档评论(0)