zoukankan      html  css  js  c++  java
  • C与C++在const用法上的区别

           首先,C和C++在大体结构上不同,却在语法上相同。  所以在使用的时候,我们会时常遇到一些莫名其妙的问题,觉得语法上是正确的,但是编译的时候却出现一个红色的 error! 比如今天我遇到的这个有意思的问题。

         1. 今天看到一段代码,觉得很有意思:

     1 #pragma warning(disable : 4090)
     2 
     3 #include<stdio.h>
     4 
     5 int main(int argv, char args []) {
     6 
     7  const int var = 4;
     8     int *p = &var;
     9     *p = 1;
    10     printf("%d
    ",var);
    11     getchar();
    12 }

     答案很定不用说:    1      原因也很简单:  C弱类型语言,C++是强类型语言。  p指针指向了var的地址,并将var的值改变!

    但是,我们再看看,这个两个代码:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 int main(int args , char  argv[]) {
     6 
     7     const int var = 10;
     8     std::cout << "var =" << var << std::endl;
     9     //    int * p= &var;  --不能转换,会报错!
    10     //可以使用强制转换
    11     int  *p = (int *)&var; 
    12     *p = 3;
    13     std::cout << "*p =" << *p << std::endl;
    14     int num[var];
    15 
    16     int i = 0;
    17     //初始化
    18     for (auto data : num) {
    19         data =++i;
    20         std::cout<<"num["<<i-1<<"] =" << data << std::endl;
    21     }
    22     getchar();
    23     return 0;
    24 }

    2.  即便你用这个const_cast《》:强制去掉const属性,但是*p=3,这条语句 ,p指向的地址的值任然没有改变!这两个代码的值,都是这个:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 int main(int args , char  argv[]) {
     6 
     7     const int var = 10;
     8     std::cout << "var =" << var << std::endl;
     9     //    int * p= &var;  --不能转换,会报错!
    10     //可以使用强制去掉const 属性
    11     int  *p = const_cast<int *>(&var);  
    12     *p = 3;
    13     std::cout << "*p =" << *p << std::endl;
    14     std::cout << "var =" << var << std::endl;
    15     int num[var];
    16 
    17     int i = 0;
    18     //初始化
    19     for (auto data : num) {
    20         data =++i;
    21         std::cout<<"num["<<i-1<<"] =" << data << std::endl;
    22     }
    23     getchar();
    24     return 0;
    25 }

    结果

    为:   我们可以看到,var的值,没有改变!  原因是C++是强类型语言,C++的数据的类型更加严格与苛刻 !  

       当然对于C++为何会出现指针的值为*p=3而var=10这样的情况,其实,*P所指的常量地址真实的内存已经修改了,但是编译器并没有从内存地址中取值,而是直接从寄存器中取的值,所以var=10依旧表面上依旧没有发生什么改变!

         2.   那么,对于指针而言呢? const 用到指针就会发挥大作用,可以设定权限,比如  int const * p   /  const int *p (这两个其实可以看做是同一个类型)均为常量指针, 还有 int * const p 指针常量,还有const int  * const p  ;

            根据它们的特性  权限如下:

                int  const *p        -----只能读,不能写,既然是指向常量的指针,当然是可以指向其他常量的。

                int  *  const p     -----能读也能写,但是既然是指针常量, 当然是不能指向其他地址,无法修改其他地址的值。

            int const * const p    ----能读不能写,而且无法指向其他地址的值。

          这样就可以设定权限,对于系统而言,这个是很安全而且很妥当的,还很power ! 当然还可以运用到指针函数什么的 ! 这样const其实作用还是很有用初 的!  特别是用在对安全要求很高的系统,比如银行的系统什么的 

  • 相关阅读:
    【C语言天天练(三)】typedef具体解释
    操作系统之基本分页存储管理方式
    线索二叉树创建及删除
    SVN:This client is too old to work with working copy…解决的方法
    android4.2 telephone应用层分析
    JPA学习笔记(3)——JPA注解
    Android研发中对String的思考(源代码分析)
    《Effective Modern C++》翻译--条款2: 理解auto自己主动类型推导
    “2014年CityEngine三维建模与设计精英培训班”——全国巡回举办
    Git命令总结
  • 原文地址:https://www.cnblogs.com/gongxijun/p/4375458.html
Copyright © 2011-2022 走看看