- 浏览: 39282 次
- 性别:
- 来自: 上海
-
最新评论
const的理解和应用
一.理解
const是一种语义上的约束,可以通知编译器和其他程序员某个值要保持不变。尽量使用const可以帮助在编译的时候发现错误,使程序更容易懂。
二.用法
const修饰的变量必须在定义的同时初始化(理解为只读的变量,定义时候不初始化,其他地方肯定不可以修改)
a.对于指针
const char *p = "hello"; // 非const指针, const数据
char * const p = "hello"; // const指针, 非const数据
const char * const p = "hello"; // const指针,const数据
const修饰的是紧跟其后的变量。简单记忆:const出现在*号的左边,表示指针指向的数据为常量;出现在右边,表示指针本身为常量(const靠近指针);两边都有,表示二者都是常量。
const char* p 等同于char const *p
b.对于函数
函数的参数表里,形参定义为const类型,表示这个函数不会修改实参的值,当这个形参是个引用的时候,这个非常有用(使程序更容易理解和应用)。
void Fun(const T *const ) //C中表示指针指向的位置和指向的内容都不被修改
void Fun(const T& ) //C++
上面两个形参是等价的.
关于const形参和非const形参:
在C++两种传值方式中,以值传递,const变量和非const变量可以互相传递,因为他们实际是传递一个拷贝,不会威胁原来的数据属性。
而引用传值(传地址)会威胁到原有数据属性(违反const语义)。
所以对以引用传递来说:一个const类型的实参是不能传递给非const类型的形参的(但是GCC,仅仅是给出警告信息,提示discard qualifiers),反过来可以。
例如:
1.void fun ( const char *p );
void fun1(char * p) ;
char *cp = "abc";
const char *cp1="abc";
fun ( cp ) ;//合法
fun1( cp1); //语义上,因为fun1内部可能会修改const类型的cp1,这是不合理的(GCC会警告)
2.实参char **argv 与形参 const char **p 不相容
为啥不相容?我的理解是实参char **argv传给形参const char**p并无 语义和语法上的问题,不相容
仅仅是因为ANSI C标准的规定。
上面的是我自己的理解,官方的解释是:
参数传递过程类似于赋值。合法的赋值,必须满足下列条件之一:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
而
char * 是指向char的指针
const char* 指向的char数据具有const修饰符
他们都指向char,类型相容,修饰符多的做左值,
所以根据上面的原则,const char*只能做左值,也就是形参
对于char **argv和const char **p
const char*本身并没有限定符,只是它指向的内容有限定符
char**argv是指向 char*类型的指针(poitter to poitter to char),const char**p是指向 const char*类型的指针(poitter to poitter to const char)
char*和const char*是都没有限定符的,即argv和p所指向的类型都没有限定符,那么(char*)和(const char*)是相容的类型么?问你的编译器吧,我GCC认为是不相容的- -
c.对于类
1.类的成员函数,被修饰成const类型(const放在参数表后面)表示:
2.这个成员函数不会修改类的成员变量的值;
3.这个const成员函数只能被const类型的对象(或者指向const类型对象的指针)所调用;
4.编译器还会仅仅根据是否有const来判断是不是函数重载(原因见上一条);
mutable关键字:
有种情况是,当类里const函数要修改一些为实现类的机制而定义的变量的时候,这个变量需要用mutable
来声明。
比如iterator 里的_next。_length,_beg_pos才是数列的抽象属性,改变这些,形同改变数列的性质。_next,并不属于数列的属性,
所以将其声明为mutable并不会破坏class object的常数性.
const和非const之间的转换,只能通过const_cast转换(c++)
三.其他
const int Max=100;
int Array[Max];
C,编不过,C++可以编过。说明在C中const类型的Max仍然为变量(定义数组时候必须制定),C++被扩展。
同理在C中 case后也不能const类型的常量(case后只能跟常量,const的修饰,把其理解为只读的变量)
总结:C中定义常量只能用#define,const修饰表示只读;
C++中常量定义,可以用const,也可以用#define;
在C++编程中定义常量要尽量用const来定义常量,好处是:
编译器可以做类型检查,宏常量无类型,而且宏替换会意想不到的错误(当然也可以利用这种特性,写出有意思的代码)
和#define的区别(C语言)
1.const定义的只读变量从汇编的角度来看,只是给除了对应的内存地址,#define给出的是立即数。所以在程序运行中,const变量只有一份拷贝,而#define定义的宏常量在内存中有若干哥拷贝。
2.#define宏是在预编译阶段替换,const变量在编译的时候确定其值
当编译器不允许在类中进行常量的初始化的时候,可以借用enum
class GamePlayer {
private:
enum { NUM_TURNS = 5 } // "the enum hack" — makes
// NUM_TURNS a symbolic name
// for 5
int scores[NUM_TURNS];// fine
};
发表评论
-
指针 多维数组
2012-06-05 16:12 744这篇文章写的很好 http://www.cnblogs.com ... -
pImp
2011-11-08 17:24 886http://www.cnblogs.com/JulyZhan ... -
关于构造函数,析构函数,explicit等内容
2011-11-01 17:04 1230一.编译器会为我们做什 ... -
C语言标准
2011-10-21 12:11 12251.K&R C 1978年,丹尼斯·里奇(Dennis ... -
对话框工厂
2011-10-14 18:00 6751.对于工厂我的理解: 良好的封装性。使用和创建,初始化分开。 ... -
函数指针实现回掉函数
2011-10-14 17:47 981用法: 头文件中声明: DECL_LINK( Paintin ... -
typedef和指针结合
2011-10-14 17:42 8051. typedef (int *) pInt; 2.type ... -
空指针的判断
2011-10-11 17:43 961请看NULL的定义: #if !defined(__cp ... -
GUN C 和 ANSI C的几个区别
2011-10-11 10:52 1134http://hi.baidu.com/deep_pro/bl ... -
浮点数的比较
2011-10-11 10:48 1257一浮点数的知识 1.首先浮点数不用补码表示,只有int型才用补 ... -
关于字符串倒转
2011-10-10 20:25 793有纯倒转,也有按单词为单位的。想做个总结 #inclu ... -
C数组和指针的区别
2011-10-10 19:25 733看《C专家编程》总结的的。 首先是个经典的例子: 一个文件定义 ... -
不用中间变量交换数据
2011-10-10 14:42 672那种加加减减的方法其实不对。因为缩小了数据范围。 a1=a1+ ... -
C++模板
2011-10-08 15:52 661template是关键字,template ... -
Quick Sort(快速排序)
2011-10-08 11:20 731Quick Sort算法描述如下: 假设S代表将被处理的序列 ... -
约瑟夫环的解答
2011-10-07 22:48 673http://blog.csdn.net/kittyjie/a ... -
Linux判断大小尾数(big-endian,little-endian)的方法
2011-10-07 22:12 1531static union { char c[4]; u ... -
c++基本文件操作
2011-09-30 00:28 786#include<iostream> #incl ... -
关于文件操作的头文件,类
2011-09-27 14:11 1111C++ 可以看这个 http://www.cplusplus. ... -
关于回车,换行,EOF
2011-09-26 17:41 2822回车换行: http://www.cnblogs.com/fa ...
相关推荐
本文将深入探讨`const`在C++中的各种应用,帮助你更好地理解和运用这一关键概念。 1. 常量声明: `const`关键字用于声明常量变量,一旦赋值后,其值不能被改变。例如: ```cpp const int a = 5; // 声明一个整型...
### const的理解和用法 在C++编程语言中,`const`关键字是非常重要的一个特性,它可以帮助程序员更好地控制代码中的变量、指针等资源的访问权限。本文将详细介绍`const`的基本概念、不同应用场景下的使用方法及其...
在C++编程语言中,`const`和`volatile`是两个非常重要的关键字,它们用于修饰变量,赋予变量特殊的属性。这两个关键字在理解程序的...因此,对`const`和`volatile`的深入理解和应用是每个专业IT从业者必备的知识点。
通过本文的知识点,我们可以理解const关键字如何影响变量的可修改性,以及在不同情况下const关键字和类型声明组合的意义。这对于编写更安全、更符合预期行为的C和C++代码非常重要。在实际开发中,了解和使用const的...
### 有关const的理解和用法 #### 一、引言 `const` 是 C 语言中的一个重要关键字,用于声明常量或指定某些属性不可更改。本文旨在深入解析 `const` 的概念及其在 C 代码中的多种应用方式。通过具体实例和细致分析...
Static和Const用的详解 static和const是C语言中两个非常重要的关键字,它们在程序设计中扮演着不同的角色。...通过本文的介绍,我们可以更好地理解static和const的用法和特性,从而更好地应用它们来编写高效的程序。
### C++中const关键字详解 #### 一、引言 在C++编程语言中,`const`关键字是一个非常重要的概念,它被广泛用于各种上下...理解`const`的关键在于掌握它的用法和语法细节,特别是在涉及指针和复杂数据结构的情况下。
本文将深入探讨`const`关键字的各种用法和其背后的原理,帮助读者更全面地理解和应用这一特性。 #### 一、基本常量声明 `const`关键字可以用来声明不会改变的常量。常量声明有两种常见的格式: ```cpp const ...
在C++编程语言中,`const`关键字是一个...在`execConst`这个文件中,可能包含的就是关于这些`const`知识点的示例代码和实践应用。通过学习和理解这些例子,开发者可以深入掌握`const`的用法及其在实际编程中的意义。
### const与指针的关系 #### 一、const与指针的基本分类 ...总之,理解和掌握`const`与指针之间的关系对于编写高效、安全的C/C++程序至关重要。通过本文的分析,希望读者能够更好地理解和运用这些概念。
const和constexpr都是C++中定义常量的重要工具,但它们有着不同的用途和限制。const更侧重于定义运行时常量和确保数据不可...希望本文能帮助你更深入地理解const和constexpr,并在你的C++编程实践中更有效地使用它们。
#### 五、const的深入理解 1. **常量表达式**: - `const`变量可以作为数组大小等常量表达式的参数。 ```c const int size = 100; int array[size]; // 合法:size是常量表达式 ``` 2. **复合声明**: - `...
关于C++中`const`关键字的用法,它在编程中扮演着至关重要的角色,尤其对于初学者来说,深入理解其工作原理和应用场景是至关重要的。`const`关键字主要用于声明常量或对象的不可变性,它能提高代码的安全性和效率,...
关于`const`在C++中的用法,是一个深入理解C++编程语言的关键点。`const`关键字在C++中主要用于声明常量或者指定某个变量、指针或成员...正确理解和运用`const`,能够帮助程序员编写出更加高效、稳定和易于维护的代码。
`const`数据不仅是编程实践中安全性与效率的重要保障,也是深入理解C++语言特性的关键之一。未来的研究还可以探索`const`在模板元编程、类型安全等方面的应用,进一步挖掘其在现代软件开发中的潜力。
本文将详细介绍 `const` 在 C++ 中的各种应用场景,并给出具体的示例以便于理解。 #### 二、const修饰普通变量和指针 `const` 可以用来修饰变量、指针等,使它们成为不可变的常量。在修饰普通变量时,无论 `const`...
总的来说,`const char*`到`LPCWSTR`的转换是Windows API编程中的常见任务,理解和掌握正确的转换方法对于编写高效、可靠的Windows应用程序至关重要。通过合理选择和应用上述转换策略,可以确保你的代码能够正确处理...
### const用法详解:深入解析C++中的常量与const关键字 ...正确理解和运用`const`,对于开发高质量的C++程序至关重要。无论是初学者还是有经验的开发者,都应该掌握`const`的用法,以充分利用其带来的优势。
在C++编程语言中,`const`关键字是一个非常重要的元素... T const》深入浅出地讲解了`const`的用法,对理解和应用这一特性非常有帮助,尤其对于嵌入式系统编程等对代码质量要求较高的领域,是一份值得学习的经典文献。
`#Const` 的一个典型应用是在条件编译中,例如,用于区分调试版本和发布版本的代码: ```vb #Const DEBUG_VERSION As Boolean = True #if DEBUG_VERSION MsgBox "This is a debug version." #else MsgBox "This ...