1.用类创建对象
对象是类的
实例
类的定义:
class C {
int p;
int f();
};
对象的定义:
C ca, cb;
类中特殊的两种函数:构造函数constructor,析构函数destructor
ctor
特点:自动调用,与类同名,且无返回值(前面连void都不能有),可以重载,可以不带参数
C() {
p = 1;
}
C(int a) {
p = a;
}
使用列表初始化,窄化检查,编译器自动帮你检查类型
C ca, cb{7};
创建一个圆类:
#include <iostream>
using namespace std;
class Circle {
public:
Circle() {
radius = 1.0;
}
Circle(double r) {
radius = r;
}
double getArea() {
return 3.14*radius*radius;
}
private:
double radius;
};
int main() {
Circle C1, C2(2.0);
cout << C1.getArea() << endl << C2.getArea();
getchar();
return 0;
}
2.对象拷贝和匿名对象
C++中新增了auto和decltype作类型推断
其中decltype通过已声明的对象类型声明另一个对象
auto C1=Circle();
decltype(C1) C2 = Circle(2.0);
对象拷贝:circle1=circle2
虽然它们的属性相同,但是它们是两个不同的对象
匿名对象:只是用一次
Circle C1=Circle{0.3}
这次给C1赋值就用了匿名对象,等号右边产生了一个只使用一次的对象并拷贝到等号右边。
再例如cout<<Circle{3.2}.getArea()
局部类和构造类
1.局部类
类只能在函数中调用
int f(){
class A{};
}
2.嵌套类
即在类中定义一个类
类的声明与实现分离
将函数的声明放在.h文件中
将函数的定义放在.cpp中
内联声明与内联函数
当函数在类声明中实现,它自动变为内联函数
但如果在类外声明,在最前面加上inline
,则效果完全相同
小栗子:
main.cpp
#include <iostream>
#include "Circle.h"
using namespace std;
int main() {
Circle C1{ 5.8 };
cout << C1.getArea();
getchar();
return 0;
}
Circle.h
#pragma once
#ifndef CIRCLE_H_
#define CIRCLE_H_
class Circle {
public:
Circle();
Circle(double radius);
double getArea();
private:
double radius;
};
#endif // !CIRCLE_H_
Circle.cpp
#include "Circle.h"
Circle::Circle() {
radius = 1.0;
}
Circle::Circle(double r) {
radius = r;
}
double Circle::getArea() {
return 3.14*radius*radius;
}
3.Windows Api
MessageBox
关于最后一个参数,如果填入MB_OK
,那么消息框只有一个确定选项,此外还有MB-YESNO
等等,如果加入|符号或者+号,那么可以加上图标
MessageBox的返回类型为整数,其返回你按下的按钮的id,比方说cancel按钮的id,No按钮的id等等。
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nCmdShow) {
//第一个参数为指定主窗口,若为NULL,则自身为主窗口
//第二个参数指定窗口中的内容
//第三个参数指定标题
//第四个参数为消息框的类型
while (1) {
MessageBox(NULL, "小哼哼是哪个小可爱呀", "嘻嘻嘻", 0);
}
return 0;
}
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nCmdShow) {
//HWND hwnd = FindWindow("DSUI:PDFXCViewer", NULL);
MessageBox(NULL, "test", "test", MB_YESNOCANCEL | MB_ICONWARNING);
return 0;
}
FindWindow
在某个窗口下的消息窗口,查找方法为:第一个参数为类型名,第二个为标题名
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nCmdShow) {
HWND hwnd = FindWindow(NULL, "hw11 - PDF-XChange Viewer");
MessageBox(hwnd, "test", "test", 0);
return 0;
}
DialogBox
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nCmdShow) {
HWND hwnd = FindWindow("DSUI:PDFXCViewer", NULL);
MessageBox(hwnd, "test", "test", 0);
return 0;
}
#include <Windows.h>
#include "resource.h"
INT_PTR CALLBACK theProc(HWND hwndDlg, UINT uMSG,WPARAM wParam,LPARAM lParm) {
//消息回调函数,umsg为消息种类,WPARAM,LPARAM为消息内容
switch (uMSG) {
case WM_COMMAND:
if (LOWORD(wParam) == IDOK) {
int nLeft = GetDlgItemInt(hwndDlg, IDC_LEFT, NULL, TRUE);
int nRight = GetDlgItemInt(hwndDlg, IDC_RIGHT, NULL, TRUE);
SetDlgItemInt(hwndDlg, IDC_RESULT, nLeft + nRight, TRUE);
//最后一个参数代表是否支持负数
}
if (LOWORD(wParam) == IDCANCEL) {
EndDialog(hwndDlg, IDCANCEL);
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nCmdShow) {
//从一个资源模板中创建一个模式对话框
DialogBox(hInstance, (LPCTSTR)IDD_MAIN_DLG, NULL, theProc);
return 0;
}
网友评论