1. 程式人生 > >運算子過載,以及迭代器[foreach]示例

運算子過載,以及迭代器[foreach]示例

{
        
publicdouble x, y, z;       

        
public Vector(double x, double y, double z)
        
{
            
this.x = x;
            
this.y = y;
            
this.z = z;
        }


        

        
///<summary>
        
/// 建構函式
        
///</summary>
        
///<param name="rhs"></param>

public Vector(Vector rhs)
        
{
            x 
= rhs.x;
            y 
= rhs.y;
            z 
= rhs.z;
        }


        
///<summary>
        
/// 過載object類的ToString()方法
        
///</summary>
        
///<returns></returns>

publicoverridestring ToString()
        
{
            
return""+ x +" , "+ y +" , "+ z +" )";
        }



        
///<summary>
        
/// 實現IFromattable介面,擴充套件自己的ToString()方法
        
///</summary>
        
///<param name="format"></param>
        
///<param name="formatProvider"></param>
        
///<returns></returns>

publicstring ToString(string format, IFormatProvider formatProvider)
        
{
            
if (format ==null)
                
return ToString();
            
string formatUpper = format.ToUpper();
            
switch (formatUpper)
            
{
                
case"N":
                    
return"|| "+ Norm().ToString() +" ||";
                
case"VE":
                    
return String.Format("( {0:E}, {1:E}, {2:E} )", x, y, z);
                
case"IJK":
                    StringBuilder sb 
=new StringBuilder(x.ToString(), 30);
                    sb.Append(
" i + ");
                    sb.Append(y.ToString());
                    sb.Append(
" j + ");
                    sb.Append(z.ToString());
                    sb.Append(
" k");
                    
return sb.ToString();
                
default:
                    
return ToString();
            }

        }


        
///<summary>
        
/// 索引器
        
///</summary>
        
///<param name="i"></param>
        
///<returns></returns>

publicdoublethis[uint i]
        
{
            
get
            
{
                
switch (i)
                
{
                    
case0:
                        
return x;
                    
case1:
                        
return y;
                    
case2:
                        
return z;
                    
default:
                        
thrownew IndexOutOfRangeException(
                           
"Attempt to retrieve Vector element"+ i);
                }

            }

            
set
            
{
                
switch (i)
                
{
                    
case0:
                        x 
= value;
                        
break;
                    
case1:
                        y 
= value;
                        
break;
                    
case2:
                        z 
= value;
                        
break;
                    
default:
                        
thrownew IndexOutOfRangeException(
                           
"Attempt to set Vector element"+ i);
                }

            }

        }


        
/*  
         * 考慮到精度問題,暫不用下面的寫法來實現==運算子的過載
         * public static bool operator == (Vector lhs, Vector rhs)
                 {
                    if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z)
                       return true;
                    else
                       return false;
                 }
*/


        
privateconstdouble Epsilon =0.0000001;
        

        
///<summary>
        
/// 過載==運算子
        
///</summary>
        
///<param name="lhs"></param>
        
///<param name="rhs"></param>
        
///<returns></returns>

publicstaticbooloperator==(Vector lhs, Vector rhs)
        
{
            
if (System.Math.Abs(lhs.x - rhs.x) < Epsilon &&
               System.Math.Abs(lhs.y 
- rhs.y) < Epsilon &&
               System.Math.Abs(lhs.z 
- rhs.z) < Epsilon)
                
returntrue;
            
else
                
returnfalse;
        }


        
///<summary>
        
/// 過載!=運算子
        
///</summary>
        
///<param name="lhs"></param>
        
///<param name="rhs"></param>
        
///<returns></returns>

publicstaticbooloperator!=(Vector lhs, Vector rhs)
        
{
            
return!(lhs == rhs);
        }



        
///<summary>
        
/// 過載+運算子
        
///</summary>
        
///<param name="lhs"></param>
        
///<param name="rhs"></param>
        
///<returns></returns>

publicstatic Vector operator+(Vector lhs, Vector rhs)
        
{
            Vector Result 
=new Vector(lhs);
            Result.x 
+= rhs.x;
            Result.y 
+= rhs.y;
            Result.z 
+= rhs.z;
            
return Result;
        }


        
///<summary>
        
/// 過載*運算子
        
///</summary>
        
///<param name="lhs"></param>
        
///<param name="rhs"></param>
        
///<returns></returns>

publicstatic Vector operator*(double lhs, Vector rhs)
        
{
            
returnnew Vector(lhs * rhs.x, lhs * rhs.y, lhs * rhs.z);
        }


        
///<summary>
        
/// 過載*運算子
        
///</summary>
        
///<param name="lhs"></param>
        
///<param name="rhs"></param>
        
///<returns></returns>

publicstatic Vector operator*(Vector lhs, double rhs)
        
{
            

相關推薦

運算子過載以及[foreach]示例

{        publicdouble x, y, z;               public Vector(double x, double y, double z)        {            this.x = x;            this.y = y;            

集合Collection介面ArrayList以及的使用以及部分方法。

集合的體系: 目標:集合本身就是一個儲存容器; (存和取) 必須會使用集合儲存物件; 遍歷集合,取出物件; 集合自己的特性; ArrayList:例如儲存int型別資料;集合本身不接收基本型別,自動裝箱的儲存; ArrayList父類是Collec

C++ : 插入反向移動的應用例項

插入迭代器:back_inserter、front_inserter、inserter 流迭代器:istream_iterator(讀取輸入流)、ostream_iterator(讀取輸出流) 反向迭代器:rbegin()、rend()、crbegin()、crend()  

c++ 模版程式設計構造和雙向連結串列

#pragma once #include <iostream> #include <stdexcept> #include "func.h" // 連結串列 template <typename T>class li

敏捷開發學習總結(1):傳統序列式軟體開發方法的缺點以及開發方法的選擇

大部分公司仍使用傳統瀑布模型(或序列式開發方法)進行開發。我所工作過的公司,以及我身邊的朋友工作所在的公司,再加上招聘時從求職者那裡所瞭解到的其他一些公司的開發過程,基本上都是使用傳統的軟體開發模式 ,類擬或者就是瀑布開發模式,這種模式有如下特點:1)將專案的生命週期明確地劃分為幾個階段,完成一個階段才進入下

STL — STL的原理以及失效

當我們對普通iterator型別解引用時,得到對某個元素的非const引用。而如果我們對const_iterator型別解引用時,可以得到一個指向const物件的引用,如同任何常量一樣,該物件不能進行重寫。例如,如果text是vector<string>型別,程式設計師想要遍歷它,輸出每個元素,可

Collection方法集合(hasNext(),next())關於

/*Iterator iterator(),獲取集合所依賴的迭代器物件通過迭代器中的方法完成集合的迭代注意:這種方式是所有集合通用的遍歷方式*/import java.util.*;public class fuck3{public static void main(Stri

集合中使用遍歷的方法

目錄 1.使用迭代器遍歷List集合 package com.jredu.oopch07; import java.util.ArrayList; import java.util.Iterator; import java.util.List

容器遍歷以及Iterator Iterable

迭代器 提供一種方法對一個容器中的各個元素進行訪問,而又不暴露物件容器的內部細節。因為容器的內部結構不同,很多時候不知道該如何去遍歷一個容器中的元素,為了方便操作容器內元素,提供迭代器模式。 在這之前先重溫一下對於已知結構的容器的遍歷方式(傳統

運算子過載

【1】 bool operator > (const Book &p) const { return p.isbn < isbn; } 是對運算子 > 的過載 ,const Book &p 是 對類Book 的引用 &p,p

STL 失效和運算子過載容易錯誤問題

1.一定要小心迭代器失效 1) 容器本身是空的,使用迭代器前,需要檢驗迭代器是否有效。 2) 容器本身增刪失效,erase返回的是下一個迭代器,容器改變了插入刪除了那麼原來的迭代器就很容易失效。 3)容器存放的資料增刪,容器內儘量存放的是結構體,而不是指標,存放指標很容易導

用程式碼來解釋可生成器的區別

一. 創造器(creator) 這是我自己造的一個名詞,因為在python術語中,對只實現了__next__()方法的物件,好像沒有任何名分,為了說明,我將只實現了__next__()方法的物件稱為創造器(creator)。 class O_Next: def __init__(se

day011 函式名的運用閉包

主要內容: 1.函式名的使用以及第一類物件 2.閉包 3.迭代器一、函式名的運用 函式名就是變數名,命名規則與變數名一樣。 函式名儲存的是函式的記憶體地址。 1、檢視函式名的記憶體地址 """python def inf(): print("疏影"

以及生成器

迭代器的特點: 1. 省記憶體 2. 惰性機制, 不訪問__next__() 就沒有值. 3. 只能向前. 不能反覆. 生成器的特點 本質就是迭代器, 生成器函式. 就是把return換成yield 迭代器函式: def func():   pint("真好")   return "還不錯"

物件生成器區別

迭代物件 :實現__iter__方法,返回迭代器。不需要顯示繼承Iterable, 迭代器: 實現_iter__方法,__next__方法,不需要顯示繼承Iterator from collections import Iterable,Iterator def generator():

python的物件生成器理解

上篇文章, python itertools 裡面實現的groupby方法。裡面用到了object, id, iter等很基礎的方法, 看的有點暈。這裡重新整理一下迭代器,可迭代物件, 生成器。複習一下,加深印象。 python語言很容易上手。比如for迴圈。 a = [1, 2,

AttributeError: 'callable_iterator' object has no attribute 'next'python3中的next()方法已變成__next__()

報錯資訊: Traceback (most recent call last):  File "F:/unit1/01_03.py", line 149, in <module>     g = it.next() AttributeEr

Python生成器,可物件

              在瞭解Python的資料結構時,容器(container)、可迭代物件(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推導式(list,set,dic

python3.5進階(三)-------------實現多工之協程(生成器

1.迭代器:迭代是訪問集合元素的一種方式,迭代器是可以記住遍歷的位置的物件,迭代器物件從集合的第一個元素開始訪問,直到所有訪問結束,迭代器只能前進不能後退。判斷一個數據型別是否可以迭代,看是否能for迴圈。如(字串,列表,元祖...)序列可以迭代,數字不能迭代,或通過isintance([11,12

相關的運算過載

__iter__和__next__是在類中自動實現迭代協議的運算過載符。 例如: class square: def __init__(self, start, stop): self.value = start -1 self.stop = stop def __it