c 和c++中const的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Cell_KEY/article/details/53782141

C中const的用法:

        1.在定义变量时使用

a)  最简单的用法,说明变量为一个常变量(在以下例子里,int const的先后顺序可以改变的,这无所谓):

     const int a=100; 
     int const b=100;


b)  说明指针为指向常数的指针,即指针本身的值是可以改变的:

    const int *a=&b; 


c)  说明指针本身的值不可改变,但指向的内容可改变:
 int * const a = &b

d)  说明指针为指向常数的常指针,即指针本身与指针指向的内容都不可改变:

    const int * const a = &b

      2,  在定义函数时使用:

a) 作为参数使用,说明函数体内是不能修改该参数的:

   void func(const int a)

b) 作为返回值使用,说明函数的返回值是不能被修改的:

  const int func()

c) 在函数中使用const,情况与定义变量的情况基本一致:

注意:const与指针搭配使用

      首先必须弄清楚两个基础概念:指针常量和常量指针

      指针常量:即指针本身的值是不可改变的,而指针指向的变量的值是可以改变的;

      常量指针:即指针指向的变量的值是不可改变的,而指针本身的值是可以改变的;

      可以这样去理解:因为指针本身也是一个变量,只不过指针存放的是地址而已,而一旦指针变成了常量,即指针本身的值是不可变的,此时指针只能指向固定的存储单元;指针一般会指向一个变量,如果该变量成为一个常量,那么该变量的值就不能被修改,即常量指针,指针指向的是一个不可变的变量。


 

C++中区别于Cconst用法主要分为以下两种

      1, const类成员

        const类成员在对象构造期间允许被初始化并且在以后不允许被改变。const类成员和一般的const 变量有所不同。const类成员是对应于每个对象而言,它在对象构造期间被初始化,在这个对象的生存周期中不允许被改变。

2, const 成员函数

const 成员函数不允许在此函数体内对此函数对应的类的所有成员变量进行修改,这样可以提高程序的健壮性。Const一般放在函数体后:

functionType   fun()   const 

  1. C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中.所以,以下代码:
    #include <iostream>
    using namespace std;
    int main()
    {
     const int a = 1;
     const int b = 2;
     int array[ a + b ] = {0};
     for (int i = 0; i < sizeof array / sizeof *array; i++)
     {
            cout << array[i] << endl;
     }
    }
    在可以通过编译,并且正常运行.但稍加修改后,放在C编译器中,便会出现错误:
    #include <stdio.h>
    int main()
    {
     int i;
     const int a = 1;
     const int b = 2;

     int array[ a + b ] = {0};
     for (i = 0; i < sizeof array / sizeof *array; i++)
     {
            printf("%d",array[i]);
     }
    }
    错误消息:
    c:\test1\te.c(8): error C2057: 应输入常数表达式
    c:\test1\te.c(8): error C2466: 不能分配常数大小为 0 的数组
    出现这种情况的原因是:
    在C中,const是一个不能被改变的普通变量,既然是变量,就要占用存储空间,所以编译器不知道编译时的值.而且,数组定义时的下标必须为常量.
    在C语言中:
    const int size;
    这个语句是正确的,因为它被C编译器看作一个声明,指明在别的地方分配存储空间.但在C++中这样写是不正确的.C++中const默认是内部连接,如果想在C++中达到以上的效果,必须要用extern关键字.
  2. C++中,const默认使用内部连接.而C中使用外部连接.
    内连接:编译器只对正被编译的文件创建存储空间,别的文件可以使用相同的表示符
          或全局变量.C/C++中内连接使用static关键字指定.
    外连接:所有被编译过的文件创建一片单独存储空间.一旦空间被创建,连接器必须解
          决对这片存储空间的引用.全局变量和函数使用外部连接.通过extern关键
          字声明,可以从其他文件访问相应的变量和函数.
    ************************C++代码******************************
    header.h
    const int test = 1;
    test1.cpp
    #include <iostream>
    #include "header.h"
    using namespace std;
    int main()
    {
     cout << "in test1 :" << test << endl;
    }
    test2.cpp
    #include <iostream>
    #include "header.h"
    using namespace std;
    void print()
    {
     cout << "in test2:" << test << endl;    
    }
    以上代码编译连接完全不会出问题,但如果把header.h改为:
    extern const int test = 1;
    在连接的时候,便会出现以下错误信息:
    test2 error LNK2005: "int const test" (?test@@3HB) 已经在 test1.obj 中定义
    因为extern关键字告诉C++编译器test会在其他地方引用,所以,C++编译器就会为test创建存储空间,不再是简单的存储在名字表里面.所以,当两个文件同时包含header.h的时候,会发生名字上的冲突.
    此种情况和C中const含义相似:
    header.h
    const int test = 1;
    test1.c
    #include <stdio.h>
    #include "header.h"
    int main()
    {
     printf("in test1:%d\n",test);
    }

    test2.c
    #include <stdio.h>
    #include "header.h"
    void print()
    {
     printf("in test2:%d\n",test);    
    }
    错误消息:
    test3 fatal error LNK1169: 找到一个或多个多重定义的符号
    test3 error LNK2005: _test 已经在 test1.obj 中定义
  3. C++中,是否为const分配空间要看具体情况.
    如果加上关键字extern或者取const变量地址,则编译器就要为const分配存储空间.

     4.C++中定义常量的时候不再采用define,因为define只做简单的宏替换,并不提供类型检查.

引自“http://blog.pfan.cn/chenhao”


猜你喜欢

转载自blog.csdn.net/Cell_KEY/article/details/53782141