一、安装: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;