C++ 類的相關語法,符號:和::的用法
阿新 • • 發佈:2019-01-06
#include <iostream>
#include <cmath>
using namespace std;
//class 派生類名 : 繼承方式 基類名
//聲明瞭一個類C,類C裡聲明瞭一個成員函式void F(),
//但沒有在類的聲明裡給出F()的定義,那麼在類外定義F()時,
//就要寫成void C::F(),表示這個F()函式是類A的成員函式。
class Point
{
private:
int X,Y;
public:
Point(int xx=0,int yy=0)//類Point的建構函式
{
X=xx;
Y=yy;
}
//拷貝建構函式,Point(Point &p)表示p是point類的一個物件,
//而&p則是這個物件的引用(也就是這個物件的地址)。這是拷貝建構函式的規定,不能變。
Point(Point &p);
int GetX(){return X;}
int GetY(){return Y;}
};
//表示引用成員函式及變數,作用域成員運算子
//例:System::Math::Sqrt()相當於System.Math.Sqrt()
//作用域符號::的前面一般是類名稱,後面一般是該類的成員名稱,
//C++為例避免不同的類有名稱相同的成員而採用作用域的方式進行區分
//如:A,B表示兩個類,在A,B中都有成員member。那麼
// A::member就表示類A中的成員member.
// B::member就表示類B中的成員member.
Point::Point(Point &p)//拷貝建構函式的實現
{
X=p.X;
Y=p.Y;
cout<<"Point拷貝建構函式被呼叫!"<<endl;
}
class Line
{
private:
Point p1,p2;
double len;
public:
Line(Point xp1,Point yp2);//類Line的建構函式
Line(Line &L);
double GetLen(){return len;}
};
//1、初始化列表的作用相當於在建構函式內進行相應成員變數的賦值,但兩者是有差別的。
//2、初始化的順序與成員變數聲名的順序相同。
//例:class myClass
//{
//public :
// myClass();// 建構函式,無返回型別,可以有引數列表,這裡省去
// ~myClass();// 解構函式
// int a;
// const int b;
//}
//myClass::myClass():a(1),b(1)// 初始化列表
//{
//}
//1、
//在初始化列表中是對變數進行初始化,而在建構函式內是進行賦值操作。
//兩都的差別在對於像const型別資料的操作上表現得尤為明顯。
//我們知道,const型別的變數必須在定義時進行初始化,而不能對const型的變數進行賦值,
//因此const型別的成員變數只能(而且必須)在初始化列表中進行初始化,
//即下面的程式碼將會出錯:
//myClass::myClass()
//{
// a = 1;// 沒錯,效果相當於在初始化列表中進行初始化
// b = 1;// 出錯,const變數不能進行賦值操作;
//}
//2、
//myClass::myClass():b(1),a(b)
//{
//}
//這樣的執行結果a,b各是多少呢?b=1,a=1?不是,b=1而a是個隨機數。
//這一點是相當重要,一般在初始化列表中進行初始化時,初始化的順序應與宣告的順序保持一致,
//防止出現不必要的錯誤。
Line::Line(Point xp1,Point yp2):p1(xp1),p2(yp2)//初始化列表
{
cout<<"Line建構函式被呼叫!"<<endl;
double x=double(p1.GetX()-p2.GetX());
double y=double(p1.GetY()-p2.GetY());
len=sqrt(x*x+y*y);
}
Line::Line(Line &L):p1(L.p1),p2(L.p2)
{
cout<<"Line拷貝建構函式被呼叫!"<<endl;
len=L.len;
}
void main()
{
Point myp1(1,1),myp2(4,5);
Line line(myp1,myp2);
Line line2(line);
cout<<"The Length of the line is:";
cout<<line.GetLen()<<endl;
cout<<"The Length of the line2 is:";
cout<<line2.GetLen()<<endl;
}