c++入门之 再话类
對(duì)于類,其結(jié)構(gòu)并不難,但要理解其設(shè)計(jì)思想也并不容易,在此,我們可以通過(guò)下面的代碼進(jìn)一步理解和使用類:
1 # ifndef VECTOR_H_ 2 # define VECTOR_H_ 3 # include "iostream" 4 5 namespace VECTOR //注意,這里對(duì)這個(gè)類定義了名稱空間,實(shí)際上,在寫自己的類時(shí),也應(yīng)該定義自己的名稱空間 6 { 7 class Vector 8 { 9 public: 10 enum Mode{RECT,POL};//因?yàn)檫@個(gè)量需要用戶自己去設(shè)定 11 private: //注意:私有成員(無(wú)論是函數(shù)還是變量)只能被類內(nèi)部成員訪問(wèn) 12 double x; 13 double y; 14 double mag; 15 double ang; 16 Mode mode; 17 18 void set_mag(); 19 void set_ang(); 20 void set_x(); 21 void set_y(); //體會(huì)將這些函數(shù)放在這里的用意!! 22 public: //共有成員可以被所有訪問(wèn)!!理解這個(gè)意思 23 Vector();//構(gòu)造函數(shù) 24 Vector(double n1,double n2,Mode form = RECT);//注意,這里有默認(rèn)參數(shù) 25 void reset(double n1, double n2, Mode form = RECT); 26 ~Vector();//析構(gòu)函數(shù) 27 double xval() const{ return x; } 28 double yval() const{ return y; } 29 double magval() const{ return mag; } 30 double angval() const{ return ang; } 31 void polar_mode(); 32 void rect_mode(); 33 34 Vector operator+(const Vector &b) const; 35 Vector operator-(const Vector &b) const; 36 Vector operator-() const; 37 Vector operator*(double n) const; 38 39 friend Vector operator*(double n, const Vector &a);//注意這里采用了友元函數(shù)的做法,應(yīng)該顯示包含所有參數(shù) 40 friend std::ostream & operator<<(std::ostream &os, const Vector & v);//昨天沒有思考返回引用是否存在問(wèn)題???因?yàn)榫植孔兞勘讳N毀的問(wèn)題 41 }; 42 43 } 44 # endif該類定義中:除了備注的一些以外,總結(jié)這么幾點(diǎn):
1 定義了一個(gè)類的時(shí)候,限定了該類的名稱空間通常是一件好事,以免自己的變量和別人的發(fā)生了沖突
2? ?公有還是私有并無(wú)界限之分,完全取決于程序的功能。
3? 我們通常會(huì)發(fā)現(xiàn):當(dāng)定義一個(gè)類成員函數(shù)時(shí),通常需要:構(gòu)造函數(shù),析構(gòu)函數(shù),甚至友元函數(shù)
4? 私有成員(無(wú)論是變量還是函數(shù))只能被類內(nèi)部的成員進(jìn)行訪問(wèn),而共有成員 可以被其他類甚至其他任何東西訪問(wèn)。究其本質(zhì):公有部分 是提供的接口
下面給出該定義:
1 # include"cmath" //從下文的調(diào)用方法來(lái)看,這里應(yīng)該是函數(shù)庫(kù),而不是類庫(kù) 2 # include "vector.h" 3 using std::sqrt; //注意 std 包含了很多 4 using std::sin; 5 using std::cos; 6 using std::atan; 7 using std::atan2; 8 using std::cout; 9 10 namespace VECTOR //名稱空間的意義是很有必要的 11 { 12 const double Rad_to_deg = 45.0 / atan(1.0); 13 void Vector::set_ang() 14 { 15 mag = sqrt(x*x + y*y); //求極長(zhǎng) 16 } 17 18 void Vector::set_ang() 19 { 20 if (x == 0.0 && y == 0.0) 21 ang = 0.0; 22 else 23 ang = atan2(y, x);//求極角 24 } 25 26 void Vector::set_x() //這些是私有函數(shù) 27 { 28 x = mag*cos(ang);//私有函數(shù)可以訪問(wèn)私有變量表明私有成員也可以相互訪問(wèn) 29 } 30 31 void Vector::set_y() 32 { 33 y = mag*sin(ang); 34 } 35 36 Vector::Vector() 37 { 38 x = y = mag = ang = 0.0; 39 mode = RECT; 40 } 41 42 Vector::Vector(double n1, double n2, Mode form) 43 { 44 mode = form; 45 if (form == RECT) 46 { 47 x = n1; 48 y = n2; 49 set_mag();//訪問(wèn)了私有成員 50 set_ang();//體會(huì)這里的設(shè)計(jì)思想 51 } 52 else if (form == POL) 53 { 54 mag = n1; 55 ang = n2; 56 set_x(); 57 set_y(); 58 } 59 else 60 { 61 cout << "Incorrect 3rd argument to Vector()--"; 62 cout << "vector set to 0\n"; 63 x = y = mag = ang = 0.0; 64 mode =RECT; 65 } 66 } 67 void Vector::reset(double n1, double n2, Mode form) 68 { 69 mode = form; 70 if (form = RECT) 71 { 72 x = n1; 73 y = n2; 74 set_mag(); 75 set_ang(); 76 } 77 else if (form = POL) 78 { 79 mag = n1; 80 ang= n2; 81 set_x(); 82 set_y(); 83 } 84 else 85 { 86 cout << "Incorrect 3rd argument to Vector()--"; 87 cout << "vector set to 0\n"; 88 x = y = mag = ang = 0.0; 89 mode = RECT; 90 } 91 } 92 Vector::~Vector()// 93 { 94 95 } 96 97 void Vector::polar_mode() 98 { 99 mode = POL; 100 } 101 102 void Vector::rect_mode() 103 { 104 mode = RECT; 105 } 106 107 Vector Vector::operator+(const Vector &b) const 108 { 109 return Vector(x + b.x, y + b.y); 110 } 111 112 Vector Vector::operator-(const Vector &b) const 113 { 114 return Vector(x - b.x, y - b.y); 115 } 116 117 Vector Vector::operator-() const 118 { 119 return Vector(-x, -y); 120 } 121 Vector Vector::operator*(double n) const {return(n*x,x*y)
}
122 Vector operator*(double n, const Vector & a) 123 { 124 return a*n; //注意,雖然這里進(jìn)行了返回,但并沒有結(jié)束,而是繼續(xù)調(diào)用了成員函數(shù), 125 } 126 127 std::ostream & operator<<(std::ostream & os, const Vector & v) 128 { 129 if (v.mode == Vector::RECT) 130 os << "(x,y) = (" << v.x << "," << v.y << ")"; 131 else if (v.mode == Vector::POL) 132 { 133 os << "(m,a) = (" << v.mag << "," << v.ang + Rad_to_deg << ")"; 134 } 135 else 136 os << "Vector object mode is invalid"; 137 } 138 }
?
1.? 我們注意107行和112行的代碼:本質(zhì)上,進(jìn)行了加法和減法之后,得到的是一個(gè)新的類對(duì)象,但由于這個(gè)類對(duì)象不止一種表示形式(直角坐標(biāo)和極坐標(biāo)),這里巧妙的利用了 返回構(gòu)造函數(shù)的執(zhí)行。這告訴我們:構(gòu)造函數(shù)并不僅僅用于初始化,構(gòu)造函數(shù)的本意:構(gòu)造新的對(duì)象,一定要認(rèn)識(shí)這一本質(zhì)特征和思想。
2? 我們注意124行的代碼:return a*n; 本質(zhì)上,對(duì)象乘以一個(gè)數(shù)無(wú)法實(shí)現(xiàn),但這里,其實(shí),并沒有返回,而是回去重新調(diào)用了上面的*。
3 注意:129行和131行:if (v.mode == Vector::RECT)。為何要加Vector::RECT而不是RECT,這是因?yàn)?#xff1a;
友元函數(shù)雖然在public中,但友元函數(shù)并不在類作用域中!!! 這對(duì)于所有友元函數(shù)都成立!!!
?
轉(zhuǎn)載于:https://www.cnblogs.com/shaonianpi/p/9943993.html
總結(jié)
以上是生活随笔為你收集整理的c++入门之 再话类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 迅雷9.1去广告版
- 下一篇: 50代码HTML5 Canvas 3D