zoukankan      html  css  js  c++  java
  • 重载逗号表达式

    重载逗号表达式的注意点
    • 首先复习一下逗号表达式
    1. 逗号操作符(,)可以构成逗号表达式
    2. 逗号表达式用于将多个子表达式连接为一个表达式
    3. 逗号表达式的值为最后一个子表达式的值
    4. 逗号表达式中的前N-1个子表达式可以没有返回值
    5. 逗号表达式按照从左向右的顺序计算每个子表达式的值
            exp1,exp2,exp3,...,expn
    • 重载逗号表达式
    1. 在C++中重载逗号操作符是合法的
    2. 使用全局函数对逗号操作符进行重载
    3. 重载函数的参数必须有一个是类类型
    4. 重载函数的返回值类型必须是引用
    //重载逗号表达式
    Test& operator , (const Test& a,const Test&b)
    {
        return const_cast<Test&>(b);
    }

    例:
     1 // 重载逗号表达式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
     2 //
     3 #include <iostream>
     4 #include <string>
     5 using namespace std;
     6 class Test
     7 {
     8     int mvalue;
     9 public:
    10     Test(int _val)
    11     {
    12         mvalue = _val;
    13     }
    14     int get_value()
    15     {
    16         return mvalue;
    17     }
    18 };
    19 //重载逗号表达式
    20 Test& operator , (const Test& a,const Test&b)
    21 {
    22     return const_cast<Test&>(b);
    23 }
    24 Test func(Test&i)
    25 {
    26     cout << "Test.mvalue = " << i.get_value() << endl;
    27     return i;
    28 }
    29 int main()
    30 {
    31     Test t0(0);
    32     Test t1(1);
    33     Test t2 = (t0,t1);             //逗号表达式
    34     Test t3 = (func(t0), func(t1));//通常来说,应该是先执行func(t0),在执行func(t1),但是在这儿却相反
    35     cout << "t2.mvalue = " << t2.get_value() << endl;
    36     cout << "t3.mvalue = " << t3.get_value() << endl;
    37 }
    运行结果:
    Test.mvalue = 1
    Test.mvalue = 0
    t2.mvalue = 1
    t3.mvalue = 1
    按照逗号表达式的语法,我们知道逗号表达式中每个子表达式的计算顺序是从左向右,但是如果把逗号操作符重载,将会失去逗号操作符的语义。
    • 问题的本质分析
    1. C++通过函数调用扩展操作符的功能
    2. 进入函数之前必须完成所有参数的计算
    3. 函数参数的计算次序是不定的
    4. 重载后无法严格按照从左向右计算表达式
    5. 工程中不要重载逗号操作符
    • 小结:
    1. 逗号表达式从左向右计算每个子表示的值
    2. 逗号表达式的值为最后一个子表达式的值
    3. 操作符重载无法完全实现逗号操作符的原生意义
    4. 工程开发中不要重载逗号表达式
     
     
     
     
     
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    用代码控制CListCtrl的一行高亮显示或选择的问题
    机械版CG 实验3 变换
    机械版CG 实验5 Bezier曲线
    机械版CG 实验4 裁剪
    Avoiding UpdateData(ZZ)
    机械版CG 实验6 简单光照明模型实现
    机械版CG 实验2 直线生成算法的实现
    最近太忙了,没有时间打理Blog
    仿雅虎首页巨幅广告
    XML串行化,低层类
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12236323.html
Copyright © 2011-2022 走看看