前言
筆者在大一大二期間學(xué)過 C 和 C++,當時對編程沒有太多理解,加上沒有經(jīng)過大量的代碼練習(xí),所以僅憑借記憶吸收的一點點知識都還給老師了。由于選修了 Visual C++ 課程,加上最近在刷算法,感覺還是有必要把之前學(xué)過的 C++ 語言基礎(chǔ)補起來。時隔兩年重新翻看《C++語言程序設(shè)計》這本書,真后悔自己之前把這么好的一本教材給冷落了。
以下內(nèi)容是我結(jié)合教程例 4-4 ,從代碼層面上對第四章涉及到的基本專業(yè)術(shù)語及類和對象的實現(xiàn)過程的進行的總結(jié)。筆者主要使用 Java 語言,對 Java 語言的特性以及面向?qū)ο缶幊逃幸欢ɡ斫猓砸韵聝?nèi)容都相對精簡,可能不適合小白食用。詳細內(nèi)容可以翻閱清華大學(xué)計算機系列教材《C++ 語言程序設(shè)計 (第四版)》第四章。
源碼如下:
#include <iostream>
using namespace std;
//前項引用聲明
//C++類應(yīng)先定義再使用,但在復(fù)雜場景中可能出現(xiàn)循環(huán)依賴的情況,這時可以使用前向聲明
//在提供一個完整的類定義之前,不能定義該類的對象,不能在內(nèi)聯(lián)成員中使用該類對象
//class Point;
//
//class 類名
class Point {//點類的定義
public://外部接口
//默認構(gòu)造函數(shù),未定義有參構(gòu)造函數(shù)時系統(tǒng)默認生成,對象創(chuàng)建時自動調(diào)用
Point() {};
//有參構(gòu)造函數(shù),將對象初識化為特定狀態(tài),可以是內(nèi)聯(lián)函數(shù)
Point(int xx = 0, int yy = 0) {
x = xx;
y = yy;
cout << "Calling the copyh constructor of Point" << endl;
}
//復(fù)制構(gòu)造函數(shù),用一個已存在的對象初識化另一個同類新對象,形參是本類對象的引用
Point(Point& p);
//析構(gòu)函數(shù),有始有終,在對象生命周期即將結(jié)束時自動調(diào)用,不接收任何參數(shù)
~Point() {};
//內(nèi)聯(lián)函數(shù),編譯時將代碼嵌入調(diào)用處,提高執(zhí)行效率。
//我們將頻繁調(diào)用且代碼簡單的成員函數(shù)聲明為內(nèi)聯(lián)函數(shù),聲明方式分為顯式和隱式
//顯式內(nèi)聯(lián)函數(shù):方法實現(xiàn)在類外邊
inline int getY();
//隱式內(nèi)聯(lián)函數(shù):方法實現(xiàn)在類里邊
int getX() { return x; }
private://私有成員
int x, y;
};
//成員函數(shù)實現(xiàn):
//返回類型 返回類名::方法名(參數(shù)列表)
Point::Point(Point& p)
{
x = p.x;
y = p.y;
}
//返回類型 返回類名::方法名(參數(shù)列表)
int Point::getY()
{
return y;
}
//組合類
class Line {//Line類的定義
public:
//構(gòu)造函數(shù)
Line(Point xp1, Point xp2);
//復(fù)制構(gòu)造函數(shù)
Line(Line& l);
//析構(gòu)函數(shù)
~Line() {};
//內(nèi)聯(lián)函數(shù)
double getLen() { return len; }
private://私有成員
Point p1, p2;
double len;
};
//組合類構(gòu)造函數(shù)實現(xiàn):
//類名::類名(形參表):內(nèi)嵌對象1(形參表):內(nèi)嵌對象2(形參表)
Line::Line(Point xp1, Point xp2) :p1(xp1), p2(xp2)
{
cout << "Calling constructor of Line" << endl;
double x = static_cast<double>(p1.getX() - p2.getX());
double y = static_cast<double>(p1.getY() - p2.getY());
len = sqrt(x * x + y * y);
}
Line::Line(Line& l) :p1(l.p1), p2(l.p2)
{
cout << "Calling constructor of Line" << endl;
len = l.len;
}
int main() {
Point p1(1, 1), p2(4, 5);
Line line1(p1, p2);
Line line2(line1);
cout << "The length of the line1 is:" << line1.getLen() << endl;
cout << "The length of the line2 is:" << line1.getLen() << endl;
return 0;
}
輸出結(jié)果:

image