1. 程式人生 > >【C++】類和物件二

【C++】類和物件二

定義成員函式

所有成員都必須在類內宣告,但是成員函式可以定義在類內也可以定義在類外。
std::string isbn() const { return bookno;}
??? isbn函式是如何獲得bookno成員所依賴的物件呢?緊隨引數列表之後的const關鍵字是怎麼回事???

引入this

成員函式通過一個名為this的額外的隱式引數來訪問呼叫它的那個物件,當我們呼叫成員函式時,實際上是在替某個物件呼叫它,用請求該函式的物件地址初始化this
比如:
Sales_data total;
total.isbn(); //當isbn返回bookno時,隱式的返回total.bookno


等價於虛擬碼 Sales_data::isbn(&total),其中呼叫isbn成員時傳入了total的地址。
this的目的總是指向“這個物件”,所以this是一個常量指標,不允許改變this中儲存的地址。

引入const成員函式

isbn函式中 緊隨引數列表之後的const關鍵字,作用是修改隱式this指標的型別。

預設情況下,this的型別是指向類型別非常量的常量指標,這意味著預設情況下我們不能把this繫結到一個常量物件上。這一情況使得我們不能在一個常量物件上呼叫普通的成員函式,但實際上isbn函式體內不會改變this所指的物件,所以把this設定為指向常量的指標有助於提高函式的靈活性。

面向物件程式設計中,為了體現封裝性,通常不允許直接修改類物件的資料成員。若要修改類物件,應呼叫公有成員函式來完成。為了保證const物件的常量性,編譯器須區分不安全與安全的成員函式(即區分試圖修改類物件與不修改類物件的函式)。

在C++中,只有被宣告為const的成員函式才能被一個const類物件呼叫。要宣告一個const型別的類成員函式,只需要在成員函式引數列表後加上關鍵字const,這樣的成員函式被稱為常量成員函式。

總結:
1)const成員函式可以訪問非const物件的非const資料成員、const資料成員,也可以訪問const物件內的所有資料成員;
2)非const成員函式可以訪問非const物件的非const資料成員、const資料成員,但不可以訪問const物件的任意資料成員;
3)作為一種良好的程式設計風格,在宣告一個成員函式時,若該成員函式並不對資料成員進行修改操作,應儘可能將該成員函式宣告為const 成員函式。
4 ) 常量物件,以及常量物件的引用或指標都只能呼叫常量成員函式。

類作用域

類本身就是一個作用域,編譯器分兩步處理類,首先編譯成員的宣告,然後才輪到成員函式體(如果有的話)。因此,成員函式可隨意使用類中的其他成員而無須在意這些成員出現的次序。

定義一個返回this物件的函式

Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;   //返回呼叫函式的物件
}

當我們呼叫如下的函式時,total.combine(trans);total 的地址被繫結到隱式的this引數上,而rhs繫結到了trans上。因此當執行units_sold += rhs.units_sold 時,效果等同於求total.units_sold和trans.units_sold的和,然後把結果儲存到total.units_sold中。

static靜態成員變數

如果想在同類的多個物件之間實現資料共享,也不要用全域性變數,那麼可以使用靜態成員變數。

/*************************************************************************
    > File Name: static.cpp
    > Author: Tanswer_
    > Mail: [email protected]
    > Created Time: 2016年09月28日 星期三 23時23分08秒
 ************************************************************************/

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
class Student
{
private:
    string name;
    int age;
    float score;
    static int num;
    static float total;
public:
    void Display();
    Student(string, int ,float);
    static float GetAve(); //靜態成員函式
};

int Student::num = 0; //初始化靜態成員變數
float Student::total = 0;

Student::Student(string name1,int age1,float score1)
{
    this -> name = name1;
    this -> age = age1;
    this -> score = score1;
    num++;
    total += score1;
}

void Student::Display()
{
    cout << name << "的年齡" << age << ",分數為 " << score ;
    cout << "當前公有" << num << "名學生" << endl;
}

float Student::GetAve()
{
    return total / num;
}

int main()
{
    //使用匿名物件
    (new Student("小明",19,80)) -> Display();
    (new Student("小紅",20,85)) -> Display();
    (new Student("小華",21,90)) -> Display();
    (new Student("小畫",22,95)) -> Display();
    cout << "平均成績為: " << Student::GetAve() << endl;

    return 0;
}
  1. static 成員變數屬於類,不屬於某個具體的物件,這就意味著,即使建立多個物件,也只為 num 分配一份記憶體,所有物件使用的都是這份記憶體中的資料。當某個物件修改了 num,也會影響到其他物件,所有物件共享這些靜態變數
  2. static 成員變數必須先初始化才能使用,而且只能在類體外進行,否則連結錯誤。
  3. static 成員變數的記憶體空間既不是在宣告類時分配,也不是在建立物件時分配,而是在初始化時分配
  4. static 成員變數與物件無關,不佔用物件的記憶體,而是在所有物件之外開闢記憶體,即使不建立物件也可以訪問,訪問的是同一塊記憶體。
  5. 訪問成員變數的方式:
//通過類來訪問
Student::num = 10;
//通過物件來訪問
Student stu;
stu.num = 10;

static靜態成員函式

當呼叫一個物件的成員函式(非靜態成員函式)時,系統會把當前物件的起始地址賦給 this 指標。而靜態成員函式並不屬於某一物件,它與任何物件都無關,因此靜態成員函式沒有 this 指標。既然它沒有指向某一物件,就無法對該物件中的非靜態成員進行訪問。
靜態成員函式可以直接引用本類中的靜態資料成員,因為靜態成員同樣是屬於類的,可以直接引用。在C++程式中,靜態成員函式主要用來訪問靜態資料成員,而不訪問非靜態成員。

上面例項程式碼中,定義了total 和 num 兩個靜態成員變數,定義了GetAve() 靜態成員函式,只使用了total 和 num 兩個靜態成員變數。

相關推薦

C++物件

定義成員函式 所有成員都必須在類內宣告,但是成員函式可以定義在類內也可以定義在類外。 std::string isbn() const { return bookno;} ??? isbn函式是如何獲得bookno成員所依賴的物件呢?緊隨引數列表之後

C++物件

 一、this指標  關於this指標的一個精典回答:       當你進入一個房子後,       你可以看見桌子、椅子、地板等,       但是房子你是看不到全貌了。       對於一個類的例項來說,       你可以看到它的成員函式、成員變數,       但是例

C++物件(4)

一、類的六個預設成員函式 下面是一個Date類,但是它類中什麼成員也沒有,這就是空類。但是它雖然看起來什麼都沒有,實際上不是的,在我們什麼都不寫的情況下,它會自動生成六個預設的成員函式。如圖所示的建構函式、解構函式、拷貝建構函式、賦值過載函式、普通物件取地址函式、const物件取地址函式這六個函

C++物件(3)—>> this指標

一、this指標的引入 我們在現實中,定義一個類都是根據一個需求來定義的。所以先來看一個常用的日期類 Date 。 class Date { public: void Print() { cout << _year << "-" << _month

C++物件(2)

一、類的作用域 類定義了一個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用 :: 作用域解析符 指明成員屬於哪個類域。否則找不到。 class person { public: void PrintfPersonInfo(); private: char _name

1、C++&物件/建構函式/拷貝建構函式/操作符過載/解構函式

一、C++類 & 物件     C++ 在 C 語言的基礎上增加了面向物件程式設計,C++ 支援面向物件程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的型別。     類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在

C#——物件

一、類和物件的區別 類:類是模型,確定物件將會擁有的特徵(屬性)和行為(方法),類是物件的型別。 類是抽象的概念,僅僅是模板,比如說“人”類 物件是一個能看得到、摸得到的具體實體 物件可以叫做類的例項(Instance) 類不佔記憶體,物件才佔記憶體 二、類的定

C#結構、棧堆、值型別引用型別、里氏替換

目錄 舉例: 一、類和結構的區別: 二、棧和堆的區別: 1.官方解讀: 棧: 是編譯期間就分配好的記憶體空間,因此程式碼中必須就棧的大小有明確的定義; 區域性值型別變數、值型別引數等都在棧的記憶體中。 堆:

c++物件

1、函式過載: 函式名相同,引數列表不同(引數個數或引數型別不同)void f();void f(int x);void f(int x,int y);    僅僅是返回值不同,不能是函式過載  

JavaScript物件

類和物件 如果使用非面向物件的方法建立多個類似物件,情形是這樣的: 一、非面向物件 //第一個學生 var stu1=new Object(); stu1.name=... stu1.age=... stu1.score=... ... //第二

C++初學物件定義與建構函式

一.類和物件定義 class 型別名 { public: 公有成員(外部介面) private: 私有成員(只允許類內函式訪問,有後續操作) protected: 保護成員 二.建構函式 def:給物件進行初始化的函式。 gra: 函式名與類名相同; 無返回值(return); 1.委託

Python引用物件的理解

Overview 在Python中使用變數進行值修改、引數傳遞、以及複製變數等等的過程中,往往會出現一些我們意想不到的“錯誤”。 但實際上產生這些“錯誤”的原因,大多是因為沒有深入地理解Python內部的物件引用機制。 針對於此,筆者大致整理了10個例子,用以循序漸進地幫助大家加

C#EF學習<> DbFirst (先建立資料庫,表及其關聯關係)

工程壓縮檔案放到百度雲盤---20181019001資料夾   1. 建立表的指令碼   create table Teacher ( TID char(12) primary key, Tname char(6) not null ) create table

C++typedef#define的用法與區別

typedef和define都是替一個物件取一個別名,以此增強程式的可讀性,區別如下: (1)原理不同 #define是C語言中定義的語法,是預處理指令,在預處理時進行簡單而機械的字串替換,不作正確性檢查,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。 typedef是關鍵字,在

C++大端小端的理解

我的理解: 記憶體是以位元組為單位的,一個位元組是8位,也就是2位的16進位制,所以首先將資料轉成16進位制,比如下面例子中的0x12345678,就表示了4個位元組的資料。這裡要注意一點,如果將資料改成0x10,那麼這個還是4個位元組的資料,主要是位元組空間是由int所決定的,因此就

C++模板(template)

需求:寫一個可變長度的陣列類Array,用於存放若干元素,個數未知 設計:內部動態申請一個buffer            capacity:表示buffer的大小         &n

C++的朋友(friend)

我把你當朋友,你就能訪問我的一切(是真的一切);但你不將我當作朋友,我就不能訪問你的一切。 定義與使用 在類A中,用friend關鍵字可以將一個全域性函式宣告為該類的“朋友”,也可以將另一個類宣告為該類的“朋友”。 (1)friend宣告語句:位置自由,一般放在類體大括號的

C++中靜態成員的宣告、初始化

【C++】類中靜態成員的宣告、初始化 類中靜態成員的宣告 初始化 靜態資料成員值的改變 完整例子 有參考大佬 零點零一 的文章: https://blog.csdn.net/thanklife/article/details/784

C++的預設成員函式

1.建構函式 2.拷貝建構函式 3.解構函式、 4.運算子過載---實現一個日期計算器 c++類有6個預設成員函式:建構函式,拷貝建構函式,解構函式,賦值操作符過載。取地址操作符過載,const修飾的取地址操作符過載。其中前四個預設成員函式是我們重點研究物件

C++structclass的區別

最近在看一些關於C++的書,然後這個問題不懂就來百度了= =這個文章寫的很好所以來分享~ C++中的struct對C中的struct進行了擴充,它已經不再只是一個包含不同資料型別的資料結構了,它已經獲取了太多的功能。 struct能包含成員函式嗎? 能! struc