C++ const 精髓
CC++中CONST用法总结(推荐)

CC++中CONST⽤法总结(推荐)1、修饰常量时:const int temp1; //temp1为常量,不可变 int const temp2; //temp2为常量,不可变2、修饰指针时: 主要看const在*的前后,在前则指针指向的内容为常量,在后则指针本⾝为常量;const int *ptr; //*ptr为常量; int const *ptr; //*ptr为常量; int* const ptr; //ptr为常量; const int * const ptr; //*ptr、ptr均为常量;3、const修饰类对象时: const修饰类对象时,其对象中的任何成员都不能被修改。
const修饰的对象,该对象的任何⾮const成员函数都不能调⽤该对象,因为任何⾮const成员函数都会有修改成员变量的可能。
class TEMP{ void func1(); void func2() const; } const TEMP temp; temp.func1(); //错误; temp.func2(); //正确;4、const修饰成员变量: const修饰的成员变量不能被修改,同时只能在初始化列表中被初始化,因为常量只能被初始化,不能被赋值; 赋值是使⽤新值覆盖旧值构造函数是先为其开辟空间然后为其赋值,不是初始化;⽽初始化列表开辟空间和初始化是同时完成的,直接给与⼀个值,所以const成员变量⼀定要在初始化列表中完成。
class TEMP{ const int val; TEMP(int x)val(x){}; //只能在初始化列表中赋值; }5、const修饰类的成员函数 const成员函数表⽰该成员函数不能修改类对象中的任何⾮const成员变量。
⼀般const写在函数的后⾯,形如:void func() const; 如果某个成员函数不会修改成员变量,那么最好将其声明为const,因为const成员函数不会对数据进⾏修改,如果修改,编译器将会报错;class TEMP{ void func()const; //常成员函数,不能修改对象中的成员变量,也不能调⽤类中任何⾮const成员函数; } 对于const类对象,只能调⽤类中的const成员函数,所以const修饰成员函数的作⽤主要就是限制对const对象的使⽤。
C语言的const使用方法

C语言的const使用方法C语言的const使用方法C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。
以下是店铺为大家搜索整理的C 语言的const使用方法,希望能给大家带来帮助!const是一个C语言的关键字,它限定一个变量不允许被改变。
使用const在一定程度上可以提高程序的安全性和可靠性。
const的使用是c语言中一个比较微妙的地方,请看下面几个问题。
问题:const变量和常量为什么下面的例子在使用一个const变量来初始化数组,ANSI C 的编译器会报告一个错误呢?const int n = 5;int a[n];答案与分析:1)这个问题讨论的是“常量”与“只读变量”的区别。
常量肯定是只读的,例如5,“abc”,等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。
而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。
C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。
上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。
而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。
2) 注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它。
3) 那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。
问题:const变量和 const 限定的内容下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?typedef char * pStr;char string[4] = "abc";const char *p1 = string;const pStr p2 = string;p1++;p2++;答案与分析:问题出在p2++上。
C语言中const是什么意思

C语言中const是什么意思。
const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。
const关键字使用非常的灵活,这一点和php差别很大,php中const用来在类中定义一个常量,而在c中,const因位置不同有不同的作用,因情景不同有不同的角色,使用起来也是非常的灵活。
一、const用来修饰普通的变量(指针变量除外)的时候,const type name 和type const name 这两种形式是完全等价的,都表示其是常量,不能进行修改。
二、const用来修饰指针变量的时候,分为以下四种情况1、const type *name :这种情况下,const修饰的指针变量name所指向的type 类型对象,也就是说指向的这个对象是不能进行修改的,因为其是常量,而指针变量确实可以进行修改的。
2、type const *name :这种情况下,const修饰的指针变量name所指向的type 类型对象,意思完全同上,只是颠倒了以下顺序。
3、type * const name :这种情况下,const修饰的指针变量name,也就是说这个指针变量的值是不能进行修改的,但是指针变量所指向的对象确实可以修改的。
4、const type * const name :这种情况下,const修饰的指针变量name以及指针变量name所指向的对象,也就是说这个指针变量以及这个指针变量所指向的对象都是不能进行修改的。
扩展资料使用const在一定程度上可以提高程序的安全性和可靠性。
另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。
另外CONST在其它编程语言中也有出现,例如Pascal、C++、PHP5、B#.net、HC08 C、C#等。
在c中,对于const定义的指针,不赋初值编译不报错,int* const px;这种定义是不允许的。
(指针常量定义的时候对其进行初始化)int const *px;这种定义是允许的。
c语言中const的含义和意思

c语言中const的含义和意思C语言中,const关键字用于指定程序中的常量。
其含义是该变量只能被初始化一次,且在初始化后不能被修改。
也就是说,const修饰的变量是只读的,不能再被改变。
const关键字可以修饰变量、函数、指针等。
下面将分别介绍它们的含义和用法:1. const修饰变量在C语言中,可以使用const关键字来定义常量。
例如:const int MAX_NUM = 100;这里将MAX_NUM定义为一个常量,它的值不能再被修改。
2. const修饰函数在C语言中,我们可以使用const关键字来修饰函数,指明该函数不会修改任何参数的值。
例如:int sum(const int* arr, int n){int s = 0;for(int i=0;i<n;i++){s += arr[i];}return s;}在上面的例子中,我们使用const修饰了函数的第一个参数(指针),这意味着函数不会修改指针所指的内容。
3. const修饰指针在C语言中,const还可以用来修饰指针。
例如:const int* p;这个例子中,p是一个指向int类型的指针,但是它指向的内容是只读的,不能被修改。
另一个例子:int* const p;在这个例子中,p是一个指向int类型的指针,但是它本身是不可变的,不能再指向其他的地址。
总之,在C语言中,使用const可以帮助我们在编写程序时更加安全地使用变量、函数和指针。
它可以防止数据被随意修改,保证程序的正确性。
c语言中const的作用

c语言中const的作用
C语言中的const关键字表示常量,其作用是用于声明不可更改的变量。
也就是说,一旦一个变量被声明为const类型,就不能再对其进行赋值操作。
使用const可以带来如下好处:
1.保证变量的值不会被改变。
这在程序中起到了重要的作用,因为一些常量在程序中的值是不允许被改变的。
2.有助于编译器进行优化。
const常量在程序中只需要被读取,而不需要被修改,这样编译器可以将其存储在只读的数据段中,不必在栈或堆上开辟空间。
这样可以减少内存的使用,提高程序的运行速度。
3.提高代码的可读性。
使用const可以使代码更加清晰明了,让其他程序员更容易理解代码的含义。
const可以用于变量、函数参数、函数返回值等,具体用法如下: 1.变量:
const int a = 10; //声明一个const整型变量a,其值为10,不可更改
const char b = 'A'; //声明一个const字符型变量b,其值为'A',不可更改
2.函数参数:
void fun(const int a); //声明一个函数fun,参数为const
类型的整型变量a,表示在函数中a的值不能被修改
3.函数返回值:
const int fun(); //声明一个函数fun,返回值为const类型的整型变量,表示返回值不能被修改
总之,使用const关键字可以提高程序的可靠性、可读性和效率,是C语言中非常实用的关键字。
c语言中const的用法

c语言中const的用法c语言中const有着重要的作用,它可以用来确保变量值在执行过程中不被意外改变,避免程序出现混乱的状态。
在编程中,const 指令可以提供一种方式确保变量的值在执行过程中不会被改变。
以下是关于c语言中const的一些用法。
1.义常量const关键字可以用来定义常量,其中的值在程序执行过程中不会发生变化。
例如,定义一个PI常量,其值为3.14:const double PI = 3.14;这就表明PI的值不可以被修改,否则程序将会报错。
定义常量时,变量的声明类型和值要在定义时就确定,之后不能再改变。
2.明指针const关键字也可以用来声明指针,用来防止指针指向的内容被意外修改。
例如:int a = 10;const int* p = &a;这里声明的指针p是const的,它指向的内存空间在程序运行过程中不能被修改,否则程序会报错。
3.定函数参数c语言中const也可以用于在函数声明和定义中限定函数参数。
在函数定义时,可以使用const将参数变量声明为只读,因此它的值在函数中不能改变。
例如:void foo(const int a){a = 10; // error,编译会报错}4. const成员函数const有时也可以用于声明成员函数,表明其为只读操作,不能修改成员变量。
const成员函数不能修改类中数据成员和静态成员,但是可以调用非const成员函数。
例如:class Foo{public:void nonConstFunc();void constFunc() const;private:int m_value;};5. const_castconst_cast也是一种常用的表达式,它可以用于在不同类型之间转换,也可以用于去除const属性。
例如:int a = 10;const int* p = &a;int* p1 = p; // errorint* p2 = const_cast<int*>(p); //const int*转换成int* 以上就是围绕c语言中const的用法做的介绍,它可以用于定义常量、声明指针、限定函数参数和const成员函数等。
C精髓

C++学习笔记一、预处理器1、引用指示符:#include#include <somefile.h>#include “myfile.h”用<>括起来的,表明这个头文件是一个工程或者标准头文件,查找过程会检查预定义的目录;用””引号括起来的,表明该文件是用户提供的文件,查找文件时将从当前文件目录开始。
2、条件指示符:#ifndef … #define…. #endif#ifndef SOMEFILE_H#define SOMEFILE_H#endif条件指示符#ifndef可以检查SOMEFILE_H在前面的文件中是否已经被定义,如果没有定义,则执行#ifndef和#endif之间的所有语句,相反,如果已经被定义了,那么#ifndef 和#endif之间的所有语句都会被忽略。
3、条件指示符:#ifdef…#endif#ifdef语句通常用来避免头文件重复引用,但是也可以用来判断一个预处理器常量是否被定义,以便有条件的包含程序代码。
int mian(){#ifdef DEBUGcout << “Beginning execution of mian()\n”;#endif}在Unix系统中,可以使用-D选项,并在后面写上预处理器常量的名字来定义预处理器常量。
$ CC –DDEBUG mian.c4、编译指示符:__cplusplus和__STDC__编译C++程序时,编译器自动定义了一个预处理器名字__cplusplus(前面两个下划线),一般会根据它来判断是否是C++程序。
#ifdef __cplusplusextern “C”//表明程序是C++程序,extern “C”的作用,见后面介绍。
#endif在编译标准C时,编译器将自动定义名字__STDC__。
__cplusplus和__STDC__在程序中不会同时被定义的。
5、预定义名字:__LINE__、__FILE__、__TIME__、__DA TE____LINE__是指程序源码文件已经被编译的行数。
C语言三剑客之《C专家编程》一书精华提炼

C语言三剑客之《C专家编程》一书精华提炼C语言的设计哲学:一切工作程序员自己负责。
语言中的所有特性都不需要隐式的运行时支持。
程序员所做的都是对的。
程序员应该知道自己在干什么,并保证自己的所作所为是正确的。
第1章-- C: 穿越时空的迷雾小即是美。
事物发展都有个过程,由简入繁,不能一开始就想得太复杂,Multics, IBM的OS/360都是因此而失败。
C语言的许多特性是为了方便编译器设计者而建立的。
----唉,怎么这个样子C语言的基本数据类型直接与底层硬件相对应。
----确实如此register关键字,这个设计可以说是一个失误,如果让编译器在使用各个变量时自动处理寄存器的分配工作,显然比一经声明就把这类变量在生命周期内始终保留在寄存器里要好,使用register关键字,简化了编译器,却把包袱丢给了程序员。
C编译器不曾实现的一些功能必须通过其他途径实现----标准I/O 库和C预处理器。
在宏扩展中,空格会对扩展的结果造成很大的影响。
宏后面不可加';',它不是C语句。
宏最好只用于命名常量,并为一些适当的结构提供简捷的记法。
宏名应该大写这样便很容易与函数调用区分开来。
const关键字原先如果命名为readonly就好多了。
const int *p;是指不能够通过通过p来改变int的值,即:*p = 30和p[3] = 4都是错误,但p是可以改变。
const int *与int *是相容的,都是指向int的指针;const int **与int **不相容,前者是指向const int *的指针,int **是指向int *的指针。
尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。
只有在使用位段和二进制掩码时,才可以使用无符号数。
应该在表达式中使用强制类型转换,使操作数均为有符号数,或者无符号数,这样就不必由编译器来选择结果的类型。
有个例子,在ANSI C中,-1 < (unsigned char)1为真,而-1 < (unsigned int)1 为假。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.const的用法:看到const 关键字,C++程序员首先想到的可能是const 常量。
这可不是良好的条件反射。
如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。
const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。
const 是constant 的缩写,“恒定不变”的意思。
被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
所以很多C++程序设计书籍建议:“Use const whenever you need”。
1.用const 修饰函数的参数如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。
const 只能修饰输入参数:如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy 函数:void StringCopy(char *strDestination, const char *strSource);其中strSource 是输入参数,strDestination 是输出参数。
给strSource 加上const修饰后,如果函数体内的语句试图改动strSource 的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
例如不要将函数void Func1(int x) 写成void Func1(const int x)。
同理不要将函数void Func2(A a) 写成void Func2(const A a)。
其中A 为用户自定义的数据类型。
对于非内部数据类型的参数而言,象void Func(A a) 这样声明的函数注定效率比较底。
因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
为了提高效率,可以将函数声明改为void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。
但是函数void Func(A & a) 存在一个缺点:“引用传递”有可能改变参数a,这是我们不期望的。
解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。
以此类推,是否应将void Func(int x) 改写为void Func(const int &x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
问题是如此的缠绵,我只好将“const &”修饰输入参数的用法总结一下。
对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。
例如将void Func(A a) 改为void Func(const A &a)。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。
否则既达不到提高效率的目的,又降低了函数的可理解性。
例如void Func(int x) 不应该改为void Func(const int &x)。
2 .用const 修饰函数的返回值如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
例如函数const char * GetString(void);如下语句将出现编译错误:char *str = GetString();正确的用法是const char *str = GetString();如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。
例如不要把函数int GetInt(void) 写成const int GetInt(void)。
同理不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。
如果返回值不是内部数据类型,将函数A GetA(void) 改写为const A & GetA(void)的确能提高效率。
但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如:class A{A & operate = (const A & other); // 赋值函数} ;A a, b, c; // a, b, c 为A 的对象a =b = c; // 正常的链式赋值(a = b) = c; // 不正常的链式赋值,但合法如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。
上例中,语句a = b = c 仍然正确,但是语句(a = b) = c 则是非法的。
3. const 成员函数任何不会修改数据成员(即函数中的变量)的函数都应该声明为const 类型。
如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
以下程序中,类stack 的成员函数GetCount 仅用于计数,从逻辑上讲GetCount 应当为const 函数。
编译器将指出GetCount 函数中的错误。
class Stack{public:void Push(int elem);int Pop(void);int GetCount(void) const; // const 成员函数private:int m_num;int m_data[100];} ;int Stack::GetCount(void) const{++ m_num; // 编译错误,企图修改数据成员m_numPop(); // 编译错误,企图调用非const 函数return m_num;}const 成员函数的声明看起来怪怪的:const 关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。
关于Const函数的几点规则:a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const 成员函数.b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.e. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。
const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)用法1:常量取代了C中的宏定义,声明时必须进行初始化。
const限制了常量的使用方式,并没有描述常量应该如何分配。
如果编译器知道了某const的所有使用,它甚至可以不为该const分配空间。
最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。
―《C++ Program Language》用const声明的变量虽然增加了分配空间,但是可以保证类型安全。
C标准中,const定义的常量是全局的,C++中视声明位置而定。
用法2:指针和常量使用指针时涉及到两个对象:该指针本身和被它所指的对象。
将一个指针的声明用const“预先固定”将使那个对象而不是使这个指针成为常量。
要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const。
所以出现在 * 之前的const是作为基础类型的一部分:char *const cp; //到char的const指针char const *pc1; //到const char的指针const char *pc2; //到const char的指针(后两个声明是等同的)从右向左读的记忆方式:cp is a const pointer to char.pc2 is a pointer to const char.用法3:const修饰函数传入参数将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。
同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。
通常修饰指针参数和引用参数:void Fun( const A *in); //修饰指针型传入参数void Fun(const A &in); //修饰引用型传入参数用法4:修饰函数返回值可以阻止用户修改返回值。
返回值也要相应的付给一个常量或常指针。
用法5:const修饰成员函数const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const 成员函数;const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;const成员函数不可以修改对象的数据,不管对象是否具有const性质。
编译时以是否修改成员数据为依据进行检查。
Const 深度解析我们也许学习过const的使用,但是对于const的细致的技术细节却不一定掌握。
const的用法在许多的教材上只是简单的介绍,在这里我们对 const进行细致的概念以及用法剖析。
const 是由c++采用,并加进标准c中,但是他们的意义完全不同,在旧版本(标准前)的c中,如果想建立一个常量,必须使用预处理器:#define PI 3.14159此后无论在何处使用PI,都会被预处理器以3.14159替代。
编译器不对PI进行类型检查,也就是说可以不受限制的建立宏并用它来替代值,如果使用不慎,很可能由预处理引入错误,这些错误往往很难发现。
我们也不能得到PI的地址(即不能向PI传递指针和引用)。
c++引入了命名常量的概念,命名常量就像变量一样,只是它的值不能改变,如果试图改变一个const 对象,编译器将会产生错误。
const 和正常变量一样有作用域,所以函数内部的const 也不会影响程序的其余部分。
在c++中const可以取代预处理器#define来进行值替代, const 有安全的类型检查,所以不用担心会像预处理器一样引入错误。
在通常的情况下const同预处理器#define一样只是将所赋值保存入编译器的符号表中(符号表仅仅在编译时存在,在编译过程中编译器将程序中的名字与之在符号表中定义的数值作简单的替换),在使用的时候进行值替换,并不为const创建存储空间。