當前位置:首頁 » 密碼管理 » 訪問靜態成員函數

訪問靜態成員函數

發布時間: 2022-09-21 20:46:01

A. C++中非靜態成員函數可以直接訪問靜態成員函數嗎

非靜態可以直接訪問靜態
靜態不可以直接訪問非靜態
因為靜態函數可以直接通過 類::函數 中方式調用,不用通過對象來調用函數,而非靜態函數必須通過對象來調用,這裡面還涉及到實例化對象時候的內存分配。

B. C++中,如何訪問類的靜態成員!

靜態成員不論是共有的還是私有的,只能通過靜態的成員函數才可以訪問,也就是說,普通的成員方法不可以訪問,如果想訪問靜態變數,只能通過靜態函數,這么說你就懂了吧就像下面。
如果你定義了一個:
static
int
n;
那麼就要相應的有一個static的函數,不論這個類的任何對象,都可以通過這個成員函數去訪問,需要注意的是,靜態成員變數是類本身的,不屬於某個對象,也就是說,是所有對象共享的數據。在一個對象里改變了它的值,別的對象里也會改變。從內存的角度講,靜態成員變數和靜態成員函數,所有對象都共享這塊內存,不是生成一個對象就分配一塊。

C. 靜態成員函數中訪問靜態成員與非靜態成員有何區別

C++中靜態成員函數是不能訪問非靜態成員的,但反過來就可以。
因為靜態成員是屬於類的,它可以在類對象沒有被初始化時就訪問,而非靜態成員則必須要在類對象初始化後才會被創建並初始化,所以在C++中靜態函數不能訪問非靜態成員。

D. C++關於靜態成員函數和常成員函數

和靜態數據成員一樣,靜態成員函數是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜態成員函數,要用類名和域運算符「∷」。如
Box∷volume(
);
實際上也允許通過對象名調用靜態成員函數,如
a.volume(
);
但這並不意味著此函數是屬於對象a的,而只是用a的類型而已。
靜態成員函數的作用是為了能處理靜態數據成員。
可以說,靜態成員函數與非靜態成員函數的根本區別是:
非靜態成員函數有this指針,靜態成員函數並不屬於某一對象,它與任何對象都無關,靜態成員函數沒有this指針。由此決定了靜態成員函數不能訪問本類中的非靜態成員。
在C++程序中,靜態成員函數主要用來訪問靜態數據成員,而不訪問非靜態成員。假如在一個靜態成員函數中有以下語句:
cout<<height<<endl;
//若height已聲明為static,則引用本類中的靜態成員,合法
cout<<width<<endl;
//若width是非靜態數據成員,不合法
但是,並不是絕對不能引用本類中的非靜態成員,只是不能進行默認訪問,因為無法知道應該去找哪個對象。如果一定要引用本類的非靜態成員,應該加對象名和成員運算符「.」。如
cout<<a.width<<endl;
//引用本類對象a中的非靜態成員
假設a已定義為Box類對象,且在當前作用域內有效,則此語句合法。
舉例:
#include
<iostream>
using
namespace
std;
class
Student
//定義Student類
{public:
Student(int
n,int
a,float
s):num(n),age(a),score(s){
}
//定義構造函數
void
total(
);
static
float
average(
);
//聲明靜態成員函數
private:
int
num;
int
age;
float
score;
static
float
sum;
//靜態數據成員
static
int
count;
//靜態數據成員
};
void
Student∷total(
)
//定義非靜態成員函數
{sum+=score;
//累加總分
count++;
//累計已統計的人數
}
float
Student∷average(
)
//定義靜態成員函數
{return(sum/count);
}
float
Student∷sum=0;
//對靜態數據成員初始化
int
Student∷count=0;
//對靜態數據成員初始化
int
main(
)
{Student
stud[3]={
//定義對象數組並初始化
Student(1001,18,70),
Student(1002,19,78),
Student(1005,20,98)
};
int
n;
cout<<〃please
input
the
number
of
students:〃;
cin>>n;
//輸入需要求前面多少名學生的平均成績
for(int
i=0;i<n;i++)
//調用3次total函數
stud[i].total(
);
cout<<〃the
average
score
of
〃<<n<<〃
students
is
〃<<Student∷average(
)<<endl;
//調用靜態成員函數
return
0;
}
運行結果為
please
input
the
number
of
students:3↙
the
average
score
of
3
students
is
82.3333
說明:
(1)
在主函數中定義了stud對象數組,為了使程序簡練,只定義它含3個元素,分別存放3個學生的數據。程序的作用是先求用戶指定的n名學生的總分,然後求平均成績(n由用戶輸入)。
(2)
在Student類中定義了兩個靜態數據成員sum(總分)和count(累計需要統計的學生人數),這是由於這兩個數據成員的值是需要進行累加的,它們並不是只屬於某一個對象元素,而是由各對象元素共享的,可以看出:
它們的值是在不斷變化的,而且無論對哪個對象元素而言,都是相同的,而且始終不釋放內存空間。
(3)
total是公有的成員函數,其作用是將一個學生的成績累加到sum中。公有的成員函數可以引用本對象中的一般數據成員(非靜態數據成員),也可以引用類中的靜態數據成員。score是非靜態數據成員,sum和count是靜態數據成員。
(4)
average是靜態成員函數,它可以直接引用私有的靜態數據成員(不必加類名或對象名),函數返回成績的平均值。
(5)
在main函數中,引用total函數要加對象名(今用對象數組元素名),引用靜態成員函數average函數要用類名或對象名。

E. 可以通過對象名訪問靜態成員函數

錯誤的是B
靜態成員函數(注意不是靜態數據成員)可以通過類名或對象名來調用,而非靜態成員函數只能通過對象名來調用
訪問非靜態數據成員必須通過參數傳遞的方式得到對象名,然後通過對象名來訪問

F. 什麼是靜態成員函數。

靜態成員函數的定義與一般成員函數的定義相同,只是在其前面冠以static關鍵字,其定義格式如下 :
class 類名
{

static 類型 函數名(形參)
{ 函數體 }

};
說明:
(1)類的靜態成員函數只能訪問類的靜態數據成員,而不能訪問類中的普通函數成員(非靜態數據成 員),因為普通數據成員只有類的對象存在時才有意義。
(2)靜態成員函數與類相聯系,而不與類的對象相聯系,所以,在類的外部調用類中的公有靜態成員 函數,必須在其左面加上「類名::」,而不是通過對象名調用公有靜態成員函數。在類的外 部不能調用類中的私有靜態成員函數。

G. 什麼叫靜態函數成員,它有何特點

靜態成員:不管這個類創建了多少個對象,靜態成員在內存中只保留一份,靜態成員用來解決同一個類中不同對象之間數據成員和函數的共享問題。

1、靜態成員函數是用關鍵詞static聲明的成員函數,它屬於整個類而並不屬於類的某個對象。

類的靜態成員(變數和方法)屬於類本身,在類載入的時候就會分配內存,可以通過類名直接去訪問;非靜態成員(變數和方法)屬於類的對象,所以只有在類的對象產生(創建類的實例)時才會分配內存,然後通過類的對象(實例)去訪問。

由於靜態函數是獨立於類對象而存在的,因此靜態成員函數中沒有this指針。所以靜態成員函數不可以直接訪問類中的非靜態成員,但是可以直接訪問靜態成員。

若要訪問非靜態成員時,必須通過參數傳遞的方式得到相應的對象,再通過對象來訪問。

H. 為什麼靜態函數只能訪問靜態的數據成員

這個靜態對應的不是動態,沒有對應的詞,普通的就叫「數據成員」和「函數成員」
靜態的意思是跟這個類的對象實例沒關系,是類范圍的,一個類可以生成多個對象,但只有一份靜態數據成員。
普通函數成員會隱式傳遞一個this指針,指向調用這個函數的對象;而靜態函數成員不包括這個指針,所以在靜態成員函數內不能使用非靜態的數據成員和函數。

I. 非靜態成員函數如何來訪問靜態成員函數

加上關鍵字static,該數據成員就是類內的靜態數據成員。先舉一個靜態數據成員的例子。
//Example 5#include <iostream.h>class Myclass;int Myclass::Sum=0;//定義並初始化靜態數據成員Myclass::Myclass(int a,int b,int c)void Myclass::GetSum()void main()
可以看出,靜態數據成員有以下特點:
對於非靜態數據成員,每個類對象都有自己的拷貝。而靜態數據成員被當作是類的成員。無論這個類的對象被定義了多少個,靜態數據成員在程序中也只有一份拷 貝,由該類型的所有對象共享訪問。也就是說,靜態數據成員是該類的所有對象所共有的。對該類的多個對象來說,靜態數據成員只分配一次內存,供所有對象共 用。所以,靜態數據成員的值對每個對象都是一樣的,它的值可以更新;
靜態數據成員存儲在全局數據區。靜態數據成員定義時要分配空間,所以不能在類聲明中定義。在Example 5中,語句int Myclass::Sum=0;是定義靜態數據成員;
靜態數據成員和普通數據成員一樣遵從public,protected,private訪問規則;
因為靜態數據成員在全局數據區分配內存,屬於本類的所有對象共享,所以,它不屬於特定的類對象,在沒有產生類對象時其作用域就可見,即在沒有產生類的實例時,我們就可以操作它;
靜態數據成員初始化與一般數據成員初始化不同。靜態數據成員初始化的格式為:
<數據類型><類名>::<靜態數據成員名>=<值>
類的靜態數據成員有兩種訪問形式:
<類對象名>.<靜態數據成員名> 或 <類類型名>::<靜態數據成員名>
如果靜態數據成員的訪問許可權允許的話(即public的成員),可在程序中,按上述格式來引用靜態數據成員 ;
靜態數據成員主要用在各個對象都有相同的某項屬性的時候。比如對於一個存款類,每個實例的利息都是相同的。所以,應該把利息設為存款類的靜態數據成員。這 有兩個好處,第一,不管定義多少個存款類對象,利息數據成員都共享分配在全局數據區的內存,所以節省存儲空間。第二,一旦利息需要改變時,只要改變一次, 則所有存款類對象的利息全改變過來了;
同全局變數相比,使用靜態數據成員有兩個優勢:
靜態數據成員沒有進入程序的全局名字空間,因此不存在與程序中其它全局名字沖突的可能性;
可以實現信息隱藏。靜態數據成員可以是private成員,而全局變數不能;
2、靜態成員函數
與靜態數據成員一樣,我們也可以創建一個靜態成員函數,它為類的全部服務而不是為某一個類的具體對象服務。靜態成員函數與靜態數據成員一樣,都是類的內部 實現,屬於類定義的一部分。 普通的成員函數一般都隱含了一個this指針,this指針指向類的對象本身,因為普通成員函數總是具體的屬於某個類的具體對象的。通常情況下,this 是預設的。如函數fn()實際上是this->fn()。但是與普通函數相比,靜態成員函數由於不是與任何的對象相聯系,因此它不具有this指 針。從這個意義上講,它無法訪問屬於類對象的非靜態數據成員,也無法訪問非靜態成員函數,它只能調用其餘的靜態成員函數。 下面舉個靜態成員函數的例子。
//Example 6#include <iostream.h>class Myclass;int Myclass::Sum=0;//定義並初始化靜態數據成員Myclass::Myclass(int a,int b,int c)void Myclass::GetSum() //靜態成員函數的實現void main()
關於靜態成員函數,可以總結為以下幾點:
出現在類體外的函數定義不能指定關鍵字static;
靜態成員之間可以相互訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;
非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;
靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;
由於沒有this指針的額外開銷,因此靜態成員函數與類的全局函數相比速度上會有少許的增長;
調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調用靜態成員函數,也可以直接使用如下格式:
<類名>::<靜態成員函數名>(<參數表>)
調用類的靜態成員函數。
===============================================================================================
static靜態變數聲明符。 在聲明它的程序塊,子程序塊或函數內部有效,值保持,在整個程序期間分配存儲器空間,編譯器默認值0。
是C++中很常用的修飾符,它被用來控制變數的存儲方式和可見性。
2、為什麼要引入static?
函數內部定義的變數,在程序執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函數在棧上分配的空間在此函數執行結束時會釋放掉,這樣就產生了一個問題: 如果想將函數中此變數的值保存至下一次調用時,如何實現? 最容易想到的方法是定義一個全局的變數,但定義為一個全局變數有許多缺點,最明顯的缺點是破壞了此變數的訪問范圍(使得在此函數中定義的變數,不僅僅受此函數控制)。
3、什麼時候用static?
需要一個數據對象為整個類而非某個對象服務,同時又力求不破壞類的封裝性,即要求此成員隱藏在類的內部,對外不可見。
4、static的內部機制:
靜態數據成員要在程序一開始運行時就必須存在。因為函數在程序運行中被調用,所以靜態數據成員不能在任何函數內分配空間和初始化。
這樣,它的空間分配有三個可能的地方,一是作為類的外部介面的頭文件,那裡有類聲明;二是類定義的內部實現,那裡有類的成員函數定義;三是應用程序的main()函數前的全局數據聲明和定義處。
靜態數據成員要實際地分配空間,故不能在類的聲明中定義(只能聲明數據成員)。類聲明只聲明一個類的「尺寸和規格」,並不進行實際的內存分配,所以在類聲明中寫成定義是錯誤的。它也不能在頭文件中類聲明的外部定義,因為那會造成在多個使用該類的源文件中,對其重復定義。
static被引入以告知編譯器,將變數存儲在程序的靜態存儲區而非棧上空間,靜態
數據成員按定義出現的先後順序依次初始化,注意靜態成員嵌套時,要保證所嵌套的成員已經初始化了。消除時的順序是初始化的反順序。
5、static的優勢:
可以節省內存,因為它是所有對象所公有的,因此,對多個對象來說,靜態數據成員只存儲一處,供所有對象共用。靜態數據成員的值對每個對象都是一樣,但它的值是可以更新的。只要對靜態數據成員的值更新一次,保證所有對象存取更新後的相同的值,這樣可以提高時間效率。
6、引用靜態數據成員時,採用如下格式:
<類名>::<靜態成員名>
如果靜態數據成員的訪問許可權允許的話(即public的成員),可在程序中,按上述格式
來引用靜態數據成員。
7、注意事項:
(1)類的靜態成員函數是屬於整個類而非類的對象,所以它沒有this指針,這就導致
了它僅能訪問類的靜態數據和靜態成員函數。
(2)不能將靜態成員函數定義為虛函數。
(3)由於靜態成員聲明於類中,操作於其外,所以對其取地址操作,就多少有些特殊
,變數地址是指向其數據類型的指針 ,函數地址類型是一個「nonmember函數指針」。
(4)由於靜態成員函數沒有this指針,所以就差不多等同於nonmember函數,結果就
產生了一個意想不到的好處:成為一個callback函數,使得我們得以將C++和C-based X W
indow系統結合,同時也成功的應用於線程函數身上。
(5)static並沒有增加程序的時空開銷,相反她還縮短了子類對父類靜態成員的訪問
時間,節省了子類的內存空間。
(6)靜態數據成員在<定義或說明>時前面加關鍵字static。
(7)靜態數據成員是靜態存儲的,所以必須對它進行初始化。
(8)靜態成員初始化與一般數據成員初始化不同:
初始化在類體外進行,而前面不加static,以免與一般靜態變數或對象相混淆;
初始化時不加該成員的訪問許可權控制符private,public等;
初始化時使用作用域運算符來標明它所屬類;
所以我們得出靜態數據成員初始化的格式:
<數據類型><類名>::<靜態數據成員名>=<值>
(9)為了防止父類的影響,可以在子類定義一個與父類相同的靜態變數,以屏蔽父類的影響。這里有一點需要注意:我們說靜態成員為父類和子類共享,但我們有重復定義了靜態成員,這會不會引起錯誤呢?不會,我們的編譯器採用了一種絕妙的手法:name-mangling 用以生成唯一的標志。
[編輯本段]static 函數
內部函數和外部函數
當一個源程序由多個源文件組成時,C語言根據函數能否被其它源文件中的函數調用,將函數分為內部函數和外部函數。
1 內部函數(又稱靜態函數)
如果在一個源文件中定義的函數,只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用,這種函數稱為內部函數。
定義一個內部函數,只需在函數類型前再加一個「static」關鍵字即可,如下所示:
static 函數類型 函數名(函數參數表)

關鍵字「static」,譯成中文就是「靜態的」,所以內部函數又稱靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件。
使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名,因為同名也沒有關系。
2 外部函數
外部函數的定義:在定義函數時,如果沒有加關鍵字「static」,或冠以關鍵字「extern」,表示此函數是外部函數:
[extern] 函數類型 函數名(函數參數表)

調用外部函數時,需要對其進行說明:
[extern] 函數類型 函數名(參數類型表)[,函數名2(參數類型表2)……];
[案例]外部函數應用。
(1)文件mainf.c
main()
{ extern void input(…),process(…),output(…);
input(…); process(…); output(…);
}
(2)文件subf1.c
……
extern void input(……) /*定義外部函數*/

(3)文件subf2.c
……
extern void process(……) /*定義外部 函數*/

(4)文件subf3.c
……
extern void output(……) /*定義外部函數*/

另外,團IDC網上有許多產品團購,便宜有口碑

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:332
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:372
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:607
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:27
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:101
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:935
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:734
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:799
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:506
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:368