目录
- 一.安装软件vs
- 二.运行第一个程序
- 三.c++ primer plus 记录
- 第一章 预备知识
- 第二章 开始学习c++
- 第三章 处理数据
- 第四章 复合类型
- 第五章 循环和关系表达式
- 第六章 分支语句和逻辑运算符
- 第七章 函数---c++的编程模块
- 第八章 函数探幽
- 第九章 内存模型和名称空间
一.安装软件vs
二.运行第一个程序
三.c++ primer plus 记录
第一章 预备知识
第二章 开始学习c++
第三章 处理数据
3.1 简单变量
3.1.1 变量名
--主要讲述变量的命名规则
3.1.2 整形
c++基本整形:char short int long,char类型有一些特殊属性(常用来表示字符,而不是数字)
short 是short int的缩写,long 是 long int 的缩写。
3.1.3 整形short int long 和 long long
计算机内存由位(bit)单元组成。可以将位(bit)看成电子开关,0,1。8位的内存块可以设置出256种不同的组合:2的8次方。因此8位单元可以表示0-255或者-128-127
Q1.为什么对变量进行初始化?
如果不对函数内部定义的变量进行初始化,该变量的值将是不确定的。这意味着该变量的值将是它被创建之前,相应内存单元保存的值。
3.1.4 无符号类型
关键字:unsigned
注意,unsigned 本身是 unsigned int 的缩写。
short 和 unsigned short 的范围,注意越界概念,上溢或者下溢。
3.1.5 选择整形类型
int被设置为对目标计算机而言最“自然”的长度,自然长度就是计算机处理起来效率最高的长度。
变量表示的值不可能为负数,选择unsigned类型,可以表示更大的范围。
如果不知道选择什么类型,选int 。
3.1.6 整形字面量
控制输出的方式,是十六进制、八进制格式。
hex、oct 分别控制输出十六进制和八进制。
3.1.7 c++如何确定常量的类型
cout<<"year="<<1678<<"\n"
程序的生命将特定的整型变量的类型告诉编译器,在没有特殊的限定,程序把1678存储为int类型
。
3.1.8 char类型:字符和小整数
char 类型是转为存储字符而设计的。char类型是另一种整形,能够表示目标计算机系统中的所有基本符号--所有的字母、数字、标点符号。
第一个成员函数:cout.put(),通过类对象cout来使用函数put(),句点被称为成员运算符。
c++转义序列的编码:换行符“\n”,回车“\r”,水平制表符“\t"
换行符可替代endl,用于在输出中重启一行。下面三行代码都将光标移动到下一行开头:
cout<<endl;
cout<<"\n";
cout<<'\n';
3.1.9 bool类型:true flase
3.2 const限定符
const int Months=12;
和#define类似,c++更好的对符号常量的处理是关键字const。
常量被初始化之后,其值就被固定下来,编译器将不允许修改常量的值了。
创建常量的通用格式:
const type name = value;
3.3 浮点数
3.3.1 书写浮点数
c++有两种书写浮点数的方式。常规小数点,E。
3.45E6,表示3.45x10的六次方。
8.33E~4表示8.33/10的四次方。
3.3.2 浮点类型
c++有三种浮点类型:float、double、long double。
float的精度比double的精度低。
3.3.3 浮点常量
8.24和2.4E8这种属于double类型。
1.234f 属于float类型。
3.3.4 浮点数的优缺点
将类型分类:
整数和浮点数统称为算术类型。
类型char、short、int、long统称为符号整形。
类型float、double、long double统称为浮点型。
3.4 c++ 算术运算符
基本算术 运算符:加法,减法,乘法,除法,求模。
对于float,c++只保证6位有效位。
将61.419998四舍五入成6位,将得到61.4200.
3.4.1 运算符优先级和结合性
遵从先乘除,后加减。
如果优先级相同:
float logs=120/4*5; //从左到右
3.4.2 除法分支
如果两个操作数都为整数,结果的小数部分将被丢弃,最后的结果是一个整数。
如果其中有一个(或两个)操作数都是浮点数,则小数部分将被保留,结果为浮点数
---
记住:两个操作数都为double类型,则结果为double类型。如果两个操作数都是float类型,结果为float类型。
浮点常量在默认情况下为double类型。
---
9/5=1
9.0/5.0=1.800000
9.0/5=1.800000
3.4.3 求模运算符
3.4.4 类型转换
为处理11种整形和3种浮点类型,类型进行运算时,c++会自动执行很多类型转换 :
1.将一种算术类型的值赋给另一种算术类型的变量时,c++将对值进行转换;
2.表达式中包含不同的类型时,c++将对值进行转换;
3.将参数传递给函数时,c++将对值进行转换;
---
潜在数值转换后的问题
如double转化为float:精度降低;浮点类型转换为整形:小数部分丢失;
---
将0赋给bool变量时,将被转换成为false,而非零的值将被转换成为true。
---
1.初始化和赋值进行的转换
2.以{
}方式初始化时进行的转换
3.表达式中的转换
4.传递参数时的转换
5.强制类型转换
//强制类型转换不会修改thorn变量本身,而是创建一个新的、指定类型的变量。
//强制类型转换的格式:
(typename) value;
typenname (value);//纯粹的c++风格
//强制类型转换有两种表示方式,将存储在thorn中的int值转换为long类型时,可以表示为:
(long) thorn;
long (thorn);
3.4.5 c++11中的auto声明
auto能够根据初始值的类型推断变量的类型
auto n=100;
自动推断类型不是为这种简单情况设计的。处理复杂类型,如标准模块库(STL)中的类型时,自动类型推断才用上。
std::vector<double> scores;
auto pv=scores.begin();
3.5 总结
3.6 复习题
1.为什么c++有多种整形?
c++整形变量一共11种,基本整型有四种:char,short,int,long 。可以根据特定的需求选择最合适的类型。
例如可以用short来存储空格,用long来保证存储容量。提高计算的速度。
2.声明下面描述相符合的变量。
short n=80;
unsigned int n=42110;
unsigned long int n=3E10; //值为300000000的整数
3.c++提供了什么措施来防止超出整形的范围?
c++没有提供自动防止超出整型限制的功能,可以使用头文件climits来确定限制的情况。//书第40页
4.33L与33之间有什么区别?
33L为长整型,33为int类型。//标准答案:33L的类型为long,33的类型为int。
5.下面两条语句是否等价?
char grade=65;
char grade=’A‘;
//答案:不等价 第一个 65是int常量,第二个A是char常量,字符串。
6.如何使用c++来找出编码是88表示的字符?
方法1:
char c = 88;
cout<<c<<endl;
方法2:
cout.put(char(88));
方法3:
cout<<char(88);
方法4:
cout<<(char)88;
7.将long值赋给float变量会导致舍入误差,将long值赋给double变量呢?将long long值赋给double呢?
这个问题的答案取决于这两个类型的长度。如果long为4字节,则没有损失。因为long的最大值将是20亿,即10位
数。由于double提供了至少13位有效数字,因而不需要进行任何舍入。long long类型可提供19位有效数字,超
过了double保证的13位。
8.下列c++表达式的结果分别是多少?
a.8*9+2;//74
b.6*3/4; //4
c.3/4*6; //0
d.6.0*3/4; // 18.0/4is4.5
e.15%4; //3
9.
double x1;
double x2;
int(x1);
int(x2);
int x3=x1+x2;
---
double x1;
double x2;
int x3=int(x1+x2);
10.下面每条语句声明的变量都是什么类型?
a.auto cars=15; //int
b.auto iou=150.37f; //float
c.auto level='B' //char
d.auto crat=U'/u00002155' // 这个是char32_t
e.auto fract=8.25f/2.5 //double 整形提升,看第64页
===
1. 后面的2.5如果后面不加f的话,就是个double类型的值
2. /的两个操作数一个是float一个是double,float向double方向做类型提升(Type promotion)
3. 两个double的结果还是double,所以auto 的类型推断就认为fract是个double了
3.7 编程练习
1.
第四章 复合类型
需要一些比基本类型复杂的数据类型---复合类型,这种类型是基于基本类型和浮点类型创建的。影响最为深远的复合类型就是---类是学习面向对象OOP的关键。
4.1 数组(array)
声明数组的通用格式:
typeName arrayName[arraySize]
---
short months[12]
4.1.1 程序说明
sizeof运算符返回类型或数据对象的长度(单位是字节)。如果将sizeof运算符用于数组名,得到的将是整个数组中字节数,如果sizeof用于数组元素,就是元素的长度(单位是字节)。
4.1.2 数组初始化规则
将数组中所有元素都初始化为0:
long totals[500]={
0};
如果初始化{
1}而不是{
0},则第一个元素被设置为1,其他元素都被设置成0.
4.1.3 c++11 数组初始化方法
1.可以省略=
double earning[4] {
1.2,2.2,2.2,2.4}
2.可不在大括号内包含任何东西,所有元素都被设置成0
float balances[100] {
}
3.列表初始化进制缩窄转换:(第三章讲的)
long n[]={
12,23,1.0} ; //错误的,
char slifts[4] {
'd','e',1122011,'\0'}; //错误的
char slifts[4] {
'd','e',112,'\0'}; //正确的
4.2 字符串
c++处理字符串方式有两种。第一种常被称为c-风格字符串。另一种基于string类库。
---
c-风格的字符串必须以 “\0” 结尾
char dog[8]={
'a','w','d','f','d','d','f','d','\0'};
---
有一种更好的、将字符数组初始化为字符串的方法---字符串常量或字符串面值,用引号括起的字符串隐士地包括结尾的空字符。
char bird[8]="Bozo";
4.2.1 拼接字符串常量
4.2.2 在数组中使用字符串
4.2.3 字符串输入
cin>>name;
4.2.4 每次读取一行字符串输入
1.面向行的输入:getline()
getline()函数读取整行,它使用通过回车输入的换行符来确定输入结尾,调用这种方法,使用cin.getline()。
该函数有两个参数,第一个是数组名,第二个是字符数。如果输入20,存储19个,最后一个为空字符。
cin.getline(name,20);
2.面向行的输入:get()
3.空行和其他问题
当getlin()或get()读取空行时,将设置失效位(failbit)。这意味着接下来的输入将会被阻断,可以用下面命令
恢复:
cin.clear();
4.2.5 混合输入字符串和数字
混合输入数字和面向行的字符串会导致问题。
---
c++程序常使用指针(而不是数组)来处理字符串。
4.3 string 类简介
c++98通过添加string类扩展了c++库,因此现在可以使用string类型的变量(c++的话是对象)而不是字符数组
来存储字符串。string类使用起来比数组简单,同时提供了将字符串作为一种数据类型的表示方法。
要使用string类,必须在程序中包含头文件string。string类位于名称空间std中,因此必须提供一条using编译
指令,或者使用std::string来引用。
---
string对象和字符数组的主要区别是:可以将string对象声明为简单变量,而不是数组
string str1;
string str2=“panther”;
类设计让程序能够自动处理string的大小。例如,str1的声明创建一个长度为0的string对象,但程序将输入读取到
str1中时,将自动调整str1的长度:
cin>>str1;
与使用数组相比,使用string对象更方便,也更安全。
4.3.1 c++11字符串初始化
char first_date[]={
"le Chapon Dodu"};
char second_date[] {
"The Elegant Plate"};
string third_data={
"The Bread Bowl"};
string fourth_data {
"Hank's Fine Eats"};
4.3.2 赋值、拼接和附加
*不能将一个数组赋值给另一个数组,但是能将一个string对象赋值给另一个string对象*
char charr1[20];
char charr2[20]="jaguar";
string str1;
string str2="panther";
charr1=charr2; //错误的
str1=str2; //正确的
---
string类简化了字符串合并的操作。能够运用+ +=运算符。
string str3;
str3 = str1+str2;
str1 += str2;
4.3.3 string类的其他操作
可以使用函数:strcpy()将 字符串复制到字符数组中;
可以使用函数;strcat()将 字符串附加到字符数组末尾;
---
两种确定字符串中字符数的方法:
int len1=str1.size();
int len2=strlen(charr1)
4.3.4 string 类I/O
完整代码:第87页
---
char charrr[20];
cin.getline(charr,20);//这种句点表明,函数getline()是istream类的一个方法,而cin是一个istream的
对象。函数头#include <iostream>
---
string str;
getline(cin,str);//这里没有使用句点表示,说明getline()不是类方法。它将cin作为输入参数,指出到哪里
去查找输入。另外也没有指出字符串的长度,因为string对象将根据字符串的长度自动调整自己的大小。
---
为啥getline()是istream的类方法,下面的不是呢?。。。。。
处理string对象的代码使用string类的一个友元函数。
4.3.5 其他形式的字符串字面值
除了char类型外,c++还有类型wchar_t,而c++11新增了char16_t 、char32_t。对于这些类型的字符串分别使用
前缀L、u、U.
wchar_t title[]=L"Chief Assrogator"; //w_char string
char16_t name[]=u"Felonia Ripova"; //char_16 string
char32_t car[]=U"Humber Super Snipe"; //char_32 string
4.4 结构简介
数组中所有元素的类型必须相同,结构是一种比数组更灵活的数据格式,同一个结构中可以存储多种类型数据,结构
也是c++OOP(面向对象)的基石。
结构是用户定义的类型,而结构声明定义了这种类型的数据属性。首先,定义结构描述,然后按描述创建结构变量。
---
例如,假设某公司要创建一种类型来描述充气产品:存储产品名称,容量和售价。
struct inflatable
{
char name[20];
float volume;
double price;
};
//***定义好结构便可以创建这种类型的==变量==了:
inflatable hat;