提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
第二章
一、基本内置类型
算数类型:
常用char为1字节,short、int为2字节,long、float为4字节,double为8字节。
字面值:
如42,a这样的值一望而知,叫字面值,包括整形与浮点数字面值,字符和字符串字面值(如空指针nullptr),转义字符字面值,bool和指针字面值。
类型转换:
非bool转bool:0为false,其余为True
浮点数转整数:往小取整
转义符
均以反斜线开始
换行:\n
回车:\r
引号:’ "
二、变量
变量初始化
注意C++中初始化和赋值是两个从原理上完全不同的操作,显示化声明变量即为定义,定义只可以一次但声明可以多次。
需要注意的是,内置类型(int等)的变量未被显式初始化时,他的值由定义的位置决定, 定义在函数体内部的内置类型变量将不被初始化。
列表初始化
几种初始化方法,带花括号的为列表初始化:
int u = 0;
int u = {0};
int u{0};
int u(0);
三、复合类型
第二章介绍的复合类型主要有两种,引用与指针,这部分需要搞清楚才能理解const关键字。
复合类型的声明:基本数据类型+声明符(变量名)
类型修饰符(引用的&与指针的
∗
*
∗)不过是声明符的一部分罢了。
引用
引用其实就是给变量起了别名,此时无拷贝操作。
int i = 1;
int &r = i, i2 = 1024; //r为i引用,i2为int
指针
如 ∗ p *p ∗p复合类型的声明.这里 ∗ p *p ∗p为一个整体,而不是int*,否则会产生理解上的错误:
int *p=&i; //指针p存放i的地址,它指向int型。
int **p1 = &p //p1为指向int型指针的指针。
也可以写成:
int* p1, p2;
这种写法容易产生理解错误,需要注意*p为复合类型,这里p1为指针,p2为整形向量。
这种写法下的p1,p2均为指针:
int *p1,*p2;
复合类型声明的理解
将声明符从右向左理解,&表明他是引用,其余确定是什么的引用。
int *&i = j; //指针i是对指针j的引用
四、const限定符
用const赋的值不能够被修改.
顶层(high-level const)const与底层const(low-level const):顶层const可以表示任意的对象是常量,对任何数据类型都适用。底层const与指针和引用等复合类型的基本类型部分有关。
high-level const:指针是常量。
int *const p1;
low-level const:指针所指对象是常量。
const int *p2;
constexpr用于初始化常量表达式,constexpr强制为high-level const。
如果将指针设置为constexpr,必须在函数体之外,否则指针存储位置是变动的不可以赋值。
五、处理类型
类型别名
typedef double wages;
using Si = Sales_item;
auto类型说明符
可以自动推断表达式所属的类型,自动忽略high-level const。
const int cr = 2;
auto a = cr; //类型为int
const auto b = a; //类型为const int
decltype类型指示符
这里作为例外,&不作为别名,表示引用类型
const int &cj = 0;
decltype(cj) x = 0; //x为引用
decltype(cj+0) y = 0; //y为int
两个括号时,认为表达式为引用
decltype((cj)) z = 0;// z为引用
解引用符*得到的也是引用
int i = 2,*p = &i;
delctype(*p) k = 0; //k为引用
六、自定义数据结构
重写Sales_item并重新编写第一章练习。
Sales_data.h
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include<string>
struct Sales_data
{
std::string bookNo;
unsigned unit_sold = 0;
double revenue = 0.0;
};
#endif
输入输出:
#include<iostream>
#include "Sales_data.h"
int main(){
Sales_data book;
std::cin >> book.bookNo >> book.revenue >> book.unit_sold;
std::cout << book.bookNo << book.revenue << book.unit_sold << std::endl;
}
加法:
#include<iostream>
#include "Sales_data.h"
int main(){
Sales_data book1,book2;
std::cin >> book1.bookNo >> book1.revenue >> book1.unit_sold >> book2.bookNo >> book2.revenue >> book2.unit_sold;
if(book1.bookNo == book2.bookNo){
std::cout << book1.revenue+book2.revenue << std::endl;
return 0;
}
else{
std::cerr << "ISBN must be same" << std::endl;
return -1;
}
}
多个文件加法:
#include<iostream>
#include "Sales_data.h"
int main(){
Sales_data Trans;
if(std::cin >> Trans.bookNo >> Trans.revenue >> Trans.unit_sold){
double TotalRevenue = Trans.revenue;
while (std::cin >> Trans.bookNo >> Trans.revenue >> Trans.unit_sold)
{
TotalRevenue += Trans.revenue;
}
std::cout << TotalRevenue << std::endl;
return 0;
}
else{
std::cerr << "No Data" << std::endl;
return -1;
}
}
bookstore.cpp
#include<iostream>
#include "Sales_data.h"
int main(){
Sales_data Total,Trans;
if(std::cin >> Total.bookNo >> Total.revenue >> Total.unit_sold){
while (std::cin >> Trans.bookNo >> Trans.revenue >> Trans.unit_sold)
{
if (Total.bookNo == Trans.bookNo)
{
Total.revenue += Trans.revenue;
}
else
{
std::cout << Total.bookNo <<Total.revenue << Total.unit_sold << std::endl;
Total = Trans;
}
}
std::cout << Total.bookNo <<Total.revenue << Total.unit_sold << std::endl;
return 0;
}
else{
std::cerr << "No Data" << std::endl;
return -1;
}
}