const——c与c++不同
2015-12-28 10:27
274 查看
C语言中const:
在C语言中,无论初始值为变量还是常量,编译器并没有对const修饰的变量和const修饰的数组进行优化,仅仅只是限定了在const修饰变量上的一些操作,这些操作不能直接的改变变量的值,比如++ 、--等。但是可以间接的改变其值,比如间接的通过指针来改变(程序中所示)。
C++中的const:
一、当const变量的初始值为常量或常量表达式时
在c++中,当const修饰的变量初始值为常量表达式时,c++编译器会对其进行优化,在编译阶段会将所有的用到该const变量的地方都用这个常量所替代,作用和define相似,同时也对const变量上的操作进行限制,但是通过间接改变还是能够改变了const变量所在内存的值(如上图),并且const修饰的数组和C语言一样并没有进行优化。
同上述情况。因为a是一个常量表达式,在编译时就会用10替代a。
二、当const变量的初始值为变量时
在c++中,当const变量的初始值为变量时, c++编译器不会进行优化,效果和c程序运行的一样,仅仅知识对const变量上的操作有所限制仅仅检查直接改变的操作,对间接改变的操作不检查。
综上所述:
const是一个类型限制符,本质上是对变量所在的存储空间有所限制——只能读不能写,就是这个限制导致了const的各种语法特性。
无论是c++还是c,在对待const变量时,在编译时,都检查这个变量是否有修改其值得操作。同时都能间接改变变量的值而在编译时不会被编译器发现,并且都对数组中改变的操作不进行优化处理。除了这些相同点之外,c++还对变量进行优化,当变量的初始值为常量表达式时,c++编译器就会将程序中所有用到该变量的位置用这个常量表达式代替,当初始化为变量时不做任何处理。
C++中const优点:
const最大的优点在于const修饰的对象并不算是一个完完全全的常量而是一个“伪常量”,本质是一个变量,只不过对其存储空间和编译器行为有所限制,所以这个“伪常量”就完全享受c++带来的严格类型检查机制,比起define使用起来更安全。
(点击查看const与define区别)
const缺点:
一、当初始值为变量时,(如上述所说的),仅仅是这个初始值地址去替代const对象,这比起define,没有省去读内存的操作,效率并没有提高。仅仅是在编译时,编译器把它看作“常量”,对操作有所限制罢了。
二、const仅仅是检查直接改变其值的操作,但是对于间接改变不作处理。比如const数组中元素的间接改变 然而constexpr却好的多。
(点击查看constexpr)
点击查看
const——指针和引用以及复合类型
#include<stdio.h> int main() { const int n = 10; // int a ;//error: []内必须为常量表达式 *(int *)(&n) = 20; printf("%d\n", n); const int array[5] = { 1,2,3,4,5 }; *((int *)(&array)+2) = 100; for (int i = 0; i < 5; i++) { printf("%d ", array[i]); } //getchar(); return 0; }
在C语言中,无论初始值为变量还是常量,编译器并没有对const修饰的变量和const修饰的数组进行优化,仅仅只是限定了在const修饰变量上的一些操作,这些操作不能直接的改变变量的值,比如++ 、--等。但是可以间接的改变其值,比如间接的通过指针来改变(程序中所示)。
C++中的const:
一、当const变量的初始值为常量或常量表达式时
#include <iostream> using namespace std; int main() { const int n = 10; //(10的十六进制为a) int array ; cout << &n << endl; *(const_cast<int *>(&n)) = 1024; cout << n << endl; const int Array[5]{ 1,2,3,4,5 }; *(const_cast<int *>(Array) + 2) = 100; for each (int i in Array) { cout << i << endl; } //cin.get(); return 0; }
在c++中,当const修饰的变量初始值为常量表达式时,c++编译器会对其进行优化,在编译阶段会将所有的用到该const变量的地方都用这个常量所替代,作用和define相似,同时也对const变量上的操作进行限制,但是通过间接改变还是能够改变了const变量所在内存的值(如上图),并且const修饰的数组和C语言一样并没有进行优化。
#include <iostream> using namespace std; int main() { const int a = 10; const int n = a; int array ; cout << &n << endl; *(const_cast<int *>(&n)) = 1024; cout << n << endl; const int Array[5]{ 1,2,3,4,5 }; *(const_cast<int *>(Array) + 2) = 100; for each (int i in Array) { cout << i << endl; } cin.get(); return 0; }
同上述情况。因为a是一个常量表达式,在编译时就会用10替代a。
二、当const变量的初始值为变量时
#include <iostream> using namespace std; int main() { int a = 10; const int n = a; //int array ;//error: []内必须为常量表达式 cout << &n << endl; *(const_cast<int *>(&n)) = 1024; cout << n << endl; cin.get(); return 0; }
在c++中,当const变量的初始值为变量时, c++编译器不会进行优化,效果和c程序运行的一样,仅仅知识对const变量上的操作有所限制仅仅检查直接改变的操作,对间接改变的操作不检查。
综上所述:
const是一个类型限制符,本质上是对变量所在的存储空间有所限制——只能读不能写,就是这个限制导致了const的各种语法特性。
无论是c++还是c,在对待const变量时,在编译时,都检查这个变量是否有修改其值得操作。同时都能间接改变变量的值而在编译时不会被编译器发现,并且都对数组中改变的操作不进行优化处理。除了这些相同点之外,c++还对变量进行优化,当变量的初始值为常量表达式时,c++编译器就会将程序中所有用到该变量的位置用这个常量表达式代替,当初始化为变量时不做任何处理。
C++中const优点:
const最大的优点在于const修饰的对象并不算是一个完完全全的常量而是一个“伪常量”,本质是一个变量,只不过对其存储空间和编译器行为有所限制,所以这个“伪常量”就完全享受c++带来的严格类型检查机制,比起define使用起来更安全。
(点击查看const与define区别)
const缺点:
一、当初始值为变量时,(如上述所说的),仅仅是这个初始值地址去替代const对象,这比起define,没有省去读内存的操作,效率并没有提高。仅仅是在编译时,编译器把它看作“常量”,对操作有所限制罢了。
二、const仅仅是检查直接改变其值的操作,但是对于间接改变不作处理。比如const数组中元素的间接改变 然而constexpr却好的多。
(点击查看constexpr)
点击查看
const——指针和引用以及复合类型
相关文章推荐
- C语言字符串操作总结大全
- 【C++】动态开辟二维数组
- 【C++】斐波那契数列前N项的和递归与非递归算法
- C/C++——C和C++怎样分配和释放内存,区别是什么?
- 图的最短路径问题————树上奶牛(tree.cpp)
- c++标准库 及 命名空间std
- C语言创始人
- c++异常处理
- 【c语言】模拟库函数strstr
- c++变量的存储区域
- C语言数组内存初始化
- 《C语言及程序设计》第22讲实践项目
- C++ iterator 前++ 后++ 效率区别
- c++字符集之间转换(UTF-8,UNICODE,Gb2312)
- C++ 头文件使用指南
- C/C++项目中调用约定(编译器)的问题
- C语言项目总结
- C语言变长数组 struct中char data[0]的用法
- C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)
- C++类的前置声明