美圖欣賞 | 設為首頁 | 加入收藏 | 網站地圖

當前位置:電腦中國 > 編程 > C++ >

C++中的Point類與vector類的簡單處理

2019-10-18 14:49|來源:未知 |作者:dnzg |點擊:

首先設計Vector與Point的表示方法,再依次完善兩個類中的構造函數,復制構造函數等。

向量由兩個點表示,當進行運算的時候,轉化起點坐標為(0,0);

第14行:由于Vector需要用到Point中的x,y ,故設計為友元較為方便;

第13行:因為無法修改ostream與istream類,所以將"<<" ">>"重載為全局函數或者申明為友元;返回os能夠實現"<<"  ">>"的連續使用;

第49行:設計第二個構造函數,以便實現Vector中運算符重載時的返回值的情況;

第59行:防止自復制;

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Point        // Point類 
 5 {
 6     private :
 7         double x,y;
 8     public :    
 9         Point(double x1=0,double y1=0):x(x1),y(y1) {}     // Point構造函數 
10         Point(const Point &rhs);        // Point復制構造函數 
11         Point operator + (const Point & a);        // Point + 
12         Point operator - (const Point & a);        // Point - 
13         friend ostream & operator << (ostream & os , const Point & a);    // Point輸出重載 
14         friend class Vector;    // 友元 
15 };
16 
17 Point::Point(const Point & rhs)        // Point復制構造函數
18 {
19     if(this != &rhs)
20     {
21         x = rhs.x;
22         y = rhs.y;        
23     }
24 }
25 
26 Point Point::operator + (const Point & a)    // Point + 
27 {
28     return Point(x + a.x , y + a.y);
29 } 
30 
31 Point Point::operator - (const Point & a)    // Point -
32 {
33     return Point(x - a.x , y - a.y);
34 }
35 
36 ostream & operator << (ostream & os , const Point & a)        // Point << 
37 {
38     os <<a.x<<","<<a.y;
39     return os;
40 }
41 
42 class Vector     // Vector 類 
43 {
44     private :
45         Point beg,end,_00;
46     public :
47         Vector(double x1=0,double y1=0,double x2=0,double y2=0)        // 構造函數1 
48             :beg(x1,y1),end(x2,y2) {} 
49         Vector(Point beg1,Point end1):beg(beg1),end(end1) {}    // 構造函數2(重載)
50         Vector(const Vector & b);        // 復制構造函數 
51         Vector operator + (const Vector & b);        // Vector + 
52         Vector operator - (const Vector & b);        // Vector -
53         friend ostream & operator << (ostream & os , const Vector & b);        // Vector 輸出重載 << 
54 //        void print();            // 輸出函數          
55 };
56 
57 Vector::Vector(const Vector & rhs1)        // 復制構造函數 
58 {
59     if(this != &rhs1)
60     {
61     beg = rhs1.beg;
62     end = rhs1.end;        
63     }
64 } 
65 
66 Vector Vector::operator + (const Vector & b)        // Vector + 
67 {
68     return Vector(_00 , end  -beg + b.end - b.beg);        // 利用構造函數重載構造 
69 } 
70 
71 Vector Vector::operator - (const Vector & b)    // Vector -
72 {
73     return Vector(_00 , end - beg - b.end + b.beg);
74 }
75 /*
76 void Vector::print()    // 輸出函數 
77 {
78     cout <<"("<<beg.x<<","<<beg.y<<")"<<"\t";
79     cout <<"("<<end.x<<","<<end.y<<")"<<endl<<endl;
80 }
81 */
82 
83 ostream & operator << (ostream & os , const Vector & b)
84 {
85     os <<"("<<b.beg<<")"<<"\t";
86     os <<"("<<b.end<<")"<<endl<<endl;
87     return os;
88 }
89 
90 int main()
91 {
92     Vector ww(0,0,10,10),mm(1,1,5,5);
93 //    ww.print();
94 //    mm.print();
95 //    (ww+mm).print();
96 //    (ww-mm).print();
97     cout<<ww<<mm<<ww-mm<<mm+ww;
98     return 0;
99 }
(責任編輯:dnzg)
足彩半全场是什么意思