天天看點

C/C++類&對象C/C++類&對象

C/C++類&對象

C++ 在 C 語言的基礎上增加了面向對象程式設計,C++ 支援面向對象程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的類型。

類用于指定對象的形式,它包含了資料表示法和用于處理資料的方法。類中的資料和方法稱為類的成員。函數在一個類中被稱為類的成員。

類成員函數

類的成員函數是指那些把定義和原型寫在類定義内部的函數,就像類定義中的其他變量一樣。類成員函數是類的一個成員,它可以操作類的任意對象,可以通路對象中的所有成員。

class Box
{
   public:
      double length;         // 長度
      double breadth;        // 寬度
      double height;         // 高度
      double getVolume(void);// 傳回體積
};
           

成員函數可以定義在類定義内部,或者單獨使用範圍解析運算符 :: 來定義。在類定義中定義的成員函數把函數聲明為内聯的,即便沒有使用 inline 辨別符。是以您可以按照如下方式定義 Volume() 函數:

class Box
{
   public:
      double length;      // 長度
      double breadth;     // 寬度
      double height;      // 高度
   
      double getVolume(void)
      {
         return length * breadth * height;
      }
};
           

也可以定義在類的外部,通過範圍解析運算符來進行類成員函數的定義:

double Box::getVolume(void)
{
    return length * breadth * height;
}
           
#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;         // 長度
      double breadth;        // 寬度
      double height;         // 高度
 
      // 成員函數聲明
      double getVolume(void);
      void setLength( double len );
      void setBreadth( double bre );
      void setHeight( double hei );
};
 
// 成員函數定義
double Box::getVolume(void)
{
    return length * breadth * height;
}
 
void Box::setLength( double len )
{
    length = len;
}
 
void Box::setBreadth( double bre )
{
    breadth = bre;
}
 
void Box::setHeight( double hei )
{
    height = hei;
}
           

構造函數

類的構造函數是類的一種特殊的成員函數,它會在每次建立類的新對象時執行。

構造函數的名稱與類的名稱是完全相同的,并且不會傳回任何類型,也不會傳回 void。構造函數可用于為某些成員變量設定初始值。

不帶入參的構造函數

#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();  // 這是構造函數
 
   private:
      double length;
};
 
// 成員函數定義,包括構造函數
Line::Line(void)
{
    cout << "Object is being created" << endl;
}
 
void Line::setLength( double len )
{
    length = len;
}
 
double Line::getLength( void )
{
    return length;
}
// 程式的主函數
int main( )
{
   Line line;
 
   // 設定長度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}
           

帶入參的構造函數

預設的構造函數沒有任何參數,但如果需要,構造函數也可以帶有參數。這樣在建立對象時就會給對象賦初始值,如下面的例子所示:

#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line(double len);  // 這是構造函數
 
   private:
      double length;
};
 
// 成員函數定義,包括構造函數
Line::Line( double len)
{
    cout << "Object is being created, length = " << len << endl;
    length = len;
}
 
void Line::setLength( double len )
{
    length = len;
}
 
double Line::getLength( void )
{
    return length;
}
// 程式的主函數
int main( )
{
   Line line(10.0);
 
   // 擷取預設設定的長度
   cout << "Length of line : " << line.getLength() <<endl;
   // 再次設定長度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}
           

析構函數

類的析構函數是類的一種特殊的成員函數,它會在每次删除所建立的對象時執行。

析構函數的名稱與類的名稱是完全相同的,隻是在前面加了個波浪号(~)作為字首,它不會傳回任何值,也不能帶有任何參數。析構函數有助于在跳出程式(比如關閉檔案、釋放記憶體等)前釋放資源。

#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();   // 這是構造函數聲明
      ~Line();  // 這是析構函數聲明
 
   private:
      double length;
};
 
// 成員函數定義,包括構造函數
Line::Line(void)
{
    cout << "Object is being created" << endl;
}
Line::~Line(void)
{
    cout << "Object is being deleted" << endl;
}
 
void Line::setLength( double len )
{
    length = len;
}
 
double Line::getLength( void )
{
    return length;
}
// 程式的主函數
int main( )
{
   Line line;
 
   // 設定長度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   return 0;
}
           

輸出為:

Object is being created
Length of line : 6
Object is being deleted
           

拷貝構造函數

拷貝構造函數是一種特殊的構造函數,它在建立對象時,是使用同一類中之前建立的對象來初始化新建立的對象。拷貝構造函數通常用于:

  1. 通過使用另一個同類型的對象來初始化新建立的對象。
  2. 複制對象把它作為參數傳遞給函數。
  3. 複制對象,并從函數傳回這個對象。

如果在類中沒有定義拷貝構造函數,編譯器會自行定義一個。如果類帶有指針變量,并有動态記憶體配置設定,則它必須有一個拷貝構造函數。拷貝構造函數的最常見形式如下,其中obj是一個對象的引用,用于初始化另外一個對象。

classname (const classname &obj) {
   // 構造函數的主體
}
           
#include <iostream>
using namespace std;
class Line
{
   public:
      int getLength( void );
      Line( int len );             // 簡單的構造函數
      Line( const Line &obj);      // 拷貝構造函數
      ~Line();                     // 析構函數
 
   private:
      int *ptr;
};
 
// 成員函數定義,包括構造函數
Line::Line(int len)
{
    cout << "調用構造函數" << endl;
    // 為指針配置設定記憶體
    ptr = new int;
    *ptr = len;
}
 
Line::Line(const Line &obj)
{
    cout << "調用拷貝構造函數并為指針 ptr 配置設定記憶體" << endl;
    ptr = new int;
    *ptr = *obj.ptr; // 拷貝值
}
 
Line::~Line(void)
{
    cout << "釋放記憶體" << endl;
    delete ptr;
}
int Line::getLength( void )
{
    return *ptr;
}
 
void display(Line obj)
{
   cout << "line 大小 : " << obj.getLength() <<endl;
}
 
// 程式的主函數
int main( )
{
   Line line(10);
   display(line);
   return 0;
}
           

類通路修飾符

封裝是面向對象程式設計的一個重要特點,它防止函數直接通路類類型的内部成員。類成員的通路限制是通過在類主體内部對各個區域标記 public、private、protected 來指定的。關鍵字 public、private、protected 稱為通路修飾符。

一個類可以有多個 public、protected 或 private 标記區域。每個标記區域在下一個标記區域開始之前或者在遇到類主體結束右括号之前都是有效的。成員和類的預設通路修飾符是 private。

class Base {
 
   public:
 
  // 公有成員
 
   protected:
 
  // 受保護成員
 
   private:
 
  // 私有成員
 
};
           

public

公有成員在程式中類的外部是可通路的。您可以不使用任何成員函數來設定和擷取公有變量的值.

private

私有成員變量或函數在類的外部是不可通路的,甚至是不可檢視的。隻有類和友元函數可以通路私有成員。

預設情況下,類的所有成員都是私有的。

protected

保護成員變量或函數與私有成員十分相似,但有一點不同,保護成員在派生類(即子類)中是可通路的。

繼續閱讀