1.类型
- C++中类型为一段存储空间赋予实际的意义。
- C++内建类型包括字符型,整型,布尔型,浮点型,C++中规定了以上数据类型尺寸的最小值。
- 类型的基本概念
1.类型是一个编译期的概念,可执行文件中不存在类型的概念
2.C++是强类型语言
3.引入类型是为了更好的描述程序,防止误用
4.类型存储尺寸可以通过sizeof()
查看
5.类型也规定了可以执行的操作 - 结构体:将相关的数据放置在一起
1.可以通过点操作符访问内部元素
2.可以作为函数的输入参数或返回类型// 定义结构体 struct Point{ int x; int y; } // 使用 Point p; p.x; // 访问结构体内部的x元素
3.可以引入成员函数,更好的表达函数与数据的相关性// 作为函数的输入参数 void fun(Point p){ p.x += 1; p.y += 1; }
// 定义结构体,并引入成员函数 struct Point{ int x; int y; Point next(){ p.x = p.x+1; p.y = p.y+1; return p; } }
- 取值空间
1.std::numeric_limits
,定义在头文件中,通过类模板实现
std::cout<<std::numeric_limits<int>::min()<<std::endl;
// 输出-2147483648
std::cout<<std::numeric_limits<int>::max()<<std::endl;
// 输出 2147483647
2.超过取值空间会产生溢出
// 上溢出,最大值+1 = 最小值
std::cout<< (2147483647+1) <<std::endl;
// 输出 -2147483648
// 下溢出,最小值-1 = 最大值
std::cout<< (-2147483647-2) <<std::endl;
// 输出 2147483647
- 内存对齐
1.查看方法std::cout<<alignof(int)<<std::endl; // 输出4
,C++11引入
2.结构体内存对齐
struct Str{
int x;
char y;
}
std::cout<<alignof(Str)<<std::endl;
// 8
// 8000-8003 int
// 8004-8007 char
2.头文件
表示引用头文件中的内容。
- 头文件中双引号和尖括号的区别:
双引号:系统从当前的目录寻找头文件,一般是自己写的,要加.h
尖括号:系统从(操作系统)环境变量指定的位置开始寻找,C++标准库,不加.h
3.系统I/O
#include <iostream>
:标准库所提供的IO接口,用于与用户交互cout/cerr/clog
的区别?
1.输出目标不同
2.cerr
会立即刷新缓冲区- 缓冲区与缓冲区刷新?
1.手动刷新缓冲区:std::flush
2.\n
不会刷新缓冲区,仅换行
2.std::endl
相当于\n
+std::flush
,换行并刷新缓冲区 - C/C++系统IO比较?
1.printf
:使用直观,但容易出错。在<cstdio>
头文件,需要写占位符,例如%d
,数据类型解析容易写错。
2.cout
:不容易出错,但书写冗长。
4.名字空间
- 访问名字空间中元素的三种方式?
1.域解析符::
,例如std::endl
2.using
语句,例如using namespace std
3.名字空间别名,例如namespace ns1 = NameSpace1; ns1::fun();
5.初始化
- 初始化的基本操作流程:
1.在内存中开辟空间,保存相应的数值
2.在编译器中构造符号表,将标识符与相关的内存空间关联起来 - 初始化:在构造变量之初为其赋予的初始值
1.缺省初始化
int x;
/*
* x 如果是全局变量,赋值0
* x 如果是局部变量,赋值随机值
*/
2.直接/拷贝初始化
// 直接初始化
int x(10);
int y{10};
// 拷贝初始化
int x = 10;
int y = z;
3.其他初始化
6.类型详述
- 字面值类型
1.为字面值引入前缀和后缀以改变其类型
1.3 (double) --> 1.3f (float)
2 (int) --> 2ULL (unsigned long long)
2.可以引入自定义后缀来修改字面值类型,通过用于添加物理量
int operator "" yuan (long double x){
return x;
}