在類中,如果不希望某些數據被修改,可以使用const關鍵字加以限定。const 可以用來修飾成員變量和成員函數。
const成員變量
const 成員變量的用法和普通 const 變量的用法相似,只需要在聲明時加上 const 關鍵字。初始化 const 成員變量只有一種方法,就是通過構造函數的初始化列表。
const成員函數(常成員函數)
const 成員函數可以使用類中的所有成員變量,但是不能修改它們的值,這種措施主要還是為了保護數據而設置的。const 成員函數也稱為常成員函數。
通常將 get 函數設置為常成員函數。讀取成員變量的函數的名字通常以get開頭,后跟成員變量的名字,所以通常將它們稱為 get 函數。
常成員函數需要在聲明和定義的時候在函數頭部的結尾加上 const 關鍵字。
#include <windows.h>
#include "resource.h"
#include <string>using namespace std;LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst;
TCHAR szClassName[] = TEXT("constmemberDemo");
char szBuffer[100]; class Student{
public:Student(char *name, int age, int score);void show(HDC hdc);//聲明常成員函數char *getname() const;int getage() const;int getscore() const;
private:char *m_name;int m_age;int m_score;
};
Student::Student(char *name, int age, int score): m_name(name), m_age(age), m_score(score){ }
void Student::show(HDC hdc){wsprintf(szBuffer, "%s年齡是%d,成績是%d。",m_name,m_age,m_score);TextOut(hdc,10,30,szBuffer,lstrlen(szBuffer));
}
//定義常成員函數
char * Student::getname() const{return m_name;
}
int Student::getage() const{return m_age;
}
int Student::getscore() const{return m_score;
}int WINAPI
WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_CONSTMEMBERDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("C++ const成員 Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,200,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam;
}LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;RECT rt; char szBuffer[100]; Student stu("小明同學", 15, 90);Student *pstu = new Student("小李同學", 16, 80);switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_constmember: hdc=GetDC(hwnd);stu.show(hdc);wsprintf(szBuffer, "%s",pstu->getname());TextOut(hdc,10,80,szBuffer,lstrlen(szBuffer));wsprintf(szBuffer, "年齡是%d",pstu->getage());TextOut(hdc,80,80,szBuffer,lstrlen(szBuffer));wsprintf(szBuffer, ",成績是%d",pstu->getscore());TextOut(hdc,160,80,szBuffer,lstrlen(szBuffer));break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("constmemberDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("constmemberDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam); }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rt); EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0;
}
getname()、getage()、getscore() 三個函數的功能都很簡單,僅僅是為了獲取成員變量的值,沒有任何修改成員變量的企圖,加了 const 限制,這是一種保險的做法,同時也使得語義更加明顯。
必須在成員函數的聲明和定義處同時加上 const 關鍵字。如果只在一個地方加 const 會導致聲明和定義處的函數原型沖突。
const 的位置:
函數開頭的 const 用來修飾函數的返回值,表示返回值是 const 類型,也就是不能被修改,例如const char * getname()。
函數頭部的結尾加上 const 表示常成員函數,這種函數只能讀取成員變量的值,而不能修改成員變量的值,例如char * getname() const。
工程;
資源和頭文件;
#include "resource.h"
#include <windows.h>/
//
// Menu
//IDC_CONSTMEMBERDEMO MENU
BEGINPOPUP "&File"BEGINMENUITEM "C++ const成員 Demo", IDM_constmemberMENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND
END
#define IDM_EXIT 10001
#define IDM_ABOUT 10002#define IDC_CONSTMEMBERDEMO 10101
#define IDD_ABOUTBOX 10102
#define IDM_constmember 40001
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的C++ const成员Demo - Win32 版本的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。