C++ const成员Demo - Win32 版本

tech2025-03-23  6

在类中,如果不希望某些数据被修改,可以使用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 BEGIN POPUP "&File" BEGIN MENUITEM "C++ const成员 Demo", IDM_constmember MENUITEM "E&xit", IDM_EXIT END POPUP "&Help" BEGIN MENUITEM "&About ...", IDM_ABOUT END END #define IDM_EXIT 10001 #define IDM_ABOUT 10002 #define IDC_CONSTMEMBERDEMO 10101 #define IDD_ABOUTBOX 10102 #define IDM_constmember 40001

 

最新回复(0)