`
rollstone
  • 浏览: 39282 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

const的理解和应用

 
阅读更多

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
};
分享到:
评论

相关推荐

    C++ const应用总结

    本文将深入探讨`const`在C++中的各种应用,帮助你更好地理解和运用这一关键概念。 1. 常量声明: `const`关键字用于声明常量变量,一旦赋值后,其值不能被改变。例如: ```cpp const int a = 5; // 声明一个整型...

    const的理解和用法

    ### const的理解和用法 在C++编程语言中,`const`关键字是非常重要的一个特性,它可以帮助程序员更好地控制代码中的变量、指针等资源的访问权限。本文将详细介绍`const`的基本概念、不同应用场景下的使用方法及其...

    const和volatile分析

    在C++编程语言中,`const`和`volatile`是两个非常重要的关键字,它们用于修饰变量,赋予变量特殊的属性。这两个关键字在理解程序的...因此,对`const`和`volatile`的深入理解和应用是每个专业IT从业者必备的知识点。

    const T vs. T const

    通过本文的知识点,我们可以理解const关键字如何影响变量的可修改性,以及在不同情况下const关键字和类型声明组合的意义。这对于编写更安全、更符合预期行为的C和C++代码非常重要。在实际开发中,了解和使用const的...

    有关const的理解和用法

    ### 有关const的理解和用法 #### 一、引言 `const` 是 C 语言中的一个重要关键字,用于声明常量或指定某些属性不可更改。本文旨在深入解析 `const` 的概念及其在 C 代码中的多种应用方式。通过具体实例和细致分析...

    static和const用法详解

    Static和Const用的详解 static和const是C语言中两个非常重要的关键字,它们在程序设计中扮演着不同的角色。...通过本文的介绍,我们可以更好地理解static和const的用法和特性,从而更好地应用它们来编写高效的程序。

    C++中const关键字详解

    ### C++中const关键字详解 #### 一、引言 在C++编程语言中,`const`关键字是一个非常重要的概念,它被广泛用于各种上下...理解`const`的关键在于掌握它的用法和语法细节,特别是在涉及指针和复杂数据结构的情况下。

    C++const关键字详解

    本文将深入探讨`const`关键字的各种用法和其背后的原理,帮助读者更全面地理解和应用这一特性。 #### 一、基本常量声明 `const`关键字可以用来声明不会改变的常量。常量声明有两种常见的格式: ```cpp const ...

    const知识点实例

    在C++编程语言中,`const`关键字是一个...在`execConst`这个文件中,可能包含的就是关于这些`const`知识点的示例代码和实践应用。通过学习和理解这些例子,开发者可以深入掌握`const`的用法及其在实际编程中的意义。

    const与指针的关系

    ### const与指针的关系 #### 一、const与指针的基本分类 ...总之,理解和掌握`const`与指针之间的关系对于编写高效、安全的C/C++程序至关重要。通过本文的分析,希望读者能够更好地理解和运用这些概念。

    C++中的`const`与`constexpr`:深入理解与应用

    const和constexpr都是C++中定义常量的重要工具,但它们有着不同的用途和限制。const更侧重于定义运行时常量和确保数据不可...希望本文能帮助你更深入地理解const和constexpr,并在你的C++编程实践中更有效地使用它们。

    c语言const的用法详解

    #### 五、const的深入理解 1. **常量表达式**: - `const`变量可以作为数组大小等常量表达式的参数。 ```c const int size = 100; int array[size]; // 合法:size是常量表达式 ``` 2. **复合声明**: - `...

    关于const 的用法

    关于C++中`const`关键字的用法,它在编程中扮演着至关重要的角色,尤其对于初学者来说,深入理解其工作原理和应用场景是至关重要的。`const`关键字主要用于声明常量或对象的不可变性,它能提高代码的安全性和效率,...

    关于const在C++中的用法

    关于`const`在C++中的用法,是一个深入理解C++编程语言的关键点。`const`关键字在C++中主要用于声明常量或者指定某个变量、指针或成员...正确理解和运用`const`,能够帮助程序员编写出更加高效、稳定和易于维护的代码。

    const data彻底研究

    `const`数据不仅是编程实践中安全性与效率的重要保障,也是深入理解C++语言特性的关键之一。未来的研究还可以探索`const`在模板元编程、类型安全等方面的应用,进一步挖掘其在现代软件开发中的潜力。

    C++中const用法总结

    本文将详细介绍 `const` 在 C++ 中的各种应用场景,并给出具体的示例以便于理解。 #### 二、const修饰普通变量和指针 `const` 可以用来修饰变量、指针等,使它们成为不可变的常量。在修饰普通变量时,无论 `const`...

    const char*转LPCWSTR 字符串转换

    总的来说,`const char*`到`LPCWSTR`的转换是Windows API编程中的常见任务,理解和掌握正确的转换方法对于编写高效、可靠的Windows应用程序至关重要。通过合理选择和应用上述转换策略,可以确保你的代码能够正确处理...

    const用法详解

    ### const用法详解:深入解析C++中的常量与const关键字 ...正确理解和运用`const`,对于开发高质量的C++程序至关重要。无论是初学者还是有经验的开发者,都应该掌握`const`的用法,以充分利用其带来的优势。

    Dan_Sake 总结const用法一文,原创译稿

    在C++编程语言中,`const`关键字是一个非常重要的元素... T const》深入浅出地讲解了`const`的用法,对理解和应用这一特性非常有帮助,尤其对于嵌入式系统编程等对代码质量要求较高的领域,是一份值得学习的经典文献。

    精彩编程与编程技巧-软件工程篇-Const与#Const的对比...

    `#Const` 的一个典型应用是在条件编译中,例如,用于区分调试版本和发布版本的代码: ```vb #Const DEBUG_VERSION As Boolean = True #if DEBUG_VERSION MsgBox "This is a debug version." #else MsgBox "This ...

Global site tag (gtag.js) - Google Analytics