c++面向對象 之 基礎 類修飾符 構造函數 友元函數

1,類和對象

定義一個類,本質上是定義一個數據類型的藍圖。這實際上並無定義任何數據,但它定義了類的名稱意味着什麼,也就是說,它定義了類的對象包括了什麼,以及能夠在這個對象上執行哪些操做。html

類定義格式以下:ios

class Box
{
public:    //在類對象做用域內,公共成員在類的外部是可訪問的。
double length; // 盒子的長度
double breadth; // 盒子的寬度
double height; // 盒子的高度
};

聲明類對象:c++

Box Box1; // 聲明 Box1,類型爲 Box
Box Box2; // 聲明 Box2,類型爲 Box

訪問數據成員:函數

#include <iostream>
using namespace std;
class Box
{
public:
double length; // 長度
double breadth; // 寬度
double 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 2 詳述
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// box 1 的體積
volume = Box1.height * Box1.length * Box1.breadth;    //訪問某個實例的類中的某個屬性,一樣用點號,固然還要看共有仍是私有
cout << "Box1 的體積:" << volume <<endl;
// box 2 的體積
volume = Box2.height * Box2.length * Box2.breadth;
cout << "Box2 的體積:" << volume <<endl;
return 0;
}

定義類成員函數:spa

內部定義成員函數:指針

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

外部定義成員函數,必需要使用範圍解析運算符:code

double Box::getVolume(void)    //類名::函數名
{
return length * breadth * height;
}

在外部定義內聯的成員函數,那麼你須要一個關鍵字:inlinehtm

class A
{
    public:void Foo(int x, int y) {  } // 自動地成爲內聯函數
}


// 頭文件
class A
{
    public:
    void Foo(int x, int y);
}
// 定義文件,這個也是內聯函數,注意inline必須與函數定義放在一塊
inline void A::Foo(int x, int y){} 

調用成員函數:對象

#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;
}
// 程序的主函數
int main( )
{
Box Box1; // 聲明 Box1,類型爲 Box
Box Box2; // 聲明 Box2,類型爲 Box
double volume = 0.0; // 用於存儲體積
// box 1 詳述
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 詳述
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// box 1 的體積
volume = Box1.getVolume();
cout << "Box1 的體積:" << volume <<endl;
// box 2 的體積
volume = Box2.getVolume();
cout << "Box2 的體積:" << volume <<endl;
return 0;
}

 2,類訪問修飾符

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

public:blog

#include <iostream> 
using namespace std; 
class Line
{
   public:
      double length;
      void setLength( double len );    //聲明成員函數
      double getLength( void );    
};
 
// 成員函數定義
double Line::getLength(void)    //外部實現成員函數
{
    return length ;
} 
void Line::setLength( double len )
{
    length = len;
} 
// 程序的主函數
int main( )
{
   Line line; 
   // 設置長度
   line.setLength(6.0);     //public支持使用類自帶的成員函數修改屬性值
   cout << "Length of line : " << line.getLength() <<endl; 
   //public一樣支持在外部直接賦值類的屬性 
   line.length = 10.0; // OK: 由於 length 是公有的
   cout << "Length of line : " << line.length <<endl;
   return 0;
}

private:

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
 
   private:
      double width;
};
 
// 成員函數定義,成員函數屬於公有,可是操做的是私有的屬性
double Box::getWidth(void)
{
    return width ;
}
 
void Box::setWidth( double wid )
{
    width = wid;
}
 
// 程序的主函數
int main( )
{
   Box box;
 
   // 對於私有變量width來講,不使用成員函數設置寬度是不行的
   // box.width = 10.0; // Error: 由於 width 是私有的
   box.setWidth(10.0);  // 只能使用成員函數設置寬度,也就是說私有的屬性只有經過它本身定義的方法才能改變,外部不能改變它。
   cout << "Width of box : " << box.getWidth() <<endl;
   return 0;
}

protected:只有本身或者子類的成員函數才能訪問

#include <iostream>
using namespace std;
 
class Box
{
   protected:
      double width;
};
 
class SmallBox:Box // SmallBox 是派生類
{
   public:
      void setSmallWidth( double wid );
      double getSmallWidth( void );
};
 
// 子類的成員函數
double SmallBox::getSmallWidth(void)
{
    return width ;
}
void SmallBox::setSmallWidth( double wid )
{
    width = wid;
}
// 程序的主函數
int main( )
{
   SmallBox box;
   // 使用成員函數設置寬度
   box.setSmallWidth(5.0);
   cout << "Width of box : "<< box.getSmallWidth() << endl;
   return 0;
}
  • 1.private 成員只能被本類成員(類內)和友元訪問,不能被派生類訪問;

  • 2.protected 成員能夠被派生類訪問。

 3,構造函數和析構函數

構造函數:

c++中構造函數的名稱與類的名稱是徹底相同的,而且不會返回任何類型,也不會返回 void。構造函數可用於爲某些成員變量設置初始值。

#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();  // 這是構造函數,構造函數裏帶參數也是能夠的,就和普通函數帶參數同樣
 
   private:
      double length;
};
 
// 成員函數定義,包括構造函數
Line::Line(void)    //定義構造函數,在class裏直接定義也行。
{
    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;
}

構造函數能夠用特殊的格式來初始化類內的某些屬性:

Line::Line( double len): length(len)
{
    cout << "Object is being created, length = " << len << endl;
}

//和下面的代碼效果同樣:
Line::Line( double len)
{
    cout << "Object is being created, length = " << len << endl;
    length = len;
}
//假設有一個類 C,具備多個字段 X、Y、Z 等須要進行初始化,同時初始化多個屬性
C::C( double a, double b, double c): X(a), Y(b), Z(c)
{
  ....
}

析構函數:

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

析構函數的名稱與類的名稱是徹底相同的,只是在前面加了個波浪號(~)做爲前綴,它不會返回任何值,也不能帶有任何參數。析構函數有助於在跳出程序(好比關閉文件、釋放內存等)前釋放資源。

#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;
   //line.~Line();    這樣也是能夠滴,手動析構之後系統仍是會再檢查一遍
   return 0;
}

 4,拷貝構造函數

其實就是拷貝一個對象的實例,儘管聽起來簡單,可是拷貝的時候必定要注意指針或者引用等,當心語法錯誤

#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;    //新建一個int數據類型
    *ptr = len;
}
 
Line::Line(const Line &obj)    //指明瞭要拷貝的是line這個對象,由於這個對象已經被構造過了
{
    cout << "調用拷貝構造函數併爲指針 ptr 分配內存" << endl;
    ptr = new int;
    *ptr = *obj.ptr; //爲啥是指針呢,由於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;
}

返回:

調用構造函數 調用拷貝構造函數併爲指針 ptr 分配內存 line 大小 : 10 釋放內存 釋放內存
//函數聲明等一致的狀況下,拷貝構造函數也能夠是直接複製實例
//接上一個函數
// 程序的主函數
int main( )
{
   Line line1(10);
 
   Line line2 = line1; // 這裏也調用了拷貝構造函數
 
   display(line1);
   display(line2);
 
   return 0;
}

返回是這樣的:

調用構造函數 調用拷貝構造函數併爲指針 ptr 分配內存 調用拷貝構造函數併爲指針 ptr 分配內存 line 大小 : 10 釋放內存 調用拷貝構造函數併爲指針 ptr 分配內存 line 大小 : 10 釋放內存 釋放內存 釋放內存

5,友元函數

友元函數不是類的成員函數,而是定義在類的外部,可是又能訪問私有和保護成員的函數,友元函數用friend指定。

class Box
{
   double width;
public:
   double length;
   friend void printWidth( Box box );
   void setWidth( double wid );
};
#include <iostream>
 
using namespace std;
 
class Box
{
   double width;
public:
   friend void printWidth( Box box );    //注意此處的友元函數傳遞的參數是類實例哦。
   void setWidth( double wid );
};

// 成員函數定義
void Box::setWidth( double wid )
{
    width = wid;
}

// 請注意:printWidth() 不是任何類的成員函數
void printWidth( Box box )
{
   /* 由於 printWidth() 是 Box 的友元,它能夠直接訪問該類的任何成員 */
   cout << "Width of box : " << box.width <<endl;
}
 
// 程序的主函數
int main( )
{
   Box box;
 
   // 使用成員函數設置寬度
   box.setWidth(10.0);
   
   // 使用友元函數輸出寬度
   printWidth( box );
 
   return 0;
}
相關文章
相關標籤/搜索