程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++面向對象的編程入門篇-----類(class)

c++面向對象的編程入門篇-----類(class)

編輯:C++入門知識
上兩篇內容我們著重說了結構體相關知識的操作。

以後的內容我們將逐步完全以c++作為主體了,這也以為著我們的教程正式進入面向對象的編程了。

前面的教程我已經再三說明,結構體的掌握非常重要,重要在哪裡呢?重要在結構體和類有相同的特性,但又有很大的區別,類是構成面向對象編程的基礎,但它是和結構體有著機器密切的關系。

我們在c語言中創建一個結構體我們使用如下方法:


//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

struct test
{
private:
int number;
public:
float socre;
};


類的創建方式和結構體幾乎一樣看如下的代碼:


//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

class test
{
private:
int number;
public:
float socre;
public:
int rp()
{
return number;
}
void setnum(int a)
{
number=a;
}
};



但是大家注意到沒有,標准c中是不允許在結構體中聲明函數的,但c++中的類可以,這一點就和c有了本質的區別,很好的體現了c++面向對象的特點!

過去的c語言是一種非面向對象的語言

他的特性是

程序=算法+數據結構

但c++的特性是

對象=算法+數據結構
程序=對象+對象+對象+對象+........

所以根據這一特性,我們在定義一個自己定義的結構體變量的時候,這個變量就應該是叫做對象或者叫實例

例如

test a;
那麼a就是test結構的一個對象(實例)

test結構體內的成員可以叫做是分量,例如:

a.socre=10.1f;
那麼number就是test結構的對象a的分量(或者叫數據成員,或者叫屬性)score;

在c語言中結構體中的各成員他們的默認存儲控制是public 而 c++中類的默認存儲控制是private,所以在類中的成員如果需要外部掉用一定要加上關鍵字public聲明成公有類型,這一特性同樣使用於類中的成員函數,函數的操作方式和普通函數差別並不大

例如上面的例子中的rp()成員函數,我們如故有如下定義

test a;
的話,調用rp()就應該寫成

a.rp();

成員函數的調用和普通成員變量的調用方式一致都采用.的操作符。

這一小節為了鞏固聯系我給出一個完整的例子。

如下(重要和特殊的地方都有詳細的注解):


//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

#include <iostream>
using namespace std;
class test
{
private://私有成員類外不能夠直接訪問
int number;
public://共有成員類外能夠直接訪問
float socre;
public:
int rp()
{
return number;
}
void setnum(int a)
{
number=a;
}
};

void main()
{
test a;
//a.number=10;//錯誤的,私有成員不能外部訪問
a.socre=99.9f;
cout<<a.socre<<endl;//公有成員可以外部訪問
a.setnum(100);//通過公有成員函數setnum()間接對私有成員number進行賦值操作
cout<<a.rp();//間接返回私有成員number的值
cin.get();
}

 

好了,介紹了在類內部定義成員函數(方法)的方法,下面我們要介紹一下域區分符(::)的作用了。

下面我們來看一個例子,利用這個例子中我們要說明兩個重要問題:


//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

#include <iostream>
using namespace std;
int pp=0;
class test
{
private:
int number;
public:
float socre;
int pp;
public:
void rp();
};
void test::rp()//在外部利用域區分符定義test類的成員函數
{
::pp=11;//變量名前加域區分符給全局變量pp賦值
pp=100;//設置結構體變量
}

void main()
{
test a;
test b;
a.rp();
cout<<pp<<endl;
cout<<a.pp<<endl;

cin.get();
}

問題1:


利用域區分符我們可以在類定義的外部設置成員函數,但要注意的是,在類的內部必須預先聲明:

void test::rp()

在函數類型的後面加上類的名稱再加上域區分符(::)再加函數名稱,利用這樣的方法我們就在類的外部建立了一個名為rp的test類大成員函數(方法),可能很多人要問,這麼做有意義嗎?在類的內部寫函數代碼不是更好?
答案是這樣的:在類的定義中,一般成員函數的規模一般都比較小,而且一些特殊的語句是不能夠使用的,而且一般會被自動的設置成為inline(內聯)函數,即使你沒有明確的聲明為inline,那麼為什麼有會被自動設置成為inline呢?因為大多數情況下,類的定義一般是放在頭文件中的,在編譯的時候這些函數的定義也隨之進入頭文件,這樣就會導致被多次編譯,如果是inline的情況,函數定義在調用處擴展,就避免了重復編譯的問題,而且把大量的成員函數都放在類中使用起來也十分不方便,為了避免這種情況的發生,所以c++是允許在外部定義類的成員函數(方法)的,將類定義和其它成員函數定義分開,是面向對象編程的通常做法,我們把類的定義在這裡也就是頭文件了看作是類的外部接口,類的成員函數的定義看成是類的內部實現。寫程序的時候只需要外部接口也就是頭文件即可,這一特點和我們使用標准庫函數的道理是一致的,因為在類的定義中,已經包含了成員函數(方法)的聲明。

問題二

域區分符和外部全局變量和類成員變量之間的關系。

在上面的代碼中我們看到了,外部全局和類內部都有一個叫做pp的整形變量,那麼我們要區分操作他們用什麼方法呢?

使用域區分符就可以做到這一點,在上面的代碼中::pp=11;操作的就是外部的同名稱全局變量,pp=100;操作的就是類內部的成員變量,這一點十分重要!

問題三

一個類的所有對象調用的都是同一段代碼,那麼操作成員變量的時候計算機有是如何知道哪個成員是屬於哪個對象的呢?
這裡牽扯到一個隱藏的this指針的問題,上面的代碼在調用a.rp()的的時候,系統自動傳遞一了個a對象的指針給函數,在內部的時候pp=100;的時候其實就是this->pp=100;

所以你把上面的成員函數寫成如下形勢也是正確的:

void test::rp()
{
::pp=11;
this->pp=100;//this指針就是指向a對象的指針
}

 

類的成員函數和普通函數一樣是可以進行重載操作的,關於重載函數前面已經說過,這裡不

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved