C++

2019-04-26  本文已影响0人  恰似一碗咸鱼粥

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;
}
上一篇下一篇

猜你喜欢

热点阅读