3.1C++中的数据类型
1.数据类型:int char
2.基本数据类型:
3.构造数据类型:
(1)C++的特殊机制:可以将多个基本数据类型组合起来,构成一个比较复杂的构造数据类型,可以描述更加复杂的事物
(2)example
//长方形数据集
struct Rect
{
int m_nLength; //长
int m_nWidth; //宽
}
4.构造的数据类型可以分解成若干个“成员”或“元素”。每个成员都是一个基本数据类型或另一个构造的数据类型。
5.C++构造数据集的4种数据类型:数组类型,结构类型,联合类型,枚举类型
3.2变量与常量
1.取值是否可以改变
2.量:整型常量,浮点常量,整型变量,浮点变量
3.2.1声明变量
1.结构形式:
(1)数据类型 变量名;
(2)数据类型 变量名1,变量名2,变量名3,变量名4;
注意:变量名字不可以有空格
3.2.2给变量取个好名字
1.基本原则:变量名=属性+类型+对象描述
2.简单易懂
3.最短长度,最大信息量
3.由名词构成
4.不使用数字编号
5.常量要大写
6.使用约定俗称的前缀:s_静态 g_全局变量 m_成员数量
3.2.3变量初始化
1.变量声明后 ----> 分配内存空间
(1)string strName("luotao"); //构造函数初始化
(2)声明后立即就到初始化
3.2.4常量
1.用来常量对变量赋值
2.整型常数:
(1):nhight = 174; //十进制数
(2):nhight = 0255; //八进制数
(3):nhight = 0xAD; //十六进制数
3.浮点型常数:1.1e5;
4.字符常量:char aMake = 'A';
cout<<'!'<<endl;
\r回车
5.字符串常量:
3.2.5用宏与const关键字定义常量
1.预编译指令:#define 宏名称 宏值
#define PI 3.1415926
2.const 数据类型 常量名 = 常量值;//不能修改
3.3数值类型
3.3.1整型数值类型
1.基本型:int
2.短整型:short int
3.长整型:long int
4.长长整型:long long int
3.3.2浮点型数值类型
1.单精度型:float
2.双精度型:double
3.长双精度型:long double
3.4布尔型
1.自动转换为整型、
// learnerOne.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
//引入输入/输出文件流对象需要的头文件
#include <fstream>
using namespace std;
bool isEven( int i )
{
//判断一个数是不是偶数
//如果是偶数,则返回true,否则返回false
return i % 2 == 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
//表示某个数是否是偶数
bool bEven;
//总的偶数个数
int nEvenCount = 0;
//统计范围
int nFrom = 0;
int nTo = 100;
//统计范围内的所有数
for( int i = nFrom; i <= nTo; i++ )
{
//调用isEven()函数判断当前数值
//如果是偶数,则返回true,否则返回false
bEven = isEven( i );
//将布尔类型变量和整型变量隐式的转换为整型对象
//如果bEven的值是true,表示这是一个偶数,相应的统计数加1
nEvenCount += bEven;
}
//输入结果
cout<<nFrom<<"到"<<nTo<<"之间的偶数个数为:"<<nEvenCount<<endl;
return 0;
}
3.5字符串类型
3.5.1字符类型
1.字符类型的类型说明符“char”
2.是无符号类型
3.char取值范围有限,只能用来表示有限的ANSI字符
4.为了表示UNICODE字符,采用wchar_t来定义
// LearnTwo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//定义一个wcahr_t类型的字符变量
//并用一个中文字符对其进行赋值
wchar_t cChinese = L'中';
//设置wcout输出对象并输入中文字符
wcout.imbue( locale ( "chs" ) );
wcout<<cChinese<<endl;
return 0;
}
3.5.2字符串类型
1.需要使用imbue()设定字符的编码方式
// Learn3.5.2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//定义一个string类型变量,表示英文字符串
string strMorning("Good Morning");
//定义一个wstring类型变量,表示中文字符串
wstring strChina(L"中国");
//输出字符串变量
cout<<strMorning;
wcout.imbue( locale ("chs") );
wcout<<strChina<<endl;
return 0;
}
2.字符串中查找某个字符
// learn3.5.2.1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string strMorning("Good Morning!");
//通过length()函数得到字符串的长度
int nLength = strMorning.length();
//在字符串中查找字符
string::size_type nPos = strMorning.find('o');
//输出结果
cout<<strMorning<<"的长度是:"<<nLength<<"\n在位置"<<nPos<<"有一个字符o。"<<endl;
return 0;
}
3.6数组
-----> 排列数据
3.6.1数组的声明与初始化
1.申明格式:
(1):数据类型 数组名[个数常量][个数常量][个数常量]…….
(2):“[]”用于确定数组的维数
(3):数组名就是数组标识符
(4):数组名也是一个常量,也可以表明数组的首地址
3.6.2数组的使用
1.引用数组中的数据 ---> 下标
2.数据内存的分类:高维数优先排列---->下标从高到低
3.7枚举类型
1.枚举地址:定义一种新的数据类型,列举它所有的可能值。
当使用这种新的数据类型定义一个变量时,这个变量的取值也就限定在了枚举所列举的可能取值范围内
2. enum 枚举类型名
{
//可能的枚举值列表
};
3.示例:
// learn3.6.1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
enum Weekday
{
mon,
tue,
wed,
thu,
fri,
sat,
sun
};
//定义一个变量表示一周中的某一天
//并将其初始值设置为星期天
Weekday nDay = Weekday::sun;
return 0;
}
4.枚举类型有默认值:
(1):枚举类型实质是一个整数值
由于Weekday::sum默认值为6
5.枚举变量类型的赋值:如果变量是枚举类型,就只能使用这种枚举类型的某个可选值对其进行赋值
//定义一个枚举类型的变量
Weekday nDay;
//用枚举类型的可选值对枚举类型变量进行复制
nDay = Weekday::sum;
//尝试用其它数值对枚举类型变量赋值会产生编译错误
nDay = 7;
6.枚举元素的数值是常量,定义后不可改变
Weekday::mon = (Weekday)0; //尝试改变枚举元素的值,导致编译错误
在定义枚举类型时,就已经完成了枚举元素数值的定义,数值不是默认数值就是给定的特殊数值。
枚举类型定义后不能在改变其中某个元素的值
3.8用结构体类型描述复杂的事物
概述
1.数据类型描述事物的单个属性
2.单个属性的基本数据类型组合
3.8.1结构体的定义
1.Struct 结构体名
{
数据类型1 成员名1;
数据类型2 成员名2;
…
数据类型3 成员名3;
}
2.结构体名就是要创建新结构体的名字;
3.多个不同数据类型的变量表示复杂事物的各个属性
4.这些变量称为结构体的成员变量
//定义结构体Human描述人这个复杂事物
struct Human
{
string m_strName; // 姓名
Bool m_bMale; //性别
int m_nAge; //年龄
int m_nHeight; //身高
}
3.8.2结构体的使用
1.引用结构体变量的形式:
结构体变量.成员变量
// learn3.8.2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//将员工这个复杂事物的多个属性打包成一个结构体
int _tmain(int argc, _TCHAR* argv[])
{
struct Emplyee
{
string m_strName; //姓名
bool m_bMale; //性别
int m_nAge; //年龄
int m_nSalary; //工资
};
//定义一个常量表示最大员工数目
const int MAX_COUNT = 1000;
//创建一个结构体数组,管理多个结构体变量
Emplyee arrEmplyee[MAX_COUNT];
cout<<"请输入员工信息"<<endl;
//当前员工数
int nCount = 0;
do
{
//接受用户输入
//将用户输入的数据保存到结构体变量的各个成员变量
cin.clear();
cin>>arrEmplyee[nCount].m_strName
>>arrEmplyee[nCount].m_bMale
>>arrEmplyee[nCount].m_nAge
>>arrEmplyee[nCount].m_nSalary;
//检查是否输入完毕
if ( "end" == arrEmplyee[nCount].m_strName)
break;
//开始输入下一个员工的信息
++nCount;
}while( nCount < MAX_COUNT );
//显示所有员工的信息
cout<<"员工信息:\n 姓名\t性别\t年龄\t工资"<<endl;
for( int i = 0; i < nCount; ++i)
{
//访问数组的中的结构体变量的成员变量
//获取"员工"这个复杂事物的各种属性
cout<<arrEmplyee[i].m_strName<<"\t"
<<arrEmplyee[i].m_bMale<<"\t"
<<arrEmplyee[i].m_nAge<<"\t"
<<arrEmplyee[i].m_nSalary<<endl;
}
return 0;
}
3.9指向内存位置的指针
-------> 访问内存的方法
3.9.1指针就是表示内存地址的数据类型
1.指针,是一种表示内存地址的数据类型,表示的是内存的地址。
2.访问内存的方式:
(1)通过变量名间接反映
(2)直接通过内存地址,指针来访问内存的数据
3.指针变量所保存的是一个对象或者函数的地址,就说这个指针指向这个对象或者函数。
3.9.2指针变量的定义
1.语法格式:
数据类型* 变量名
2.数据的类型可以是:int double string
3.(1):数据类型即为指针变量
(2):“*”表示声明的是一个指针类型的变量
(3):“变量名”就是给这个指针指定的名字
4.
//一个int型指针,它可以指向一个int型数据
int* pnStudentNumber;
//一个double型指针,它可以指向一个double型数据
double* pnStudentNumber;
//一个Emplyee型指针,它可以指向一个Emplyee型数据
double* pnStudentNumber;
5.选择合适的定义指针变量的方式
int* pnStudentNumber; //(1)
int *pnStudentNumber; //(2)
含义相同,对读者所强调的意义不同
(1)强调的是pnStudentNumber为一个指向整数的指针,可以把int*看作一种数据类型,而整个语句强调的是pnStudentNumber为这种数据类型的一个变量;
(2)是把*pnStudentNumber当成一个整体,表示它的数据类型是整型,而pnStudentNumber是指向这个整数的指针。
3.9.3指针的赋值和使用
1.语句格式:
指针变量 = 内存地址;
2.与地址相关的运算符:“&”,“*”
3.“&”取址运算符:
//定义一个整型变量
int N = 703;
//取得整型变量的地址并将其赋值给整型指针
int* pN = &N;
4."*"运算符:称为解析运算符,与取址运算符为反运算
//通过指针修改它所指向的数据
*pn = 1983;
//通过指针读取它所指向的数据
cout<<*pn<<endl;
5.例子:
//定义一个结构变量
Emplyee Jiawei;
//定义一个指针
Emplyee* pJiawei = &Jiawei;
//用“->”运算符,访问这个结构体变量的成员变量
pJiawei->m_strName = "Jiawei";