zoukankan      html  css  js  c++  java
  • c++ 修饰符类型

    修饰符类型

    修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求

    数据类型修饰符:

    • signed ———— 整型      字符型
    • unsigned ———— 整型     字符型
    • long  —————— 整型        双精度型
    • short ———— 整型

    修饰符 signed 和 unsigned 也可以作为 long 或 short 修饰符的前缀。例如:unsigned long int

    C++ 允许使用速记符号来声明无符号短整数无符号长整数。您可以不写 int,只写单词 unsigned、short 或 unsigned、long,int 是隐含的。例如,下面的两个语句都声明了无符号整型变量。

    unsigned x;
    unsigned int y;
    #include <iostream>
    using namespace std;
     
    /* 
     * 这个程序演示了  有符号整数和无符号整数之间的差别
    */
    int main()
    {
       short int i;           // 有符号短整数
       short unsigned int j;  // 无符号短整数
     
       j = 50000;
     
       i = j;
       cout << i << " " << j;
     
       return 0;
    }

    结果:-15536 50000

    无符号短整数 50000 的位模式被解释为有符号短整数 -15536

    解释:

    16 位整数(短整数)的情况下,十进制 50000 就是二进制 11000011 01010000 但在有符号的情况下,二进制最左边的 1,代表这整个数字是负数但是电脑是以补码形式来表示数字的,要获得原本的数字,首先要把整个二进制数 - 11100001101010000 - 1 = ‭1100001101001111‬ 然后,在把答案取反码 not ‭1100001101001111‬ = ‭0011110010110000‬ 把最终答案变成十进制,就是 15536 所以,一开始的二进制数 11000011 01010000,在有符号的情况下代表的就是 -15536。

     对于无符号化为有符号的位数运算,采取 N-2^n 的计算方法,n 取决于定义的数据类型 int、short、char、long int 等等,N 为无符号数的数值,例如文中的 N=50000,short 为 16 位,计算方法为 50000-2^16 得到 -15536。

     volatile 往往会用于多线程的修饰

    volatile boolean isNext = false;
    
    Thread A() {
        // 第一个工作
        // isNext = true;
    }
    
    Thread B (){
        if (isNext) {
            // 第二个工作
        }
    }

    这里volatile 就是从来标记isNext, 以确保线程B每次都重新从内存中读取isNext的值,第二个工作一定在第一个工作之后进行。

    但是要注意,这里无法保证顺序性,应该编译器编译的时候会重新打乱两个语句的先后顺序,因此做第一个工作和赋值给isNext不一定会按照你代码顺序正常执行。

    关键字explicit

    阻止不应该允许的经过转换构造函数进行的隐式转换的发生声明为explicit的构造函数不能在隐式转换中使用

    C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 ,2 是个默认且隐含的类型转换操作符。

    所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。

    这样看起来好象很酷, 很方便。 但在某些情况下(见下面权威的例子), 却违背了我们(程序员)的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用/使用, 不能作为类型转换操作符被隐含的使用

    explicit构造函数的作用

    解析:

    explicit构造函数是用来防止隐式转换的

    class Test1
    {
    public:
        Test1(int n)
        {
            num=n;
        }//普通构造函数
    private:
        int num;
    };
    class Test2
    {
    public:
        explicit Test2(int n)
        {
            num=n;
        }//explicit(显式)构造函数
    private:
        int num;
    };
    int main()
    {
        Test1 t1=12;//隐式调用其构造函数,成功
        Test2 t2=12;//编译错误,不能隐式调用其构造函数
    

      Test2 t2(12);//显式调用成功 return 0; }

    Test1的构造函数带一个int型的参数,代码23行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码24行会出现编译错误。

    普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用

  • 相关阅读:
    echarts
    联合省选2021游记
    高维 FWT 学习笔记
    Unicode简介
    mac安装brew
    原生JS实现分页跳转
    Kubernetes Pod Probes 探针解析
    Kubernetes Secrets
    Kubernetes Container lifecycle hooks
    个人作业1——四则运算题目生成程序(基于java)
  • 原文地址:https://www.cnblogs.com/expedition/p/11314618.html
Copyright © 2011-2022 走看看