C++自学笔记_重载运算符_《C++ Primer》

#include <iostream>
#include <stdexcept>

using namespace std;

class CheckedPtr{
public:
    CheckedPtr(int *b,int *e,int *c):
        beg(b),end(e),curr(c){ }
    CheckedPtr(const CheckedPtr &obj):   //复制构造函数
        beg(obj.beg),end(obj.end),curr(obj.curr){ }
    CheckedPtr& operator++();            //prefix operators
    CheckedPtr& operator--();            //prefix operators
    CheckedPtr& operator++(int);         //postfix operators
    CheckedPtr& operator--(int);         //postfix operators
    int& operator[](const size_t);       //重载下标运算符
    const int& operator[](const size_t) const;
    int& operator*();                    //重载解解引用操作符
    const int& operator*() const;
    friend bool operator==(const CheckedPtr&,const CheckedPtr&);        //重载=运算符
    friend bool operator!=(const CheckedPtr&,const CheckedPtr&);        //重载!=运算符
    friend bool operator<(const CheckedPtr&,const CheckedPtr&);         //重载<运算符
    friend bool operator>(const CheckedPtr&,const CheckedPtr&);         //重载>运算符
    friend bool operator<=(const CheckedPtr&,const CheckedPtr&);        //重载<=运算符
    friend bool operator>=(const CheckedPtr&,const CheckedPtr&);        //重载>=运算符
    friend CheckedPtr operator+(const CheckedPtr&,const size_t);        //重载+运算符
    friend CheckedPtr operator-(const CheckedPtr&,const size_t);        //重载-运算符
private:
    int *beg;
    int *end;
    int *curr;
};

CheckedPtr& CheckedPtr::operator++(){
    if(curr==end)
        throw out_of_range("increment past the end of CheckedPtr");
    ++curr;
    return *this;
}

CheckedPtr& CheckedPtr::operator--(){
    if(curr==beg)
        throw out_of_range("decrement past the beginning of CheckedPtr");
    --curr;
    return *this;
}

CheckedPtr& CheckedPtr::operator++(int){
    CheckedPtr ret(*this);
    ++*this;
    return ret;
}

CheckedPtr& CheckedPtr::operator--(int){
    CheckedPtr ret(*this);
    --*this;
    return ret;
}

    /*习题14.23*/
int& CheckedPtr::operator[](const size_t index){
    if(index+beg>=end||index+beg<beg)        //此处的end指向数组最后一个元素的下一个位置,所以有等号
        throw out_of_range("invalid index");
    return *(beg+index);
}

const int& CheckedPtr::operator[](const size_t index) const{
    if(index+beg>=end||index+beg<beg)
        throw out_of_range("invalid index");
    return *(beg+index);
}

int& CheckedPtr::operator*(){
    if(curr==end)
        throw out_of_range("invalid current pointer*");
    return *curr;
}

const int& CheckedPtr::operator*() const{
    if(curr==end)
        throw out_of_range("invalid current pointer*");
    return *curr;
}

    /*习题14.25*/
bool operator==(const CheckedPtr &obj1,const CheckedPtr &obj2){
    return obj1.beg==obj2.beg&&obj1.end==obj2.end&&obj1.curr==obj2.curr;
}

bool operator!=(const CheckedPtr &obj1,CheckedPtr &obj2){
    return !(obj1==obj2);
}

bool operator<(const CheckedPtr &obj1,const CheckedPtr &obj2){
    return obj1.beg==obj2.beg&&obj1.end==obj2.end&&obj1.curr<obj2.curr;
}

bool operator>(const CheckedPtr &obj1,const CheckedPtr &obj2){
    return obj1.beg==obj2.beg&&obj1.end==obj2.end&&obj1.curr>obj2.curr;
}

bool operator<=(const CheckedPtr &obj1,const CheckedPtr &obj2){
    return !(obj1>obj2);
}

bool operator>=(const CheckedPtr &obj1,const CheckedPtr &obj2){
    return !(obj1<obj2);
}

    /*习题14.26*/
CheckedPtr operator+(const CheckedPtr &obj,const size_t n){
    CheckedPtr tmp(obj);
    if(obj.curr+n>=obj.end)
        throw out_of_range("too large n");
    tmp.curr+=n;
    return tmp;
}

CheckedPtr operator-(const CheckedPtr &obj,const size_t n){
    CheckedPtr tmp(obj);
    if(obj.curr-n<obj.beg)
        throw out_of_range("too large n");
    return tmp;
}
时间: 2024-09-28 18:37:50

C++自学笔记_重载运算符_《C++ Primer》的相关文章

逻辑运算_三元运算符_程序流程控制

 //逻辑运算符   /*       逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 .      "&"和"&&"的区别: 单&时,左边无论真假,右边都进行运算:       双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算.       "|"和"||"的区别同理,||表示:当左边为真

C++_重载运算符&lt;&lt; 使自定义数据可以用cout输出

通过重载运算符<< 输出数据注意事项不能将返回的 ostream 加上const 限定,因为返回的 ostream流对象可能还会插入其他符号如endl 等等. 出错的片段 const ostream& operator<<(ostream &output, const Point &a){ return output << a.x << " " << a.y ; } 正确的代码与完整测试程序: #inc

C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】

重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的非explicit构造函数定义一个隐式转换.当提供了实參类型的对象须要一个类类型的对象时.编译器将使用该转换. 于是:这样的构造函数定义了到类类型的转换. 除了定义到类类型的转换之外,还能够定义从类类型到其它类型的转换.即:我们能够定义转换操作符,给定类类型的对象.该操作符将产生其它类型的对象.和其它转换一样,编译器将自己主动应用这个转换. 一.转换为什么实用? 定义一个SmallInt的类,该类实现安全小整

C编译器剖析_4.2 语义检查_表达式的语义检查(7)_二元运算符_赋值运算_条件表达式

在前文对语义检查进行简介时,我们已初步介绍过用于对二元运算符表达式进行语义检查的函数CheckBinaryExpression,为了阅读方便,这里我们再次给出图4.2.2.在本小节中,我们准备对第1126至1144行中的各个函数进行讨论. 图4.2.2 CheckBinaryExpression() 对于形如a+b的二元运算表达式,我们要通过在前面章节中介绍的函数CommonRealType来求得整个表达式a+b的类型,如果a为int型且b为double型,则表达式a+b的类型为double.在

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

.Net基础篇_学习笔记_第四天_关系运算符和逻辑运算符

1.关系运算符 包含:>   <   <=  >=   ==  != 以及bool类型中的true和false. 2.逻辑运算符 与 && 或 || 非 ! 注意: 逻辑运算符的两边放的一般都是关系表达式或者bool类型的值 3.复合运算符 +=  -= *= /= 另外:扩充延伸....... 判断是否为闰年? using System; using System.Collections.Generic; using System.Linq; using Syst

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++ Primer 学习笔记_108(大结局!!!)_特殊工具与技术 --固有的不可移植的特征[下]

特殊工具与技术[大结局] --固有的不可移植的特征[下] 三.链接指示:extern "C" C++ 程序有时需要调用用其他程序设计语言编写的函数,最常见的一语言是C 语言.像任何名字一样,必须声明用其他语言编写的函数的名字,该声明必须指定返回类型和形参表.编译器按处理普通 C++ 函数一样的方式检查对外部语言函数的调用,但是,编译器一般必须产生不同的代码来调用用其他语言编写的函数.C++ 使用链接指示指出任意非 C++ 函数所用的语言. 1.声明非C++函数 链接指示不能出现在类定义

c++笔记--关于箭头运算符重载使用

在stl里面,list的迭代器有重载箭头运算符.之前没搞清楚这个有什么用,看了一些资料,加上自己前面一篇笔记. 写了下面测试程序: 1 #include <iostream> 2 #include <queue> 3 #include <climits> 4 #include <algorithm> 5 #include <memory.h> 6 #include <stdio.h> 7 #include <map> 8