布尔类型
C++语言在其标准化过程中引入了bool、true和false关键字,增加了原生数据类型来支持布尔数据。
布尔类型的大小(所占的存储空间)依赖于具体的编译器实现。也可以用 sizeof运算符得到其占用的空间
Conversion between bool and int
0 -> false // 整数0和布尔false互相转化
true ->1 // 布尔true转化为整数1
non-zero -> true // 任意非0整数转化为布尔true
‘字符’->true
编码规范
1、The prefix is should be used for boolean variables and methods.
布尔变量/函数的命名应使用前缀“is”
例如:isSet, isVisible, isFinished, isFound, isOpen
2、The incompleteness of split lines must be made obvious.
断行必须很明显。
在逗号或运算符后换行,新行要对齐
示例
#include<iostream>
using namespace std;
int main()
{bool isAlpha;isAlpha = false;if (!isAlpha){cout << "isAlpha = " << isAlpha << endl;//boolalpha使bool变量输出按照字符输出cout << boolalpha << "isAlpha=" << isAlpha << endl;}return 0;
}
练习:
//&&与运算
bool x = 1 && 2;
答案:x =true;
//&按照位进行与运算
// 01
//&10
// =>00
bool x = 1 & 2;
答案:x =false;
List Initialization(列表初始化)
-
Before C++11 (C++11标准之前的初始化方法)
int x = 0;
int y(2);
char c('a');
int arr[] = { 1,2,3 };
char s[] = "Hello";
2、After C++11
/直接列表初始化)
/* Variable initialization */
int x{}; // x is 0;
int y{ 1 }; // y is 1;
/* Array initialization */
int array1[]{ 1,2,3 };
char s1[ 3 ] { 'o', 'k' };
char s3[]{ "Hello" };
//拷贝列表初始化
/* Variable initialization */
int z = { 2 };
/* Array initialization */
int array2[] = { 4,5,6 };
char s2[] = { 'y','e','s' };
char s4[] = { "World" };
char s5[] = "Aloha"; // Omit curly braces (省略花括号)
注意:列表初始化不允许“窄化”,即不允许丢失数据精度的隐式类型转换
问题:初始化列表与 std::initializer_list有什么关系?
列表初始化是一个形象的说法,当我们使用{}的时候,实际上就是在使用列表初始化的功能,实际上当我们在使用花括号的时候,此时编译器会将这些内容传化成一个临时对象,initializer_list是一个类型,就向大家所说的那样,初始化列表会编译成initializer_list;
也许看着名字很生疏,但是其实在我们平常的使用中就曾涉及这个东西,请大家想想:在我们使用printf的时候,传递的变量参数不可能始终一只,这就给函数带来了形式参数的个数的不确定性,因此引入:initializer_list解决这个问题(当然initializer_list的作用不止如此)大家可以看一下这个例子:
//initializer_list的作用:为解决传递参数数量不唯一,通过initailizer_list创建临时对象,将参数值传递给函数
#include void print(std::initializer_list list) { for (auto it = list.begin(); it != list.end(); it++) {std::cout << *it << " "; }std::cout << std::endl;
}int main() {print({ 1, 2, });
}
Type conversion 类型转换
C风格强制类型转换:
printf("%d", (int) 2.5);
C++风格强制类型转换:
cout << static_cast<double>(1) / 2 << endl;
cout << static_cast<double>(1 / 2) << endl;
result:
0.5
0
编码规范
1、Type conversions must always be done explicitly. Never rely on implicit type conversion.
类型转换必须显式声明。永远不要依赖隐式类型转换
例如:floatValue = static_cast(intValue); // NOT: floatValue = intValue;
问题:reinterpret_cast和const_cast有什么用?
//const_cast用于去除指针变量的常量属性。
const int* a;
int* p = a;//此时是报错的,报错原因是:"const int *" 类型的值不能用于初始化 "int *" 类型
//因此为了解决这个问题:const_cast便派上用场
//我们这里可以这样
int* pr = const_cast<int*>(a)//此时便能获取成功,也就是所说的:去除指针变量的常量属性//reinterpret_cast,翻译下来就是重新解释转型(主要是指针)
//reinterpret_cast的作用是,不改变指针地址,仅仅是使编译器改变解释属性
//举个例子:
int n = 1024;
int* p = &n;//
cout << *p;//这里的结果显然会输出:1024;
//此时我们使用:reinterpret_cast;
double* pp = reinterpret_cast<double*>(&n);
cout << *pp;//这里输出的结果将是double类型的值;但是地址指针的地址并未发生改变,仅仅是解释的方法发生了改变