MFC计算器学习笔记

一、安装:MFC应用(如果没有的话)

 


二、打开:VS2019,并创建新项目-MFC应用,在应用程序类型处选择基于对话框,项目名在本教程中是calculator_project


三、运行:没有报错,观察解决方案中本项目下有五个文件夹:引用,外部依赖项,头文件,源文件,资源文件,我们主要操作的是后面三个

 


四、先对资源文件进行操作,打开工具箱,拉入button与edit control,其实会操作这两个就基本够用

(1)设置窗口属性中的描述文字与样式,以及按钮的描述文字,基本上资源文件这里前端就做完了,下面是连接后端代码实现

(2)依次双击button控制,生成对应的点击函数(可以垂直划分界面不用整天切换文件,方法是:右击当前正显示的文件标题,新建垂直文档组)

(3)右击edit control,添加变量,填写变量名并确定,本教程中是m_Edit1,以后用m_Edit1.SetWindowText(cstr);与m_Edit1.GetWindowTextW(cs);来读写其文本

【注意传入传出的参数是CString类型,一般习惯C++是用string类型的,所以要转换类型,转换方法见下面的代码,可以只看第15与第16个按钮的实现代码】


五、修改源文件calculator_projectDlg.cpp与头文件calculator_projectDlg.h

cpp文件中我们需要实现16个按钮的代码,其他是项目自带和上一步创建前后端连接时自动生成的

h文件中我们需要导入#include "cj_test.h",其他是项目自带和上一步创建前后端连接时自动生成的


// calculator_projectDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "calculator_project.h"
#include "calculator_projectDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CcalculatorprojectDlg 对话框



CcalculatorprojectDlg::CcalculatorprojectDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_CALCULATOR_PROJECT_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CcalculatorprojectDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, m_Edit1);
}

BEGIN_MESSAGE_MAP(CcalculatorprojectDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	
	ON_BN_CLICKED(IDC_BUTTON1, &CcalculatorprojectDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CcalculatorprojectDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CcalculatorprojectDlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &CcalculatorprojectDlg::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON5, &CcalculatorprojectDlg::OnBnClickedButton5)
	ON_BN_CLICKED(IDC_BUTTON6, &CcalculatorprojectDlg::OnBnClickedButton6)
	ON_BN_CLICKED(IDC_BUTTON7, &CcalculatorprojectDlg::OnBnClickedButton7)
	ON_BN_CLICKED(IDC_BUTTON8, &CcalculatorprojectDlg::OnBnClickedButton8)
	ON_BN_CLICKED(IDC_BUTTON9, &CcalculatorprojectDlg::OnBnClickedButton9)
	ON_BN_CLICKED(IDC_BUTTON10, &CcalculatorprojectDlg::OnBnClickedButton10)
	ON_BN_CLICKED(IDC_BUTTON11, &CcalculatorprojectDlg::OnBnClickedButton11)
	ON_BN_CLICKED(IDC_BUTTON12, &CcalculatorprojectDlg::OnBnClickedButton12)
	ON_BN_CLICKED(IDC_BUTTON13, &CcalculatorprojectDlg::OnBnClickedButton13)
	ON_BN_CLICKED(IDC_BUTTON14, &CcalculatorprojectDlg::OnBnClickedButton14)
	ON_BN_CLICKED(IDC_BUTTON15, &CcalculatorprojectDlg::OnBnClickedButton15)
	ON_BN_CLICKED(IDC_BUTTON16, &CcalculatorprojectDlg::OnBnClickedButton16)
END_MESSAGE_MAP()


// CcalculatorprojectDlg 消息处理程序

BOOL CcalculatorprojectDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CcalculatorprojectDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CcalculatorprojectDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void CcalculatorprojectDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "1";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "2";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "3";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "4";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "5";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton6()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "6";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton7()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "7";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton8()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "8";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton9()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "9";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton10()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "0";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton11()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "+";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}


void CcalculatorprojectDlg::OnBnClickedButton12()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "-";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}


void CcalculatorprojectDlg::OnBnClickedButton13()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "*";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}


void CcalculatorprojectDlg::OnBnClickedButton14()
{
	// TODO: 在此添加控件通知处理程序代码
	s += "/";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}


void CcalculatorprojectDlg::OnBnClickedButton15()
{
	// TODO: 在此添加控件通知处理程序代码
	s = "";
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

void CcalculatorprojectDlg::OnBnClickedButton16()
{
	// TODO: 在此添加控件通知处理程序代码

	CString cs;
	m_Edit1.GetWindowTextW(cs);
	string s_get(CW2A(cs.GetString()));
	s = cal(s_get);
	CString cstr(s.c_str());
	m_Edit1.SetWindowText(cstr);
}

// calculator_projectDlg.h: 头文件
//

#pragma once
#include "cj_test.h"

// CcalculatorprojectDlg 对话框
class CcalculatorprojectDlg : public CDialogEx
{
// 构造
public:
	CcalculatorprojectDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_CALCULATOR_PROJECT_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	string s;
	CEdit m_Edit1;
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButton3();
	afx_msg void OnBnClickedButton6();
	afx_msg void OnBnClickedButton5();
	afx_msg void OnBnClickedButton4();
	afx_msg void OnBnClickedButton7();
	afx_msg void OnBnClickedButton8();
	afx_msg void OnBnClickedButton9();
	afx_msg void OnBnClickedButton10();
	afx_msg void OnBnClickedButton11();
	afx_msg void OnBnClickedButton12();
	afx_msg void OnBnClickedButton13();
	afx_msg void OnBnClickedButton14();
	afx_msg void OnBnClickedButton15();
	afx_msg void OnBnClickedButton16();
};

六、新建源文件calculator_projectDlg.cpp与头文件calculator_projectDlg.h

这两个文件是为前端点击按钮后进行的计算功能提供接口,本教程提供了test与cal两个接口

#include "cj_test.h"
string test(string s_get) {
    string s = s_get + s_get;
    return s;
}
stack<char> s;
stack<int> ss;
string cal(string s_get) {
    int len1, len2, len, i, j;
    string str1, str2, str3;
    str1 = s_get;
    len1 = str1.length();
    str2.clear();
    str3.clear();
    for (i = 0; i < len1; i++) {
        if (str1[i] >= '0' && str1[i] <= '9')
            str2.push_back(str1[i]);
        else {
            if (s.size() == 0 || str1[i] == '(')
                s.push(str1[i]);
            else {
                char tmp1 = s.top();
                if (str1[i] == ')') {
                    len = s.size();
                    while (len) {
                        char tmp = s.top();
                        s.pop();
                        if (tmp == '(')
                            break;
                        else
                            str2.push_back(tmp);
                        len--;
                    }
                }
                else {
                    if (tmp1 == '*' || tmp1 == '/') {
                        if (str1[i] == '*' || str1[i] == '/')
                            s.push(str1[i]);
                        else {
                            len = s.size();
                            while (len) {
                                char tmp = s.top();
                                str2.push_back(tmp);
                                s.pop();
                                len--;
                            }
                            s.push(str1[i]);
                        }
                    }
                    else {
                        s.push(str1[i]);
                    }
                }
            }
        }
    }
    if (s.size() != 0) {
        len = s.size();
        while (len) {
            char tmp = s.top();
            str2.push_back(tmp);
            s.pop();
            len--;
        }
    }
    //由后缀表达式计算结果 
    int temp1, temp2, temp3;
    len2 = str2.length();
    for (i = 0; i < len2; i++) {
        if (str2[i] >= '0' && str2[i] <= '9') {
            int t = str2[i] - 48;
            ss.push(t);
        }
        else {
            temp1 = ss.top();
            ss.pop();
            temp2 = ss.top();
            ss.pop();
            if (str2[i] == '+') 
                temp3 = temp2 + temp1;
            else if (str2[i] == '-') 
                temp3 = temp2 - temp1;
            else if (str2[i] == '*') 
                temp3 = temp2 * temp1;
            else if (str2[i] == '/')
                temp3 = temp2 / temp1;
            ss.push(temp3);
        }
    }
    stringstream xxx;
    xxx << ss.top();
    xxx >> str3;
    //return str2+":"+str3;
    return str3;
}
#pragma once
#include<iostream>
#include<cstdio>
#include<string>
#include<stack>
#include <sstream>
using namespace std;
string test(string s_get);
string cal(string s_get);

七、补充

如果报错:遇到意外的文件结尾

解决方法:在出错的文件上右键选属性,配置属性 -> C/C++ ->预编译头,在“创建/使用预编译头”这里设置不使用预编译头

 


2021-02-27:关于消息映射机制,补一个示例

#pragma once// MFC_CJDlg.h: 头文件
class CMFCCJDlg : public CDialogEx{// CMFCCJDlg 对话框
public:// 构造
	CMFCCJDlg(CWnd* pParent = nullptr);	// 标准构造函数
#ifdef AFX_DESIGN_TIME					// 对话框数据
	enum { IDD = IDD_MFC_CJ_DIALOG };
#endif
protected:
	HICON m_hIcon;						// 生成的消息映射函数
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()

	//-------------下面是要实现的两个消息一个虚函数
public:
	afx_msg void OnLButtonDown(UINT, CPoint);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	
};

#include "pch.h"
#include "framework.h"
#include "MFC_CJ.h"
#include "MFC_CJDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CMFCCJDlg::CMFCCJDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MFC_CJ_DIALOG, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}
void CMFCCJDlg::DoDataExchange(CDataExchange* pDX){	CDialogEx::DoDataExchange(pDX);}
BEGIN_MESSAGE_MAP(CMFCCJDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//---------------下面两行是要实现的两个消息
	ON_WM_LBUTTONDOWN()
	ON_WM_KEYDOWN()
END_MESSAGE_MAP()
BOOL CMFCCJDlg::OnInitDialog(){
	CDialogEx::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			// 设置大图标,设置此对话框的图标,当应用程序主窗口不是对话框时,框架将自动执行此操作。
	SetIcon(m_hIcon, FALSE);		// 设置小图标,下面可以添加额外的初始化代码
	return TRUE;					// 除非将焦点设置到控件,否则返回 TRUE
}
void CMFCCJDlg::OnPaint(){	// 如果向对话框添加最小化按钮,则需要下面的代码来绘制该图标。  
	if (IsIconic())	{		// 对于使用文档/视图模型的 MFC 应用程序,这将由框架自动完成。
		CPaintDC dc(this);	// 用于绘制的设备上下文
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
		int cxIcon = GetSystemMetrics(SM_CXICON);// 使图标在工作区矩形中居中
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		dc.DrawIcon(x, y, m_hIcon);// 绘制图标
	}else{CDialogEx::OnPaint();}
}
HCURSOR CMFCCJDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}//当用户拖动最小化窗口时系统调用此函数取得光标显示。

//-----------------下面是要实现的
//消息映射机制:
//1、h文件中有DECLARE_MESSAGE_MAP()
//2、cpp文件中有BEGIN_MESSAGE_MAP与END_MESSAGE_MAP,夹着各种事件
//3、h文件中有事件的声明
//4、cpp文件中有事件的实现
void CMFCCJDlg::OnLButtonDown(UINT, CPoint point){
	CString str;
	str.Format(_T("x=%d y=%d"), point.x, point.y);
	MessageBox(str);
	TCHAR buf[1024];
	wsprintf(buf, _T("x=%d y=%d"), point.x, point.y);
	MessageBox(buf);
}
void CMFCCJDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){
	CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CMFCCJDlg::PreTranslateMessage(MSG* pMsg){
	if (pMsg->message == WM_KEYDOWN){
		switch (pMsg->wParam){//判断具体键	
			case VK_LEFT://按下左键
				TRACE("left\r\n");
				MessageBox(_T("OnLButtonDown中实现Format把数值转换成文本CString类型(编辑框或MessageBox输出都是这类型)"));
				break;
			case VK_RIGHT://按下右键
				TRACE("right\r\n");
				MessageBox(_T("OnKeyDown消息加进来就是陪衬的"));
				break;
			case VK_UP://按下上键
				TRACE("up\r\n");
				MessageBox(_T("上面TRACE可以调试输出"));
				break;
			case VK_DOWN://按下下键
				TRACE("down\r\n");
				MessageBox(_T("右击VK_DOWN-速览定义可以看到所有键的定义名称"));
				break;
			case VK_ESCAPE:
				MessageBox(_T("ESC"));
				break;
			case VK_SPACE:
				MessageBox(_T("SPACE"));
				break;
			case '0':
				MessageBox(_T("0"));
				break;
			case 'A':
				MessageBox(_T("A"));
				break;
			default:
				break;
		}
	}
	return CDialogEx::PreTranslateMessage(pMsg);
}

2021-03-04:关于MFC项目中的编码格式及数据类型

在界面建一个按钮生成点击事件,并建一个编辑框并绑定变最Edit1(类型是CString)

//头文件include<Windows.h>
void CMFCApplication1Dlg::OnBnClickedButton1(){
	//特别说明:右击项目-属性-属性配置-高级-使用ANSI多字节字符集,则函数默认重定义为A型,_T与TEXT无效(因为默认就是ANSI),不用W型函数
	//特别说明:右击项目-属性-属性配置-高级-使用unicode字符集,则函数默认重定义为W型,_T或TEXT会把后面的串转成Aunicode编码(相当于加L),不用A型函数
	
	/*
	//多字节版本MBCS(Multi-Byte Chactacter System,即多字节字符系统),习惯统称为ANSI
	BOOL a = DeleteFile("F:\\Desktop\\1.png");	
	BOOL c = DeleteFileA("F:\\Desktop\\3.png");	
	char* s = "默认重定义为A,跟char*正常写法即可,这就是多字节";
	MessageBox(s, "title", 0);
	MessageBoxA("不用写_T也不用再转换", "title", 0);
	*/

	//宽字节版本(个人习惯使用)
	//Unicode的学名 是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。
	//UCS只是规定如何编码,并没有规定如何传输、保存这个编码。UTF是“UCS Transformation Format”的缩写。
	BOOL a = DeleteFile(_T("F:\\Desktop\\1.png"));	
	BOOL b = DeleteFileW(_T("F:\\Desktop\\2.png"));	
	BOOL c = DeleteFileA("F:\\Desktop\\3.png");	//注意用A版本API的话,在英文版系统中可能会乱码
	//宽字节下DeleteFile与DeleteFileW一样,把鼠标指在DeleteFile上也会显示被define成DeleteFileW
	//函数尾有W就是用宽字符unicode,_T是一个宏,当项目设置为宽字节编码时相当于L,作用是让你的程序支持Unicode编码
	//顺带一提,鼠标指在_T上面就会提示扩展到L""

	UpdateData(TRUE);
	CString strTemp = Edit1;
	MessageBox(strTemp);
	DWORD tmp = 0x123456789;//这里会警告截断仅保留低位
	strTemp.Format(_T("%02x"), tmp);
	Edit1 = _T("")+strTemp;
	UpdateData(FALSE);
	/*
		X 表示以十六进制形式输出
		02表示不足两位,前面补0输出;如果超过两位,则实际输出
		printf("%02X", 0x345);	 //打印出:345
		printf("%02X", 0x6);	 //打印出:06

		而如果直接写为 %2x,数据不足两位时,实际输出,即不额外补0输出; 如果超过两位,则实际输出。
		printf("%2X", 0x345);	//打印出:345
		printf("%2X", 0x6);		//打印出:6
	*/

	CString str = _T("123");
	int i = _ttoi(str);//把str转int
	str.Format(_T("%d"),i);//把int转str
	//CString是C风格的字符串,WIN32API这里大多都是C风格的
	CString s = _T("变量可加")+ str;
	MessageBox((LPCTSTR)_T("默认:重定义为W"), _T("title"), 0);
	MessageBoxW((LPCTSTR)s, _T("title"), 0);
	MessageBoxA(NULL,"A风格", "title", 0);//此时会多一个空句柄参数
	//区分一下几个指针:有C就是常量,有T就是默认或W风格的宽字符
	//LPCSTR    32 - bit   指针,指向一个常量字串
	//LPSTR     32 - bit   指针,指向一个字串
	//LPCTSTR   32 - bit   指针,指向一个常量字串。	此字串可移植到Unicode和DBCS
	//LPTSTR    32 - bit   指针,指向一个字串。		此字串可移植到Unicode和DBCS
	
}

 


2021-03-18:关于C++一些基础补充

## 头文件
- C/C++旧式风格:以.h结尾,没有命名空间
- C/C++新式风格:没有h,有命名空间,C头文件前加 c
## limits
- CHAR_BIT , char位数
- CHAR_MAX,char最大值
- CHAR_MIN,char最小值
- SCHAR_MAX,signed char最大值
- SCHAR_MIN,signed char最小值
- UCHAR_MAX,unsigned char最大值
- SHRT_MAX,short最大值
- SHRT_MIN,short最小值
- USHRT_MAX,unsigned short最大值
- INT_MAX,int最大值
- INT_MIN,int最小值
- UNIT_MAX,unsigned int是大值
- LONG_MAX,long最大值
- ULONG_MAX,unsigned long最大值
- LLONG_MAX,long long最大值
- LLONG_MIN,long long最小值
- ULLONG_MAX,unsigned long最大值
## 溢出
- short变量32767加1变成-32768
- unsigned short变量65535加1变成0
## char与Int
- char c=‘A';
- int i=(int)c;
- c=(char)i;
## const比define好
- const可控制数据类型
- const可控制作用域
## 宽字符wchar_t与L与wcout
```cpp
wchar_t a=L’x’;
wcout<<L”yy”<<endl;
```
## 类型转换(高转低)
- 大浮变小浮:值超出表示范围不确定
- 大整变小整:值起出表示范围保留低位
- 整变浮:有效数位保留高位
- 浮变整:无小数部分,整数部分超出表示范围不确定
- 关于安全转换static_cat<>等见15章
## CString
- sizeof(arr)取arr数组长度,包括所有字符,即如果是字符串包括空字符
- strlen(arr)取arr字符串长度,不计首个空字符及之后的字符,相当于string类方法中的arr.size()
- strcmp(a,b)比较a,b两个字符串,小于返-1,等于返0,大于返1,相当于string类方法中的a<b
- strcat(a,b)把b连接到a后面,相当于string类方法中的a=a+b;
- strcpy(a,b)把b的内容复制到a,相当于string类方法中的a=b;
## cin.getlne()
- 将姓名读入中到一个包含20个元素的name数组中
- 若遇换行符则立即结束读入,且丢弃换行符
> cin.getline(name,20);
> cin.getline(id,10);
- 当然要以连续读
> cin.getline(name,20)<<getline(id,10);
## cin.get()
- 用cin.get读取两次内容时要调用三次,因为cin.get不会丢换行符
- 换行符仍留在输入队列中,则后面的cin.get都只会读得到空行
- 其中第二次调用不带参则会读取一个字符(这里是读换行符)
> cin.get(name,20);
> cin.get();//如果没有这一行,则换行符永远读不走
> cin.get(id,10);
- 当然也可以连续读
> cin.get(name,20)<<cin.get()<<cin.get(id,10)<<cin.get();
- 特别注意:一般的int x;cin>>x;也是不丢掉换行符的!!!
- 也就是说cin>>x;后要先cin.get()才能再cin.getline(name,20)与cin.get(id,10)
> cin>>x>>cin.get()>>cin.getline(name.20)>>cin.get(id,10)>>cin.get();
## string类
- 注意他的声明就是定义新对象
```cpp
string s=“abc”;
string t=s;//t与s是两个string对象
string r=s+t;//这里就可以看出string声明就是定义创建一个新对象
//如果要输入一行到string类对象,则要用另一种getline的写法
getline(cin,get);
```
## 字符串类型
- wchar_t s1[]=L”AAA BBB”;
- char16_t s2[]=u“CCC DDD”;
- char32_t s3[]=U“EEE FFF”;
## 指针运用
> int *pt1 = (int*) 0x00845618;
> int *pt2 = new int;//注意new返回的是地址
> delete pt1;//delete释放的是pt1指向new出来的内存块而非pt1本身
> delete pt2;
> 不要尝试释放已经释放的内存块
> 但对空指针使用delete是安全的
> int *psome=new int[10];
> delete [] psome;

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值