关键字

作者: 扎Zn了老Fe | 来源:发表于2017-09-11 16:54 被阅读0次

    static
    C中:
    1.隐藏
    2.保持变量的持久
    3.初始化为0
    C++:
    4.共享

    引用和指针
    (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
    (2)可以有const指针,但是没有const引用;
    (3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
    (4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
    (5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
    (6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
    (7)指针和引用的自增(++)运算意义不一样;

    const
    顶层const: 对象本身是const
    底层const: 所指对象是const

    define
    宏定义

    typedef
    类型别名, 新用法, using
    typedef有两种用法:
    一、一般形式,定义已有类型的别名
      typedef 类型 定义名;
    二、创建一个新的类型
    typedef 返回值类型 新类型名(参数列表);
    1)typedef int NUM[10];//声明整型数组类型
    NUM n;//定义n为整型数组变量,其中n[0]--n[9]可用
    2)typedef char* STRING;//声明STRING为字符指针类型
    STRING p,s[10];//p为字符指针变量,s为指针数组
    3)typedef int (*POINTER)();//声明POINTER为指向函数的指针类型,该函数返回整型值,没有参数
    POINTER P1,P2;//p1,p2为POINTER类型的指针变量

    auto
    自动推导变量类型。
    这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。

    decltype
    推导类型

    register
    这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。

    sizeofstrlen

    1. sizeof是运算符, 在编译时就计算好了, strlen是函数, 要在运行时才能计算;
    2. sizeof可以用类型做参数, strlen只能用char*做参数, 且必须是以“\0”结尾的;
    3. 数组做sizeof的参数不退化,传递给strlen就退化为指针了;

    extern

    1. 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
    2. 在C++中extern还有另外一种作用,用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同,用此来解决名字匹配的问题。

    volatile
    表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
    该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
    简单示例:
    DWORD __stdcall threadFunc(LPVOID signal)
    {
    int* intSignal=reinterpret_cast(signal);
    intSignal=2;
    while(
    intSignal!=1)
    sleep(1000);
    return 0;
    }
    该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
    mov ax,signal
    label:
    if(ax!=1)
    goto label
    对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
    label:
    mov ax,signal
    if(ax!=1)
    goto label
      注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
    volatile并不能保证非源自性操作的多线程安全问题得到解决,volatile解决的是多线程间共享变量的可见性问题,而例如多线程的i++,++i,依然还是会存在多线程问题,它是无法解决了.
    http://www.cnblogs.com/zemliu/p/3298685.html

    ++前置, ++后置, --前置, --后置

    explicit
    C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).

    default
    delete
    mutable
    在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

    相关文章

      网友评论

          本文标题:关键字

          本文链接:https://www.haomeiwen.com/subject/ogefsxtx.html