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\n",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++的数据的类型更加严格与苛刻 !

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其实作用还是很有用初 的!  特别是用在对安全要求很高的系统,比如银行的系统什么的

时间: 2024-11-10 18:25:47

C与C++在const用法上的区别的相关文章

关于self与self class用法上的区别

在许多地方可以见到self和[self class]的调用方式,那么他们有区别吗? 1 首先self是什么,它是指向实例变量首地址的指针(同c++的this一样)可以访问对象的资源. 2 [self class] 首先看下class 它返回的是元类的指针,所以通过[self class]可以访问当前类的静态函数 为什么[self class] 可以访问到类指针呢,可以看下NSObject的结构: @interface NSObject <NSObject> { Class isa  OBJC_

C++ const用法总结

一.关于一般常量 声明或定义的格式如下: const <类型说明符> <变量名> = <常量或常量表达式>; [1] <类型说明符> const <变量名> = <常量或常量表达式>; [2] [1]和[2]的定义是完全等价的. 例如: 整形int(或其他内置类型:float,double,char) const int bufSize = 512; 或者 int const bufSize = 512; 因为常量在定义后就不能被修改

C++ Primer 学习笔记_25_类与数据抽象(11)--const 用法小结、static与const以及static const(const static)

一.const 用法总结 1.可以对const 的用法做个小总结: const int n = 100;  //定义常量 const Test t(10); const int & ref = n;   //const引用 int& ref = n;  //Error [const与指针] const int* p; //const出现在*前面,表示*p是常量 (*p = 200; //Error) int * const p2;  //const出现在*后面,表示p2是常量 (p2 =

C++中const用法总结

1. const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的.对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变.例如:const int nValue:         //nValue是constint const nValue:    // nValue是const但是对于指针类型的TYPE,

#define static const 用法 (转)

1.Define用法: define主要是用于宏常量定义的,使程序看起来更简洁明了,方便代码维护,#define定义的实质只是一个常数的名字,没有具体数据类型的,没有分配内存空间.在编译是会被编译器替换为该常数.每次使用该宏定义,就要进行编译并分配空间,若一个程序中多次使用define定义的数据,则就会有多份拷贝.这么做是为了提高程序的可读性,但安全性相对差点. 2.const用法: const定义的全局数据变量,其基本作用和define相同,但又在define的基础上增加了好多功能.const

【转】话说C语言const用法

原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修饰局部变量.例:void func(){const int a=0;} 首先,我们先把const这个单词忽略不看,那么a是一个int类型的局部自动变量,我们给它赋予初始值0. 然后再看const. const作为一个类型限定词,和int有相同的地位.const int a;int const a;是

const 用法详解

const用法详解 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1. 限定符声明变量只能被读 const int i=5; int j=0; ... i=j;   //非法,导致编译错误 j=i;   //合法 2. 必须初始化 const int i=5;    //合法 const int j;      //非法,导致编译错误 3. 在另一连接文件中引用co

C++中的const用法(2)

前面写过一篇博客介绍const用法:C++中的const用法 今天发现有个忙点,特此补充. 我们知道,一般const修饰指针时有三种情况. <span style="font-size:18px;">const int *p;</span> 这表示p指向一个int型的const变量,但是指针本身并不是const. int a = 0; int *const p = &a; 这种情况表示指针是const,一旦初始化不能指向另外的数据. int a = 0;

const用法归纳总结 C++

非常好的一篇分析const的总结归纳, 在此谢谢原作者:http://blog.csdn.net/zcf1002797280/article/details/7816977 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址.在 const成员函数中,this的类型是一个指向 const类类型对象的 const指针.既不能改变 this所指向的对象,也不能改变 this所保存的地址. 关键字:Const