关于友元函数,运算符重载和类的类型转换

一 关于运算符的重载:
运算符中有10种是不可重载的:
sizeof static_cast<type>
. dynamic_cast<type>
.* const_cast<type>
:: typeid
?= reinterpret_cast<type>
有4种是只可以在类中重载的:
() 【】 = ->

(1)同时在重载时需要有一个参数是用户自己定义的类成员,否则无法使用
(2)运算符的使用方式,及所需参数个数与重载前所需的参数个数相同

重载的格式:

    returntype      operator <op> (    paramlist ){
                                statements ;
                                return type ;
             }

关于<<的重载:
在重载<<运算符时有不同,需要返回输出流的引用:

    ostream &   operator<<(  ostream & os , paramlist_ ){
                                             statemets ;    //     os func as  the cout
                                             return os  ;     //    return the cout
                                             }

二 关于友元函数:
友元函数声明在类中,加上关键字friend即可,但在实现时不需要加上friend也不需要加上类
作用域,因为友元函数并不属于类成员。
而之前的关于输出流重载的例子一般都是采用友元的方式来实现的。

    Defination:
    class   CLASS{
    private:
    ......
    public:
    friend  ostream &   operator<<(  ostream & os , paramlist_ );
    };

    Realization:
     ostream &   operator<<(  ostream & os , paramlist_ ){
                                             statemets ;    //     os func as  the cout
                                             return os  ;     //    return the cout
                                             }

ps:在写类及其实现的函数时需要使用命名空间这样,在编写一个较为大型的项目时会有优势。

三 关于类的类型转换:
类的类型转换分为两种,其中第一种为强制类型转换,第二种为自动转换。
在转换方向上也可分为由一般类型转换为类,由类转换为一般类型。

class Stonewt{
private:
                enum {   Lbs_per_stn = 14 };
                int stone ;
                double pounds ;
                double pds_left ;
public:
                Stonewt(double lbs);                 //       由一般类型转为类的函数1
                Stonewt( int stn , double lbs );   //        由一般类型转为类的函数2
                Stonewt();
                ~Stonewt();
                operator int();                          //     由类转换为一般类型的方法
    };

(1)可以看出,由一般类型转换为类是通过构造函数进行实现的一个方法,但这会带来隐式转换的问题,所以一般在定义时需要加上explicit关键字进行限定,防止隐式转换的出现。
(2)转换为一般函数的方式是通过定义以一般类型名为名的函数,它属于类的成员。
同时也需要注意,它的返回类型不再需要指定,可以直接由函数名得到。
operator int(); 这种方式也会带来隐式转换的问题,但在c++98中没法使用explicit关键字进行
处理,只有在c++11中可以使用关键字explicit。

原文地址:http://blog.51cto.com/13824643/2133023

时间: 2024-10-19 12:14:49

关于友元函数,运算符重载和类的类型转换的相关文章

C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函数调用的方式,只有在设计涉及的代码更容易写,尤其是更容易读的时候才有必要重载. 2.实现运算符重载的方式 类的成员函数 友元函数(即类外的普通函数) 3.运算符重载的原则: 不能重载的运算符有5个:  .  .*  ?: ::  sizeof 运算符重载不允许发明新的运算符 不能改变运算符操作对象的

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

C++学习-类域、友元、运算符重载、对象的生存期,可见域,作用域(2)

一.友元: 1.类的私有成员只有在类的内部访问,类的外部函数不能访问他们. 2.当一个函数定义为类的友元函数,这时函数就可以访问该类的私有成员.同时可以将类B定义为本类A的友元类,这样B类就可以访问类A的任何成员 3.友元函数用friend来声明,基本格式为: friend 函数原型: 4.友元函数的重载:(要想一组重载函数全部成为类的友元,必须意义声明) class exp { public:friend void test(int); }; void test();//not void te

第九周(运算符重载时间类)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第九周(运算符重载时间类) *作者:王忠 *完成日期:2015.5.13 *版本号:v1.0 * *问题描述:实现Time类中的运算符重载.定义对时间对象的自增和自减一目运算符 //一目运算符的重载 CTime operator++(int);//后置++,下一秒 CTime operator++();//前置++,下一秒,前置与后置返回值不一样 CTime operator-

第九周(运算符重载分数类)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第九周(运算符重载分数类) *作者:王忠 *完成日期:2015.5.13*版本号:v1.0 * *问题描述:定义分数的一目运算+和-,分别代表分数取正和求反,将"按位取反运算符"~重载为分数的求倒数运算. *输入描述: *程序输出: #include <iostream> #include <Cmath> using namespace std

C# 类型运算符重载在类继承中的调用测试

这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA { } class CB : CA{ } class CC : CB{ } } void Test(CA oa){//CATest Debug.Log ("CA==============="); } void Test(CB oa){//CBTest Debug.Log ("CB==============="); } void Test(CC oa){//CCTest Debug.Log (&q

第九周(运算符重载复数类)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第九周(运算符重载) *作者:王忠 *完成日期:2015.5.13 *版本号:v1.0 * *问题描述:定义Complex类中的<<和>>运算符的重载,实现输入和输出, *输入描述: *程序输出: #include <iostream> using namespace std; class Complex { public: Complex(){rea

Python 多态 对象常用内置函数 运算符重载 对象迭代器 上下文管理

一 多态 1.什么是多态:多态不是一个具体的技术或代码.指的时候多个不同类型对象可以响应同一个方法,产生不同的结果. 2.使用多多态的好处:提高了程序的灵活性,拓展性 3.如何实现:鸭子类型 就是典型的多态 多种不同类型 使用方法一样 4.案例 class Cat(): def bark(self): print("喵喵喵") def run(self): print("四条腿跑!") def sleep(self): print("趴着睡!")

第八周-运算符重载-Time类中的运算符重载

代码如下: #include <iostream> using namespace std; class CTime { private: unsigned short int hour; //时 unsigned short int minute; //分 unsigned short int second; //秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,int s); void display();