0%

专题知识点3:const

2020年4月6日 下午11:00

以下四行代码的区别是什么? const char * arr = “123”; char * brr = “123”; const char crr[] = “123”; char drr[] = “123”;

  1. const char * arr = "123”;
    • 字符串123保存在常量区
    • const本来是修饰arr指向的值不能通过arr去修改,但是字符串“123”在常量区,本来就不能改变,所以加不加const效果都一样
  2. char * brr = "123";
    • 字符串123保存在常量区,这个arr指针指向的是同一个位置,同样不能通过brr去修改”123”的值
  3. const char crr[] = “123”;
    • 这里123本来是在栈上的,但是编译器可能会做某些优化,将其放到常量区
  4. char drr[] = “123”;
    • 字符串123保存在栈区,可以通过drr去修改

Const 修饰指针变量有以下三种情况

  • A: const 修饰指针指向的内容,则内容为不可变量。
    1
    2
    const int *p = 8;
    //则指针指向的内容 8 不可改变。简称左定值,因为 const 位于 * 号的左边。
  • B: const 修饰指针,则指针为不可变量。
    1
    2
    3
    4
    5
    6
    int a = 8;
    int* const p = &a;
    *p = 9; // 正确
    int b = 7;
    P = &b; // 错误
    //对于 const 指针 p 其指向的内存地址不能够被改变,但其内容可以改变。简称,右定向。因为 const 位于 * 号的右边。
  • C: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
    1
    2
    3
    int a = 8;
    const int * const p = &a;
    //这时,const p 的指向的内容和指向的内存地址都已固定,不可改变。

C++里是怎么定义常量的?常量存放在内存的哪个位置?

  1. C++ 常量 | 菜鸟教程
    1. 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量
    2. 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。
    3. 常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
  2. 在 C++ 中,有两种简单的定义常量的方式:
    1. 使用 #define 预处理器。
    2. 使用 const 关键字。
  3. 常量在C++里的定义就是一个top-level const加上对象类型,常量定义必须初始化。
    1. 对于局部对象,常量存放在栈区
    2. 对于全局对象,常量存放在全局/静态存储区。
    3. 对于字面值常量,常量存放在常量存储区。
  4. 代码段:
    1. 包括只读存储区和文本区,其中只读存储区存储字符串常量(const就存在这里),文本区存储程序的机器代码。
  5. C++内存分配方式详解(堆、栈、自由存储区、全局/静态存储区和常量存储区)_C/C++_那年聪聪-CSDN博客
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int  a=0;   全局初始化区 .data   

    char *p1;   全局未初始化区 .bss  
    int  main()    
    {    
      int  b; //栈    
      char  s[]="abc"//栈    
      char  *p2; //栈    
      char  *p3="123456"//123456/0在常量区 .text中的_const,p3在栈上。    

      static int c =0//全局(静态)初始化区  .data  
      p1 =  (char  *)malloc(10);  //分配得来得10和20字节的区域就在堆区
      p2  = (char  *)malloc(20);       
      strcpy(p3,"123456"); //123456/0放在常量区,编译器可能会将它与p3所指向的"123456"  优化成一个地方。    
    }
  6. 堆和栈究竟有什么区别?
    1. C++内存分配方式详解(堆、栈、自由存储区、全局/静态存储区和常量存储区)_C/C++_那年聪聪-CSDN博客

Const修饰成员函数的目的是什么?

Const修饰的成员函数表明函数调用不会对对象做出任何更改,事实上,如果确认不会对对象做更改,就应该为函数加上const限定,这样无论const对象还是普通对象都可以调用该函数。

同时定义了两个函数,一个带const,一个不带,会有问题吗?

  1. 不会,这相当于函数的重载。
  2. 原因是:
    1. 按照函数重载的定义,函数名相同而形参表有本质不同的函数称为重载。在类中,由于隐含的this形参的存在,const版本的function函数使得作为形参的this指针的类型变为指向const对象的指针,而非const版本的使得作为形参的this指针就是正常版本的指针。
    2. 此处是发生重载的本质。重载函数在最佳匹配过程中,对于const对象调用的就选取const版本的成员函数,而普通的对象调用就选取非const版本的成员函数。
  3. (注:this指针是一个const指针,地址不能改,但能改变其指向的对象或者变量)
  4. C++ 学习之函数重载、基于const的重载_C/C++_guiyinzhou的专栏-CSDN博客