zoukankan      html  css  js  c++  java
  • const限定符

    1. const对象默认为文件的局部变量

    const限定符可以将一个对象转换为一个常量。因为常量在定义后就不能被修改,所以定义时必须初始化。

    在全局作用域里定义非const变量时,它在整个程序中都可以访问。例如:

    //file1.cpp
    int counter;   //definitaion
    
    //file2.cpp
    extern int counter;   //use counter in file1

    与其他变量不同,除非特别说明,在全局作用域声明的const变量时定义该对象的文件的局部变量。此变量只能在那个文件中,不能被其他文件访问。

    通过指定const变量为extern,就可以在整个程序中访问const对象。

    //file1.cpp
    extern const int bufsize = fcn();   //define and initialize a const that is accessible to other files
    
    //file2.cpp
    extern const int bufsize;   //use bufsize in file1

    非const变量默认为extern。要使const变量能够在其他文件中访问,必须显式地指定它为extern。

    2. 指向const对象的指针

    我们使用指针来修改其所指对象的值。但是如果指针指向const对象,则不允许用指针来改变其所指的const值。为了保证这个特性,C++语音强制要求指向const对象的指针也必须具有const特性:

    const double *cptr;

    这里的cptr是一个指向double类型的const对象的指针,const限定了cptr指针所指向的对象类型,而非cptr本身。也就是说,cptr本身并不是const,在定义时不需要对它初始化,并且允许给cptr重新赋值,使其指向另一个const对象。但不能通过cptr修改其所指对象的值。

    *cptr = 42;   //error: *cptr might be const

    把一个const对象的地址赋值给一个普通的、非const对象的指针也会导致编译时的错误:

    const double pi = 3.14;
    double *ptr = π  //error: ptr is a plain pointer
    const double *cptr = π  //ok: cptr is a pointer to const

    不能使用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址。

    允许把非const对象的地址赋值给const对象的指针:

    double dval = 3.14;
    cptr = &dval;   //ok, but can not change dval through cptr

    尽管dval不是const对象,但任何企图通过指针cptr修改其值的行为都是导致编译时的错误,cptr一经定义,就不允许修改其所指对象的值。如果该指针恰好指向非const对象时,也必须遵循这个规则。

    在实际的程序中,指向const的指针常用作函数的形参。将形参定为指向const的指针,以此确保传递给函数的实际对象在函数中不因形参而被修改。

    3. const指针

    除指向const对象的指针外,C++还提供了const指针——本身的值不能修改。

    int errNumb = 0;
    int *const curErr = &errNumb;   //curErr is a constant pointer

    指针本身是const的事实并没有说明是否能使用该指针修改它所指向的对象的值。指针所指对象的值能否修改完全取决于该对象的类型。

  • 相关阅读:
    EntityFramework 在实际开发做项目架构的一点疑问
    应用运筹学4Danzig Wolfe Decomposition
    应用运筹学2 约束优化
    应用运筹学3Benders Decomposition
    应用运筹学1 变量使用
    11组Beta冲刺5/5
    11组Beta冲刺3/5
    11组Beta冲刺4/5
    11组Alpha冲刺总结
    11组Beta冲刺1/5
  • 原文地址:https://www.cnblogs.com/cinvzi/p/7337350.html
Copyright © 2011-2022 走看看