C++ 類 class的一系列問題

c++類定義

衍生於結構體Struct,
定義了類對象包括什麼(數據成員, 屬性)和可以對這個對象進行什麼操作(操作)。

類定義的一般格式:

class 類名{
//數據成員
《《private:》
	成員1;》
《public:
成員2;》
《protected:
成員3;//函數操作
《《private:》
 函數返回類型 函數名(參數){函數體};》
《public:
成員2;》
《protected:
成員3;}

比如下列代碼:

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

需要注意:

  • {}之內爲類體,定義數據成員和函數操作
  • public, private, protected 爲訪問限定符
    1. 這三種限定符的作用域爲:從該說明符出現開始到下一個說明符之前或類體結束之前
    2. 如果類體開始沒有限定符修飾,默認爲private
    3. 對於訪問,只有public修飾的,可以通過對象訪問,而private和protected不可通過類對象訪問。還有一部分是在繼承處使用

數據成員的訪問

可以通過**直接成員訪問運算符(.)**來訪問成員。

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;   // 長度
      double breadth;  // 寬度
      double height;   // 高度
      double getVolume()
      {
         return length * breadth * height;
      }
};


int main( )
{
   Box Box1;        // 聲明 Box1,類型爲 Box
   Box Box2;        // 聲明 Box2,類型爲 Box
   double volume = 0.0;     // 用於存儲體積
 
   // box 1 詳述
   Box1.height = 5.0; 
   Box1.length = 6.0; 
   Box1.breadth = 7.0;
 
 
   // box 1 的體積
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Box1 的體積:" << volume <<endl;
 
   // box 1的體積
   volume = box1.getVolume()
   cout << "Box2 的體積:" << volume <<endl;
   return 0;
}

對象的創建和引用

  1. 直接定義類的實例–對象
    Box box1
    Box box1(參數值) 涉及到構造函數
  2. 動態創建
    • 創建
      指針變量名 =new類型名(初始化方式)
    • 刪除
      delete 指針名
Box *pbox1=new Box();
delete pnox1;

c++ 類成員函數

1. 在類體內直接定義函數
2. 在類外定義函數

要使用範圍解析運算符 ::,比如說在類內聲明,類外定義函數getVolume():

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

double Box:: getVolume() {
         return length * breadth * height;
      }

注意:

  1. 範圍解析運算符::前面加類名,表明該函數屬於此類中
  2. 成員函數與內聯 inline
    用於消除調用函數是所造成的固定時間的消耗的方法。
    在編譯階段將使用函數的定義體來替代函數調用語句c++內聯函數解釋

默認在類體內實現的成員函數都是內聯的;如果在類體外定義函數,而僅在類體內給出函數聲明,如果要實現內聯,則在類外函數定義前加關鍵字inline


class A
{
    public:
    void Foo(int x, int y);
    
}

inline void A::Foo(int x, int y){} ;

構造函數和析構函數

  1. 構造函數
  • 定義: 類名(參數){}

  • 類的構造函數是類的一種特殊的成員函數,它會在每次創建類的新對象時執行,並在在該對象的生命週期中只會調用一次

  • 構造函數的名稱與類的名稱是完全相同的

  • 無函數返回類型,構造函數可用於爲某些成員變量設置初始值

  • 構造函數可以重載,用不同的參數表區分

  • 若類定義中沒有給出任何構造函數,c++編譯器會自動生成默認的構造函數: 類名 (){},但是,只有程序員定義一個構造函數,系統就不會生成默認的構造函數

//演示重載構造函數
#include <iostream>
#include<cstring>
using namespace std;
 
class CGoods
{
   public:
      CGoods();
      CGoods(char [], int, float);
      CGoods(char[], float);
 
   private:
      char Name[20];
      int Amount;
      float Price;
      float Total_value;
};
// 構造函數定義

 CGoods::CGoods(){
 Name[0]='\0';
 Price=0.0;
 Amount=0;
 Total_value=0.0;
 }
 CGoods::CGoods(char name[], int amount, float price){
 strcpy(Name, name);
 Price=price;
 Amount=amount;
 Total_value=0.0;
 }
 CGoods::CGoods(char name[], float price){
 strcpy(Name, name);
 Price=price;
 Amount=0;
 Total_value=0.0;
 }


注意:

  • 如果想使用默認的構造函數,則在定義對象時不能使用括號
    比如:
    CGoods Car3; Car3爲CGoods類的對象,定義時調用不帶參數的構造函數,
    而,
    CGoods Car4(); 實際上並沒有調用默認的構造函數,而是定義一個函數聲明。

  • 構造函數的另一種初始化方式:

類名(參數列表): 數據成員1(參數值1), 數據成員2(參數值2)[...]

#include <iostream>
#include <stdlib.h>
using namespace std;

class CMyClass {
public:
	CMyClass(int);
	int getx() { return m_x; };
	int gety() { return m_y; };
private:
	int m_x;
	int m_y;
};

CMyClass::CMyClass(int i) : m_y(i), m_x(m_y)
{
};
/*
CMyClass::CMyClass(int i) {
	m_y = i;
	m_x = m_y;
};
*/

int main()
{
	CMyClass a(1);
	cout << a.getx() << endl << a.gety() << endl;
	system("pause");
	return 0;
}

out:

-858993460
1

而正常的在構造函數內部初始化,則不受影響,注意執行一下代碼中註釋的部分
2. 析構函數
在定義一個對象時,C++會自動調用構造函數創建該對象並完成初始化,而當一個對象的生命週期結束時,C++編譯器會自動調用一個特殊的成員函數–析構函數,進行善後工作

  • 析構函數的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作爲前綴
  • 無函數返回類型,並且無任何參數
  • 一個類中有且只能有一個析構函數,可以默認
  • 在註銷對象是,系統會自動調用析構函數,通常在析構函數中完成關閉文件,釋放內存等操作
#include <iostream>
#include <stdlib.h>
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;
   system("pause");
   return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章