您的位置:首页 > 编程语言 > C语言/C++

C++的类域、友元以及运算符重载

2017-11-11 11:01 127 查看
以前学习C语言的时候,变量的作用域分为块作用域、文件作用域、函数作用域以及函数原型作用域,而在C++中,增加了类的

概念,今天我们来讨论一下类的作用域:全局作用域、类作用域、块作用域。

(1)在主函数和其他类的外部定义的类被称为全局类,绝大多数的C++类是定义在该域,而全局类具有全局作用域。

(2)类作用域:当一个类被定义在另一个类之中,就是嵌套类。举个例子,,如果类A定义在类B的内部,而且A的权限是public,

那么就可以把A和B的作用域看成一样的,因为外部可以访问A前提是带有B::A这种形式。如果A的权限是private,则只能在B的内部

创建A对象,无法在B的外部创建。

(3)类的定义在代码块中,则具有块作用域,该作用域仅限于块内使用,不能在块外部使用创建对象。

ps:类名相同时存在覆盖与屏蔽,可以使用::来使用外部类,例如全局类,内部覆盖之后,仍然可以使用::+类名来访问,

也可以使用名称空间。

而由类产生的对象也有其作用域以及生存期,类名是没有生存期的,因为它只是一个类型,而对象是一个实体,对象的生存期也是对象体内

的静态成员的生存期,成员变量随对象的创建而创建,也随对象的撤销而撤销。

对象的生存期、作用域和可见作用域取决于对象的创建位置,存在全局、局部、类内之分,和普通变量差不多。

类在创建前必须定义,仅仅声明是不够的,但是如果仅仅声明一个指向类的指针,或者引用,是可以的。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

友元函数:

友元函数可以分为友元之成员函数和非成员函数,一旦把一个函数或者类定义成类A的友元,它们就可以访问类A的任何成员了。

友元函数:在类的定义中用friend声明一个外部函数或者其他类的成员函数,该函数就可以访问类内部的成员数据了。

注意事项:A类的成员函数作为B类的友元函数时,必须先定义A类,而不仅仅是声明它。

友元函数的重载,友元函数要使用重载,必须把每个都声明成友元函数,否则都只是普通函数。

友元类:类A作为类B的友元时,类A的所有成员函数都可以访问B的成员。

friend <类名>; //友元类类名

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

运算符重载:

C++里面提供一种运算符重载特性,为方便使用,可以在类内定义一些运算符重载,各种符号自定义不同功能,

可以用成员函数或者友元的方式来重载运算符,选择的依据是左值是否自定义的,假如左值为自定义类型,则使用成员函数形式,

左值为非自定义类型,则使用友元形式来重载。

成员函数形式重载运算符:

返回类型operator运算符
(参数表);

使用这种方式进行重载,从外表看上去,就是运算符是函数名,符号不能用作函数名然而加上operator关键字使符号可以成为函数名。

而且成员函数的左操作数无需参数传入,使用隐含的this指针。

友元形式重载运算符:friend返回类型operator
运算符 (参数表);

这种方式适合左操作数为非自定义类型,例如cin 、cout之类的系统提供的类。这种写法传入参数较多,因为不能通过this指针操作。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

类型转换:

我们知道,在C++存在一些类型转换,随着类概念的增加,我们可以自己编写类与其他类型之间的类型转换。

对于类型转换,我们需要关注两点。一、自定义类型->其他类型。二、其他类型->自定义类型

(1)由其他类型转换成自定义类型是由构造函数来实现的,只有当类的定义和实现中提供合适的构造函数时,才能转换成功。

例如一个int 型转换自定义类型,在构造函数的参数列表中,可以有三种情况:

(一)构造函数仅仅包括一个int 类型参数(二)构造函数至少第一个参数为int 型,其他参数都要有默认值。

(三)构造函数虽然不包含int类型的参数,但是包含有非int型参数,而且没有其他参数或者其他参数有默认值,此时int 类型参数可隐式转换成非int 类型。

(2)由自定义类型转换成其他类型,这种形式要通过operator int()这种操作重载函数来实现转换。

在类中定义类型转换函数的形式 :operator 目标类型名();

有几个使用要点:

(一)转换函数必须是成员函数,不能是友元形式。

(二)转换函数不能指定返回类型(不存在返回类型),但在函数体内必须用return 语句返回一个目标类型的变量。

(三)转换函数不能有参数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: