C++ 运算符重载三(链式编程)

//运算符重载之链式编程
#include<iostream>
using namespace std;

//对于友元函数重载运算符只适用于左操作数是系统变量的场景
//因为成员无法在系统变量中添加类成员函数,只能靠全局函数来实现
//链式编程的本质是:函数返回值当左值
class Point
{
public:
    //注意友元函数中,返回值不同,友元函数就会不同,跟函数重载有区别
    friend ostream & operator<<(ostream &out, Point& pin);
    Point(int x,int y){
        this->x = x;
        this->y = y;
    }
    Point(Point &p){
        this->x = p.x;
        this->y = p.y;
        cout << "拷贝构造函数被执行了1" << endl;
    }
    ~Point(){
        cout << "析构函数被执行了2" << endl;
    }
    void PrintfA(){
        cout << "x=" << this->x << endl;
        cout << "y=" << this->y << endl;

    }

private:
    int x;
    int y;
};

//第一个版本(非链式编程)
/*
void operator<<(ostream &out, Point& pin){
    out << "x=" << pin.x << endl;
    out << "y=" << pin.y << endl;
}
*/

//第二个版本(链式编程)
ostream & operator<<(ostream &out, Point& pin){
    out << "x=" << pin.x << endl;
    out << "y=" << pin.y << endl;
    return out;
}

void ProtectA(){
    Point p1(5, 5);
    //需求:我们需要打印这个类对象,而系统无法打印自定义的类,那么我们必须重载<<运算符
    //对于二元运算符,补充一点,两个操作数的位置也很关键
    //例如:cout << p1,左操作数是cout,右操作数是p1,如果写成类成员函数  那么必须  cout.operator<<(p1)
    //这里我们显然无法在cout这个对象对应的类中添加运算符重载,只能使用友元函数
    cout << p1;
    //步骤1:首先承认运算符重载是一个函数,写出函数名
    //operator<<()
    //步骤2:根据操作数,写出参数列表
    //operator<<(cout,p1)
    //步骤3:根据业务完成函数返回值,以及实现函数
    //void operator<<(cout,p1)  cout的类型是 ostream

    //现在开始引入链式编程
    //对于 cout << p1<<"asdfasdfas"<<endl;
    //cout << p1 << "asdfasdfas" << endl;     报错 error C2296: “<<”: 非法,左操作数包含“void”类型
    //意思是  void类型没有重载运算符<<,而实际上cout << p1函数应该返回cout变量,那么就可以实现输出"asdfasdfas"
    //因此修改产生版本二
    cout << p1 << "asdfasdfas" << endl;
}

void main(){
    ProtectA();
    system("pause");
}
时间: 2024-08-27 05:22:54

C++ 运算符重载三(链式编程)的相关文章

数往知来 JQuery_选择器_隐式迭代_链式编程 &lt;二十&gt;

一.通过js实现页面加载完毕执行代码的方式与jquery的区别 1.通过jquery的方式可以 让多个方法被执行,而通过window.onload的方式只能执行最后一个, 因为最后一次注册的方法会把前面的方法覆盖掉 1. window.onload需要等待页面的所有元素资源比如说img里的图片一些连接等等都下载完毕后才会触发: 2. 而jquery只要页面的标签元素都下载完毕就会触发了 二.$.map(数组,function(ele,index){})函数对数组进行遍历,遍历之后会返回一个新的数

jQuery插件编写及链式编程模型

jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQuery插件,然后像使用jQuery那样来操作DOM.  一.jQuery插件开发快速上手 1.jQuery插件模板 关于jQuery插件的编写,我们可以通过为jQuery.fn增加一个新的函数来编写jQuery插件.属性的名字就是你的插件的名字,其模板如下:

MVVM模式下如何使用ReactiveCocoa响应链式编程&lt;一&gt;

前一阵子公司要求项目从新架构,但又只给不到一个月的时间,这显然是不可能的.但从新架构又是在所难免的,和同事商定后决定一部分交互逻辑比较少的界面先使用MVVM架构,然后慢慢修改.下面整理了一下这次重构的遇到的问题,并希望能给大家一些帮助. 1.ReactiveCocoa的使用 要使用MVVM模式编程收下选择一个框架,当然不仅仅是ReactiveCocoa这一个框架,这里就不多说.当然我也没用过别的,如果哪位看官用过可以多多指教.接下来我就按步骤说了: 第一步:导入ReactiveCocoa框架,建

RxJava入门系列三,响应式编程

RxJava入门系列三,响应式编程 在RxJava入门系列一,我向你介绍了RxJava的基础架构.RxJava入门系列二,我向你展示了RxJava提供的多种牛逼操作符.但是你可能仍然没能劝服自己使用RxJava,这一篇博客里我将向你展示RxJava提供的其他优势,没准了解了这些优势,你就真的想去使用RxJava了. 异常处理 直到目前为止,我都没有去介绍onComplete()和onError()方法.这两个方法是用来停止Observable继续发出事件并告知观察者为什么停止(是正常的停止还是因

iOS:用Block写一个链式编程

一.介绍 链式编程是一个比较新颖的编程方式,简单直观,用起来也比较舒服.目前比较有名的Mansory和BabyBlueTooth就是使用链式编程写的第三方框架. 二.写法 链式编程写法不同于传统方式,初次写起来比较别扭,但是一旦习惯了,用起来比较得心应手.那么,如何写呢?其实就是一个对象调用它的实例方法后返回一个block(已经定义过),而这个block内部又返回该对象.依此类推,该对象不论调用多少个它的实例方法,最终都会返回该对象本身. 三.实例 LearnManager类定义和实现 // /

(一一八)利用block实现链式编程

有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up.down.left.right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写: [ball right]; [ball down]; 如果能够按照下面这样写,会更加方便. [[ball right] down]; 要实现这样的功能十分简单,只要每个方法都返回self即可,但是如果调用次数多,会有很多个中括号.如果能改造成后面这样,会更好. ball.right().down

ASP.NET MVC学前篇之扩展方法、链式编程

前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的是外围的知识,有的是包含在框架内的. MVC学前篇字样?有噱头的成分也有真实的成分,所以工欲善其事,必先利其器.器是什么?基础嘛,虽然说MVC框架中涉及到的知识很多很多也不是我一篇两篇能说完的,我能做的就是知道多少就跟大家分享多少,当然了随着时间的推移会完善这个系列. 1扩展方法 扩展方法是C# 3.0特性里的知识,它用在最多的地方是在Linq中,

JavaScript系列:模块化与链式编程

模块化:闭包和和函数作用域(JS没有块级作用域ES6之前)构造模块 1 var man=function(){ 2 var age=12; 3 return { 4 getYear:function(){ 5 return age; 6 }, 7 setYear:function(n){ 8 age=n; 9 } 10 } 11 } 12 13 var peter=man(); 14 document.write(peter.getYear()); //12 15 peter.setYear(2

iOS端JSON转Model链式编程框架SuperKVC使用方法与原理

背景 在client编程中.字典转模型是一个极为常见的问题,苹果提供了KVC来实现NSDictionary到Model的注入,可是KVC仅仅能进行单层浅注入.且无法处理类型转换.key与属性名不正确应.深度注入等问题,笔者从Masonry得到启示,开发了一个通过链式配置注入器实现深度注入.类型转换.key-属性名映射等功能的轻量级注入框架SuperKVC.眼下已经开源到GitHub,点击这里前往.欢迎Star和Fork.欢迎和我一起完好这个框架! 本文将从应用和原理两个角度介绍SuperKVC