【C++ grammar】数据类型转换、列表初始化

布尔类型

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(列表初始化)

  1. 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类型的值;但是地址指针的地址并未发生改变,仅仅是解释的方法发生了改变

猜你喜欢

转载自blog.csdn.net/qq_42604176/article/details/108896927