1.递增递减运算符

C++语言并不要求递增递减运算符必须是类的成员。可是由于他们改变的正好是所操作对象的状态。所以建议设定为成员函数。

对于递增与递减运算符来说,有前置与后置两个版本号,因此。我们应该为类定义两个版本号的递增与递减运算符。

问题来了。程序是怎样区分前置和后置呢?由于都是++和-- 为了解决问题,后置版本号的递增递减运算符接受一个额外的(不被使用)int类型的形參。当我们使用后置运算符时,编译器为这个形參提供一个值为0的实參。

这个形參唯一的作用就是区分前置和后置运算符函数。

由于不会用到int形參,所以无须为其命名。

样例例如以下:

Person & Person::operator++()//前置版本号的++
{
age++;//only ++ age
return *this;
} Person & Person::operator--()//前置版本号的--
{
age--;
return *this;
} Person & Person::operator++(int)//后置版本号的++
{
Person &p = *this;
age++;
return p;
} Person & Person::operator--(int)//后置版本号的--
{
Person &p = *this;
age--;
return p;
}
int main()
{
Person p1(20, "SCOTT");
Person p2(10, "Kate");
cout << p1 << endl;
p1--;
cout << p1 << endl; return 0;
}

上述代码比較简单,为了方便演示。在我们的Person中仅仅对Person类中的age成员变量进行了递增递减操作。

执行结果:

Init Person

Init Person

p.age: 20, p.name: SCOTT

p.age: 19, p.name: SCOTT

~Person name: 0x8dcc048 age: 10

~Person name: 0x8dcc020 age: 19

2.成员訪问运算符

在迭代器类以及智能指针类中经常见到解引用运算符(*) 与 箭头运算符(->) 。

我们也能够自己定义这两个运算符。

样例:

Person * Person::operator->()
{
return this;
}
Person & Person::operator*()
{
return *this;
}
int main()
{
Person p1(20, "SCOTT");
Person p2(10, "Kate"); cout << p1->getName() << endl;
cout << (*p2).getName() << endl; return 0;
}

执行结果:

Init Person

Init Person

SCOTT

Kate

~Person name: 0x89d7048 age: 10

~Person name: 0x89d7020 age: 20

C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符的更多相关文章

  1. C++ Primer 学习笔记_60_重载操作符与转换 --赋值、下标、成员訪问操作符

    重载操作符与转换 --赋值.下标.成员訪问操作符 一.赋值操作符 类赋值操作符接受类类型形參,通常该形參是对类类型的const引用,但也能够是类类型或对类类型的非const引用.假设未定义这个操作符, ...

  2. C++学习笔记-运算符重载

    运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...

  3. 新标准C++程序设计读书笔记_运算符重载

    形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 class Complex { publ ...

  4. [C++ Primer] : 第14章: 重载运算符与类型转换

    基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...

  5. MOOC C++笔记(四):运算符重载

    第四周:运算符重载 基本概念 运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为. 运算符重载的目的是:扩展C++中提供的运算 ...

  6. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  7. C++中的运算符重载

    首先思考以下几个问题: 1.什么是运算符重载? 2.为什么要重载运算符,它有什么用? 3.可以重载哪些运算符? 4.重载运算符有哪些规则? 一.基本概念 我们在程序中使用各种操作符,比如加(+).赋值 ...

  8. C++:运算符重载

    运算符重载是一种形式的C++多态.运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义.实际上,很多C++运算符已经被重载.eg:将*运算符用于地址,将得到存储在这个地址中的值,将他用于 ...

  9. C++学习(12)—— 运算符重载

    运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 1.加号运算符重载 作用:实现两个自定义数据类型相加的运算 #include <iostream> #i ...

随机推荐

  1. sage开发url替换字符串

    /// <summary>         /// Url字段值替换,无该字段则加入         /// </summary>         /// <param ...

  2. HDOJ 5296 Annoying problem LCA+数据结构

    dfs一遍得到每一个节点的dfs序,对于要插入的节点x分两种情况考虑: 1,假设x能够在集合中的某些点之间,找到左边和右边距离x近期的两个点,即DFS序小于x的DFS序最大点,和大于x的DFS序最小的 ...

  3. Constructor call must be the first statement in a constructor

    super()和this ()不能共存.否则编译时会报异常. Constructorcall must be the first statement in a constructor 换句话说就是su ...

  4. zoj 3820 Building Fire Stations (二分+树的直径)

    Building Fire Stations Time Limit: 5 Seconds      Memory Limit: 131072 KB      Special Judge Marjar ...

  5. angularjs --- ngResource 类似于 ajax发送请求。

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  6. cpc,tank

    先保存一段错误的代码 #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  7. poj_3667线段树区间合并

    对照着notonlysuccess大牛的代码写的 #include<iostream> #include<cstdio> #include<cstring> #in ...

  8. Find and counter

    Find: In a sense, find is the opposite of the [] operator. Instead of taking an index and extracting ...

  9. [转]A reference to a higher version or incompatible assembly cannot be added to the project

    If you face this error message while adding a reference to your project in Visual Studio try the fol ...

  10. PostgreSQL Replication之第三章 理解即时恢复(3)

    3.3 做基础备份 在上一节中,您已经看到,启用归档只需要几行命令,并提供了极大的灵活性.在本节,我们将看到如何创建一个所谓的基础备份,稍后这可以使用XLOG.一个基本备份是一个最初的数据的拷贝. [ ...