UE学习日志#16 C++笔记#2 基础复习2
10 <cstddef> 中提供了std::byte类型用来表示单个字节
内存中的单个字节,
std::byte b { 42 };
11 <limits>中的类模板 std::numeric_limits
使用样例:
import <iostream>;
#include<limits>
#include<format>
using namespace std;
int main()
{
cout << format("int-->max=={}\n",numeric_limits<int>::max());
cout << format("int-->min=={}\n", numeric_limits<int>::min());
cout << format("int-->lowest=={}\n", numeric_limits<int>::lowest());
cout << format("double-->max=={}\n", numeric_limits<double>::max());
cout << format("double-->min=={}\n", numeric_limits<double>::min());
cout << format("double-->lowest=={}\n", numeric_limits<double>::lowest());
return 0;
}
结果:
对于double来说,min表示能够表示的最小正数,而Lowest表示能够表示的最小负数
12 零初始化
可以用{0}或{}统一初始化为0:
原始的整数类型(char,int)初始化为0
原始的浮点类型初始化为0.0
指针类型初始化为nullptr
对象用默认构造函数初始化
样例:
import <iostream>;
#include<limits>
#include<format>
using namespace std;
int main()
{
float myFLoat1{};
cout << format("myFLoat1=={}\n", myFLoat1);
float myFloat2{ 0 };
cout << format("myFLoat2=={}\n", myFloat2);
int myInt1{};
cout << format("myInt1=={}\n", myInt1);
int myInt2{ 0 };
cout << format("myInt2=={}\n", myInt2);
int* ptr1{};
if(ptr1==nullptr)
cout << format("ptr1==nullptr\n");
else
cout << format(" ptr1!=nullptr\n");
int* ptr2{0};
if (ptr2 == nullptr)
cout << format("ptr2==nullptr\n");
else
cout << format(" ptr2!=nullptr\n");
return 0;
}
13 简要类型转换
三种方式,推荐第三种
float myFloat {3.14f};
int i1{ (int)myFloat };
int i2{ int(myFloat) };
int i3{ static_cast<int>(myFloat) };
结果是舍去小数部分
14 特殊的浮点数
+/-infinity表示正负无穷,例如0除以非零的结果
NaN:非数字,例如0/0,
std::isnan()可以判断是否为非数字,std::isinf()判断是否为无穷(<cmath>中)
numeric_limits<double>::infinity
15 枚举
默认自增,第一个不赋值就默认是0
基本类型是整型,但可以通过以下方式改变:
enum class PieceType : unsigned long
{
King,
Queen,
Rook = 10,
Pawn
}
PieceType piece { PieceType::King };
16 结构体
//Employee.ixx
export module Employee;
export struct employee {
char firstInitial;
int salary;
};
//CPlusPlusLearnProj.cpp
import <iostream>;
#include<limits>
#include<format>
import Employee;
using namespace std;
int main()
{
employee a;
a.firstInitial = 'L';
a.salary = 0;
cout << format("a.firstInitial=={},a.salary=={}", a.firstInitial,a.salary);
return 0;
}
输出结果:
17 if语句和switch语句的初始化器
if(<initializer>;<conditional_expression>){
<if_body>
} else if (<else_if_expression>){
<else_if_body>
} else {
<else_body>
}
<initializer>中引入的任何变量只在<conditional_expression>、<if_body>、 <else_if_expression>、<else_if_body>和<else_body>中可用
switch同if
switch(<initializer>;<expression>){
<body>
}
18 三向比较运算符
compare里的
类枚举类型存比较结果,std::is_eq(),is_neq(),is_lt(),is_lteq(),is_gt,is_gteq()判断比较结果
import <iostream>;
#include<limits>
#include<format>
#include<compare>
import Employee;
using namespace std;
int main()
{
int i{ 11 };
strong_ordering result{ i <=> 0 };
if (is_lt(result)) {
cout << format("lessthan");
}
if (is_gt(result)) {
cout << format("greater");
}
return 0;
}
19 属性
19.1 [[nodiscard]]
用于一个有返回值的函数,若只调用了函数但没有对返回值做任何的处理,就会发出警告。
C++20中可以用字符串提供一个原因:
[[nodiscard("Some explanation")]]