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 语句返回一个目标类型的变量。
(三)转换函数不能有参数
概念,今天我们来讨论一下类的作用域:全局作用域、类作用域、块作用域。
(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 语句返回一个目标类型的变量。
(三)转换函数不能有参数
相关文章推荐
- 【C++的探索路8】运算符重载为友元以及可变长数组程序编写
- C++:运算符重载函数之友元运算符重载
- C++_模板类的友元运算符重载_原理
- c++的类成员权限以及友元
- c++中重载操作符表,可以帮助重载哪些操作符,以及到底是重载为类方法还是类的友元方法
- c++第三章 类域、友元、运算符重载
- C++友元函数以及运算符重载
- 【C++学习笔记】优先级队列以及运算符重载
- C++:成员运算符重载函数和友元运算符重载函数的比较
- 浅谈C++ 类型转换以及其在友元方面的应用
- c++ 的sort模板使用以及运算符重载
- 基于c++的运算符重载(二、数组非友元)
- 嵌入式开发之C++基础学习笔记5--静态成员,友元,运算符重载,模板,文件流
- C++默认的构造函数以及运算符重载关键点
- 我的c++学习(8)运算符重载和友元
- C++公有继承、私有继承以及友元
- 浅谈C++ 类型转换以及其在友元方面的应用
- c++知识点----输出宽度填充以及运算符重载
- C++对象初始化以及运算符重载
- c++实现单链表(构造函数 拷贝函数 前插 后插 运算符重载 冒泡排序以及逆置)