日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

什么是常函数?

發布時間:2023/11/27 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是常函数? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???? 類的成員函數后面加 const,表明這個函數不會對這個類對象的數據成員(準確地說是非靜態數據成員)作任何改變。

???? 在設計類的時候,一個原則就是對于不改變數據成員的成員函數都要在后面加 const,而對于改變數據成員的成員函數不能加 const。所以 const 關鍵字對成員函數的行為作了更加明確的限定:有 const 修飾的成員函數(指 const 放在函數參數表的后面,而不是在函數前面或者參數表內),只能讀取數據成員,不能改變數據成員;沒有 const 修飾的成員函數,對數據成員則是可讀可寫的。

???? 除此之外,在類的成員函數后面加 const 還有什么好處呢?那就是常量(即 const)對象可以調用 const 成員函數,而不能調用非const修飾的函數。正如非const類型的數據可以給const類型的變量賦值一樣,反之則不成立。

請看下面一個完整的例子,然后我再作一些說明。

CODE:

?

#include <iostream>
#include <string>
using namespace std;

class Student {
public:
??Student() {}
??Student( const string& nm, int sc = 0 )
? ? : name( nm ), score( sc ) {}

??void set_student( const string& nm, int sc = 0 )
??{
? ? name = nm;
? ? score = sc;
??}

??const string& get_name() const
??{
? ? return name;
??}

??int get_score() const
??{
? ? return score;
??}

private:
??string name;
??int score;
};

// output student's name and score
void output_student( const Student& student )
{
??cout << student.get_name() << "/t";
??cout << student.get_score() << endl;
}

int main()
{
??Student stu( "Wang", 85 );
??output_student( stu );
}

???? 設 計了一個類 Student,數據成員有 name 和 score,有兩個構造函數,有一個設置成員數據函數 set_student(),各有一個取得 name 和 score 的函數 get_name() 和 get_score()。請注意 get_name() 和 get_score() 后面都加了 const,而 set_student() 后面沒有(也不能有const)。

首先說一點題外話,為什么 get_name() 前面也加 const。如果沒有前后兩個 const 的話,get_name() 返回的是對私有數據成員 name 的引用,所以通過這個引用可以改變私有成員 name 的值,如

CODE:

?

Student stu( "Wang", 85 );
??stu.get_name() = "Li";

???? 即把 name 由原來的 "Wang" 變成了 "Li",而這不是我們希望的發生的。所以在 get_name() 前面加 const 避免這種情況的發生。

???? 那么,get_name() 和 get_score() 這兩個后面應該加 const的成員函數,如果沒有 const 修飾的話可不可以呢?回答是可以!但是這樣做的代價是:const對象將不能再調用這兩個非const成員函數了。如

CODE:

?

const string& get_name(); // 這兩個函數都應該設成 const 型
int get_score();
void output_student( const Student& student )
{
??cout << student.get_name() << "/t"; // 如果 get_name() 和 get_score() 是非const成員函數,這一句和下一句調用是錯誤的
??cout << student.get_score() << endl;
}

???? 由 于參數student表示的是一個對const Student型對象的引用,所以 student 不能調用非const成員函數如 set_student()。如果 get_name() 和 get_score() 成員函數也變成非const型,那么上面的 student.get_name() 和 student.get_score() 的使用就是非法的,這樣就會給我們處理問題造成困難。

???? 因此,我們沒有理由反對使用const,該加const時就應該加上const,這樣使成員函數除了非const的對象之外,const對象也能夠調用它。

?

轉載于:https://www.cnblogs.com/Macchiato1988-10-17/p/4778716.html

總結

以上是生活随笔為你收集整理的什么是常函数?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。