C++類的待用資料成員和靜態成員函數

來源:互聯網
上載者:User

待用資料成員

·用關鍵字static聲明

·當聲明類的資料成員為靜態時,無論建立多少個類的對象,靜態成員都只有一個副本

·在類的所有對象中共用,具有靜態生存期

·若不存在其他的初始化語句,在建立第一個對象時,所有的待用資料成員被初始化為零

·在類外定義和初始化,用範圍解析運算子(::)來指明所屬的類

舉例:

#include <iostream>using namespace std;class Box {public:static int count;    //若該待用資料成員在private部分聲明,則只能通過靜態成員函數處理Box(double l = 2.0, double b = 2.0, double h = 2.0) {cout << "One constructor was called." << endl;length = l, width = b, height = h;count++;//每建立一個對象時加1}double Volume() {return length * width * height;}~Box() { count--; }private:double length, width, height;};//初始化類Box的靜態成員int Box::count = 0;int main(void) {Box Box1(3.3, 1.2, 1.5);Box Box2(8.5, 6.0, 2.0);cout << "Total objects: " << Box::count << endl;//輸出對象的總數return 0;}

靜態成員函數

把成員函式宣告為靜態,就可以把函數與類的任何特定對象獨立開來

·在類對象不存在的情況下也能被調用,使用類名加範圍解析運算子 :: 即可訪問

·靜態成員函數只能訪問靜態成員資料、其他靜態成員函數和類外部的其他函數

·靜態成員函數有一個類範圍,不能訪問類的 this 指標,可以使用靜態成員函數來判斷類的某些對象是否已被建立

·用靜態成員函數訪問非靜態成員,需通過對象

舉例:

#include <iostream>using namespace std;class Box {public:static int count;Box(double l = 2.0, double b = 2.0, double h = 2.0) {cout <<"One constructor was called." << endl;length = l, width = b, height = h;count++;}double Volume() {return length * width * height;}static int getCount() {//靜態成員函數 return count;}private:double length, width, height;};int Box::count = 0;int main(void) {//在建立對象之前輸出對象的總數cout << "Inital Stage Count: " << Box::getCount() << endl;Box Box1(3.3, 1.2, 1.5);Box Box2(8.5, 6.0, 2.0);//在建立對象之後輸出對象的總數cout << "Final Stage Count: " << Box::getCount() << endl;return 0;}

註:

靜態成員函數與普通成員函數的區別:

·靜態成員函數沒有 this 指標,只能訪問靜態成員(包括靜態成員變數和靜態成員函數)

·普通成員函數有 this 指標,可以訪問類中的任意成員;而靜態成員函數沒有 this 指標

使用靜態成員瞭解構造與解構函式的調用情況

#include <iostream>using namespace std;class A {friend class B;//類B是類A的友元 public:static int value;static int num;A(int x, int y) {xp = x, yp = y;value++;cout << "調用構造:" << value << endl;}void displayA() {cout << xp << "," << yp << endl;}~A() {num++;cout << "調用析構:" << num << endl;}private:int xp, yp;};class B {public:B(int x1, int x2) : mpt1(x1 + 2, x2 - 2), mpt2(x1, x2) {cout << "調用構造\n";//mpt是類A的對象,有幾個mpt,有關類A的操作便執行幾次 }void set(int m, int n);void displayB();~B() {cout << "調用析構\n";//解構函式在類結束前調用,類結束的時候釋放類申請的空間} private:A mpt1, mpt2;//將A類的對象聲明為B類的私人資料成員 };int A::value = 0;int A::num = 0;void B::set(int m, int n) {mpt1.xp = m * 2, mpt1.yp = n / 2;}void B::displayB() {mpt1.displayA();}int main() {B p(10, 20);cout << "Hello world!" << endl;B displayB();    //通過友元,使類B輸出類A的私人資料成員return 0;}

相關文章:

C++靜態成員與常成員的使用

C++複習要點總結之五靜態成員變數及成員函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.