C++ 引用 Demo - Win32 版
生活随笔
收集整理的這篇文章主要介紹了
C++ 引用 Demo - Win32 版
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一 引用
?
C/C++ 禁止在函數調用時直接傳遞數組的內容,而是強制傳遞數組指針。
對于結構體和對象沒有這種限制,調用函數時既可以傳遞指針,也可以直接傳遞內容。
在 C++ 中,有一種比指針更加便捷的傳遞聚合類型數據的方式,就是引用(Reference)。
引用可以看做是數據的一個別名,通過這個別名和原來的名字都能夠找到這份數據。
引用的定義方式類似于指針,只是用&取代了*;
int a = 99;
int &r = a;
變量 r 就是變量 a 的引用,它們用來指代同一份數據;
由于引用 r 和原始變量 a 都是指向同一地址,所以通過引用也可以修改原始變量中所存儲的數據,
如果不希望通過引用來修改原始的數據,那么可以在定義時添加 const 限制;
二 C++引用作為函數參數
在定義或聲明函數時,可以將函數的形參指定為引用的形式,這樣在調用函數時就會將實參和形參綁定在一起,讓它們都指代同一份數據。
如此一來,如果在函數體中修改了形參的數據,那么實參的數據也會被修改,從而擁有“在函數內部影響函數外部數據”的效果。
一個能夠展現按引用傳參的優勢的例子就是交換兩個數的值;
#include <windows.h> #include "resource.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst; TCHAR szClassName[] = TEXT("refDemo");void swap1(int a, int b); void swap2(int *p1, int *p2); void swap3(int &r1, int &r2);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_REFDEMO2);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("C++引用作為函數參數"),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];int num1=1000;int num2=3000; switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_ref: hdc=GetDC(hwnd);swap1(num1, num2);wsprintf(szBuffer, "%d,%d",num1,num2);TextOut(hdc,10,50,szBuffer,lstrlen(szBuffer));swap2(&num1, &num2);wsprintf(szBuffer, "%d,%d",num1,num2);TextOut(hdc,10,80,szBuffer,lstrlen(szBuffer));swap3(num1, num2);wsprintf(szBuffer, "%d,%d",num1,num2);TextOut(hdc,10,110,szBuffer,lstrlen(szBuffer));break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("refDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("refDemo"), 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; }//直接傳遞參數內容 void swap1(int a, int b) {int temp = a;a = b;b = temp; } //傳遞指針 void swap2(int *p1, int *p2) {int temp = *p1;*p1 = *p2;*p2 = temp; } //按引用傳參 void swap3(int &r1, int &r2) {int temp = r1;r1 = r2;r2 = temp; }swap1() 直接傳遞參數的內容,不能達到交換兩個數的值的目的;
三 C++引用作為函數返回值
引用除了可以作為函數形參,還可以作為函數返回值,
?
?
工程;
?
資源文件;頭文件;
#include "resource.h" #include <windows.h>/ // // Menu //IDC_REFDEMO3 MENU BEGINPOPUP "&File"BEGINMENUITEM "C++引用作為函數返回值", IDM_ref MENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND END #define IDM_EXIT 10001 #define IDM_ABOUT 10002#define IDC_REFDEMO3 10101 #define IDD_ABOUTBOX 10102 #define IDM_ref 40001?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的C++ 引用 Demo - Win32 版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue.js 监听属性简单实例
- 下一篇: 开源空间数据库学习