复习笔记(三)——C++类和对象
目錄
- 類和對象在內存中的關系
- this指針
- 類的靜態成員
- 靜態數據成員
- 靜態成員函數
- 指針與對象
- 對象參數的傳遞
- const 對象
- const 數據成員
- const 成員函數
- 存取權限的補充 mutable
類和對象在內存中的關系
一個類的多個對象各自擁有類的數據成員的一個副本。
類的成員函數則被其所有對象共享。
一個類的不同對象響應相同的消息時,調用的是同一個函數。
下面舉個例子:
class Student{ private:Char name[21];Char no[4];Int age;Int score[5]; public:PrintStudent();Student();~ Student();GetTotal();GetAVG(); };this指針
每個對象都有一個指向自身的this指針 (對象的內存地址)
對象調用成員函數時會將自己的this指針傳遞給成員函數(隱含參數) PrintStudent(this);
成員函數訪問對象的所有數據成員都是通過this指針訪問
this指針的另外一個作用——訪問對象自身(*this)
實例:
#include <iostream.h> class Test { public:Test(int n = 0);Test & setData(int n);void print(); private:int data; }; Test::Test(int n){this->data = n; //data=n; } Test & Test::setData(int n) {data = n; //this->data=n;return *this; } void Test::print() {cout<<"data = "<<data<<"!"<<endl; } void main() {Test obj1;cout<<"obj1: ";obj1.setData(100).print(); }執行結果: obj1: data = 100!類的靜態成員
類的數據成員和成員函數都可以聲明為static。
靜態成員解決數據共享的問題。
-實現共享:在類外設置全局變量,但是,全局變量都有局限性,破壞類的完整性 。
類的靜態數據成員可以在類的范圍內存儲數據,這種數據獨立于類類型中的任何對象,但可以由這些對象訪問。
靜態成員函數有一種獨立于對象的計算能力。
類的非靜態成員函數可以訪問類的靜態成員
靜態數據成員
類中的普通成員對每個對象都有一個單獨的副本實例。
類中的靜態數據成員是該類所有對象所共同擁有的,只有一個實例,它不因對象的建立而產生,也不因對象的失效而刪除,它是類定義的一部分,它屬于整個類,即屬于所有對象 。
定義: static 數據類型 數據成員名稱;
初始化:靜態數據成員不能由構造函數初始化,只能在類定義外使用::范圍解析來完成
[static] 數據類型 類名::數據成員名稱=初始值;
訪問:類名::靜態數據成員
示例:
#include <iostream.h>class CFile { private:char *m_fileName; public:static bool saveState;File();File(char *fileName); }; //定義初始化靜態成員 bool CFile::saveState=true;int main() {if(CFile::saveState==true){//文件已保存}else{//文件未保存}return 0; }靜態成員函數
靜態成員函數是操作靜態數據成員的函數。
定義: static 返回類型 函數名(參數列表)
訪問:類名::靜態成員函數
**注意:
①靜態成員函數不能聲明為const因為靜態成員函數與類的對象無關,它沒有this指針,所以不能用const關鍵字。
②靜態成員函數不能訪問類的非靜態成員變量。
③靜態成員函數不能調用非靜態成員函數。
④靜態成員函數的優點在于:即使不存在類的對象,它們也存在,并且可以調用。
⑤非靜態成員函數可以訪問靜態數據成員,也可以調用靜態成員函數。
實例:
#include <iostream.h>class MessageBox { public:enum MessageBoxButtons{OK=0,YesNo=1,YesNoCancel=2};enum DialogResult{Yes=0,No=1,Cancel=3};static void Show(char *message);static DialogResult Show(char * message,MessageBoxButtons buttons); }; void MessageBox::Show(char *message) {cout<<message<<endl; } MessageBox::DialogResult MessageBox::Show(char *message, MessageBox::MessageBoxButtons buttons) {cout<<message<<endl;switch(buttons){case OK:cout<<"OK"<<endl;break;case YesNo:cout<<"YesNo"<<endl;break;case YesNoCancel:cout<<"YesNoCancel"<<endl;break;}return Yes; } void main() {MessageBox::Show("Sure Exit(y/n)?",MessageBox::YesNo); }執行結果: Sure Exit(y/n)? YesNo指針與對象
對象的指針:和一般的指針變量的聲明和設定方式相同
Book a_book; //聲明一個Book對象。
Book* book_ptr; //聲明一個Book對象指針
book_ptr = &a_book;//把已有a_book對象賦值給對象指針
動態分配對象內存,利用new運算符聲明對象并以動態分配內存的方式建立
類名* 指針名=new 類名(參數表);
取成員:
對象指針名-> 成員名
Delete 指針名;
對象參數的傳遞
函數傳遞參數的方式(傳值/地址/引用)。
如果函數需要存儲或更改對象成員變量中的數據,則必須通過引用將對象傳遞給它。
可以使用const修飾符禁止改變原始值
示例:
void call_by_ref(Book&); //通過引用接受對象 void ring_by_ref(Book); //按值傳遞 int main() {Book a_book;call_by_ref(a_book);ring_by_ref(a_book)return 0; } void call_by_ref(Book& abook) {······}const 對象
如果把一個對象指定為const,就是告訴編譯器不要修改它。
const對象的定義:const 類名 對象名(參數表);
const對象不能調用非const成員函數
示例:
class Sample { public:void GetValue() const {} // 常量成員函數void func(){}int m_value; };void Sample::GetValue() const // 常量成員函數 {value = 0; // 出錯func(); // 出錯 }int main() {const Sample obj;obj.value = 100; // 出錯,常量對象不可以被修改obj.func(); // 出錯,常量對象上面不能執行 非 常量成員函數obj.GetValue; // OK,常量對象上可以執行常量成員函數return 0; }const 數據成員
和聲明普通const變量的方法相同。
const數據成員的初始化:在構造函數使用初始化列表。
示例:
class ClassMember { private:Student stu[100];int m_stuNum; public:const int MAXCOUNT1;const int MAXCOUNT2;int GetStuNum() const; }; ClassMember::ClassMember():MAXCOUNT1(10), MAXCOUNT2(20){this->m_Count=0; }const 成員函數
const成員函數不會修改調用它的對象。
const成員函數只能訪問數據成員的值,而不能修改它
聲明方式:在聲明和定義的時候在函數頭部的結尾加上 const 關鍵字
示例:
class Student { public:int GetChinese() const; private:int m_score[5]; }; int Student::GetChinese() const {return m_score[0]; //相當于只讀 }存取權限的補充 mutable
用于定義更改頻繁的數據成員. 數據成員即使在const對象或在const成員函數中都可以被修改
實例:
#include <iostream> #include <string> using namespace std;class CRect { public:int getwid() const; public:mutable int m_wid; }; int CRect::getwid() const {m_wid = 8;return m_wid; } int main() {CRect re;re.getwid();printf("m_wid = %d\n",re.m_wid);return 0; }執行結果: 8總結
以上是生活随笔為你收集整理的复习笔记(三)——C++类和对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python学习笔记(六)——函数的作用
- 下一篇: s3c2440移植MQTT