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 关键字可以用来修饰变量、函数参数和函数返回值,其主要功能是限制变量或参数的修改权限,只允许读取。
const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
const 的作用主要包括以下几个方面:
1. 定义 const 常量:const 定义的常量具有不可变性,可以在程序中保存常数,比如定义一个 const int 类型的常量,表示一个固定的整数。
2. 避免意义模糊的数字出现:在使用变量或参数时,如果变量或参数的名称与其所表示的含义不相关,会导致程序难以理解和维护。
const 关键字可以用来避免意义模糊的数字出现,比如在一个函数中定义一个 const int 类型的参数,表示该参数是一个常量,不能修改。
3. 提高程序的健壮性:const 关键字可以用来保护被修饰的东西,防止意外的修改,增强程序的健壮性。
比如在一个函数中定义一个 const int 类型的参数,如果在函数体内修改了该参数的值,会导致程序崩溃或产生不可预料的结果。
4. 节省空间:const 定义的常量在程序运行期间只有一份拷贝,不需要分配额外的内存空间,可以节省内存空间。
5. 提高程序的效率:const 关键字可以用来限制变量或参数的修改权限,可以避免不必要的内存分配和读写操作,从而提高程序的效率。
const 关键字在 C 语言中有着重要的作用,可以用来定义常量、保护变量或参数、提高程序的健壮性和效率等。
正确合理地使用 const 关键字可以提高程序的质量和维护性。
const用法详解

面向对象是C++的重要特性.但是c++在c的基础上新增加的几点优化也是很耀眼的就const直接可以取代c中的#define以下几点很重要,学不好后果也也很严重const1. 限定符声明变量只能被读const int i=5;int j=0;...i=j; //非法,导致编译错误j=i; //合法2. 必须初始化const int i=5; //合法const int j; //非法,导致编译错误3. 在另一连接文件中引用const常量extern const int i; //合法extern const int j=10; //非法,常量不可以被再次赋值4. 便于进行类型检查用const方法可以使编译器对处理内容有更多了解。
#define I=10const long &i=10; /*dapingguo提醒:由于编译器的优化,使得在const long i=10; 时i不被分配内存,而是已10直接代入以后的引用中,以致在以后的代码中没有错误,为达到说教效果,特别地用&i明确地给出了i的内存分配。
不过一旦你关闭所有优化措施,即使const long i=10;也会引起后面的编译错误。
*/ char h=I; //没有错char h=i; //编译警告,可能由于数的截短带来错误赋值。
5. 可以避免不必要的内存分配#define STRING "abcdefghijklmn\n"const char string[]="abcdefghijklm\n";...printf(STRING); //为STRING分配了第一次内存printf(string); //为string一次分配了内存,以后不再分配...printf(STRING); //为STRING分配了第二次内存printf(string);...由于const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
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 宏、模板经典总结

多年学习C++宏、模板经典总结.txt人生在世,难敌宿命,沉沦其中。
我不爱风尘,似被前缘误!!我只为我最爱的人流泪“我会学着放弃你,是因为我太爱你”赢了你,我可以放弃整个世界一、宏定义:简单宏定义:#define <宏名> <字符串>//字符串可以是常数、表达式、格式串等。
#define PI 3.141.const产生的符号是具有类型的。
而宏定义不具有,它仅仅被另一个字符串替换。
2.在某一个函数体内用const定义的常量是局部常量。
3.const用分号结束,宏定义是一个预处理命令,不带分号。
4.#define定义的标识符不是变量,不占内存。
取消宏定义:#undef<标识符>宏定义可以嵌套:#denfine PI 3.14#define R 10#define AREA (PI*R*R)带参数的宏定义:#define <宏名>(<参数表>) <宏体>#define SUB(a,b) a-b#define SQ(y) (y)*(y)//<宏体>如果写在多行上,在每行结束时,使用续行符"\".//<宏名>与左括号之间不能出现空格。
#define MIN(x,y) (((x)<(y))?(x):(y))#符号把一个符号直接转换为字符串#define STRING(x) #xSTRING(test)替换为"test"。
##会连接两个符号,从而产生新的符号#define SIGN(x) INT_##xSIGN(1)转换为INT_1变参宏:#define LOG (format,...) print(format,_VA_ARGS_)LOG("%s %d",str,cout);_VA_ARGS_是系统预定义宏,被自动替换为参数列表。
语法规定:当一个宏遇到自己时,就停止展开。
函数参数const的用法详解

函数参数const的用法详解摘要:1.函数参数const的概述2.const的定义和特点3.const在函数参数中的用法4.const在函数参数中的实际应用5.const在函数参数中的优缺点分析6.总结正文:【1.函数参数const的概述】在C语言中,const关键字可以用于修饰变量和函数参数,以表示该变量或参数的值在程序执行过程中不会被修改。
在函数参数中使用const可以带来代码的可读性和可维护性的提升,同时也有助于减少程序出错的可能性。
【2.const的定义和特点】const定义的变量或参数是一个只读的,意味着它的值不能被修改。
一旦const变量被初始化,它的值就不能再被改变。
在函数中使用const参数,可以防止在函数内部误修改参数的值,从而提高代码的可靠性。
【3.const在函数参数中的用法】在函数参数中使用const主要有以下两种方式:(1)在函数声明时使用const修饰参数:例如,`void func(const int a)`,这样定义的函数参数a是一个只读参数,不能在函数内部被修改。
(2)在函数定义内部使用const修饰参数:例如,`void func(int a) { const int b = a; }`,这样定义的函数参数a是一个普通参数,但在函数内部被定义为const,因此它的值也不能被修改。
【4.const在函数参数中的实际应用】在实际编程中,const在函数参数中的应用十分广泛。
例如,当需要实现一个计算两个数之和的函数时,可以使用const来确保函数参数的值不被修改:```c#include <stdio.h>void add(const int a, const int b) {int sum = a + b;printf("The sum of %d and %d is %d", a, b, sum);}int main() {add(1, 2);add(3, 4);return 0;}```在这个例子中,函数add的参数a和b都被定义为const,因此在函数内部不能修改它们的值。
c语言 const的用法

C语言中的const一直是C语言初学者心中的痛,这是因为const在不同位置有不同作用,在不同情景有不同角色。
这让初学者摸不清头脑。
今天,和大家一起研究一下const,让它的每个角色都“深入人心”!====================================================================== ========================情景一:最简单的const用法#include<stdio.h>int main(){int const a;a=5;printf("a=%d\n",a);return 0;}如果编译这个c文件,就会报错:1071.c: In function ‘main’:1071.c:5: error: assignment of read-only variable ‘a’显而易见,这是const在搞鬼,因为声明了const的变量是不能修改的!如果将源代码修改为如下这样,就没有问题了!#include<stdio.h>int main(){int const a=5;printf("a=%d\n",a);return 0;}总结:const声明的变量必须要进行初始化赋值,如果错过这个机会,以后再想给const的变量赋值,可就没门了!切记~PS:int const和const int是一回事,“颠倒写”都是可以的。
以后遇到了别犯晕,呵呵。
但是,还是要留个心眼,当const和指针搀和到一起时,这个“颠倒写”的规律可未必成立。
====================================================================== ========================情景二:发明const为了什么?在const诞生之前,开发者一直使用#define V AR 100来定义一些有特殊用途的类常量,不过这样定义是存在一些劣势的。
C语言中const关键字用法总结

C++语言中const关键字用法总结一、const是什么在C/C++ 语言中,const关键字是一种修饰符。
所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码。
就const 修饰符而言,它用来告诉编译器,被修饰的这些东西,具有“只读”的特点。
在编译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。
所以,const修饰符的作用主要是利用编译器帮助我们检查自己代码的正确性。
我们使用con st在源码中标示出“不应该改变”的地方,然后利用编译器,帮助我们检查这些地方是否真的没有被改变过。
如果我们不小心去修改了这些地方,编译器就会报错,从而帮助我们纠正错误。
使用const和不使用cons t,对于最终编译产生的代码并没有影响。
虽然const对于最终代码没有影响,但是尽可能使用const,将帮助我们避免很多错误,提高程序正确率。
二、const可以修饰哪些对象在上面已经提到过了,const是一种修饰符,那它可以作为哪些对象的修饰符呢?下面列举了一些C/C++中用到cons t的地方。
1,const变量2,const指针3,const引用4,const类5,类的const成员变量6,类的const成员函数7,const修饰函数的形参与返回值下面我们分别讨论上面几种情况下,const的用法。
三、const与变量当一个变量被c onst修饰后,具有以下几个特点:1)该变量只能读取不能修改。
(编译器进行检查)2)定义时必须初始化。
3)C++中喜欢用con st来定义常量,取代原来C风格的预编译指令define。
1 const int var; // Error:常量变量"var"需要初始化设定项2 const int var1 = 42;3 var1 = 43; // Error:表达式必须是可以修改的左值上面代码中第一行和第三行都有错误,注释便是编译器给出的错误提示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++中const总结
一、对于基本声明
1.const int r=100;//标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,编译器经过类型检查后直接用100在编译时替换。
2.extend const int r=100;//将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义。
3.const int r[]={1,2,3,4};
struct S{int a,b;};
const S s[]={(1,2),(3.4)};//以上两种都是常量集合,编译器会为其分配内存,所以不能在编译期间使用其中的值,例如:int temp[r[2]];这样的编译器会报告不能找到常量表达式
二、对于指针
1.const int*r=&x;//声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何地址的常量。
2.int const*r=&x;//与用法1完全等价,没有任何区别。
3.int*const r=&x;//声明r为一个常量指针,他指向x,r这个指针的指向不能被修改,但他指向的地址的内容可以修改。
4.const int*const r=&x;//综合1、3用法,r是一个指向常量的常量型指针。
三、对于类型检查
可以把一个非const对象赋给一个指向const的指针,因为有时候我们不想从这个指针来修改其对象的值;但是不可以把一个const对象赋值给一个非const指针,因为这样可能会通过这个指针改变指向对象的值,但也存在使这种操作通过的合法化写法,使用类型强制转换可以通过指针改变const对象:
const int r=100;
int*ptr=const_cast(&r);//C++标准,C语言使用:int*ptr=(int*)&r;
四、对于字符数组
如char*name=“china”;这样的语句,在编译时是能够通过的,但是”china”是常量字符数组,任何想修改他的操作也能通过编译但会引起运行时错误,如果我们想修改字符数组的话就要使用char name[] =“china”;这种形式。
五、对于函数
1.void Fuction1(const int r);//此处为参数传递const值,意义是变量初值不能被函数改变
2.const int Fuction1(int);//此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。
但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用),对于用户自定义类型,返回值是常量是非常重要
的,见下面条款3。
3.Class CX;//内部有构造函数,声明如CX(int r=0)
CX Fuction1(){return CX();}
const CX Fuction2(){return CX();}
如有上面的自定义类CX,和函数Fuction1()和Fuction2(),我们进行如下操作时:
Fuction1()=CX(1);//没有问题,可以作为左值调用
Fuction2()=CX(1);//编译错误,const返回值禁止作为左值调用。
因为左值把返回值作为变量会修改其返回值,const声明禁止这种修改。
4.函数中指针的const传递和返回:
int F1(const char*pstr);//作为传递的时候使用const修饰可以保证不会通过这个指针来修改传递参数的初值,这里在函数内部任何修改*pstr的企图都会引起编译错误。
const char*F2();//意义是函数返回的指针指向的对象是一个const对象,它必须赋给一个同样是指向const对象的指针。
const char*const F3();//比上面多了一个const,这个const的意义只是在他被用作左值时有效,它表明了这个指针除了指向const对象外,它本身也不能被修改,所以就不能当作左值来处理。
5.函数中引用的const传递:
void F1(const X&px);//这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本,然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效。
**另外只有引用的const传递可以传递一个临时对象,因为临时对象都是const属性,且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙。
六、对于类
1.首先,对于const的成员变量,只能在构造函数里使用初始化成员列表来初始化,试图在构造函数体内进行初始化const成员变量会引起编译错误。
初始化成员列表形如:
2.X::X(int ir):r(ir){}//假设r是类X的const成员变量
2.const成员函数。
提到这个概念首先要谈到const对象,正象内置类型能够定义const对象一样(const int r=10;),用户自定义类型也可以定义const对象(const X px(10);),编译器要保证这个对象在其生命周期内不能够被改变。
如果你定义了这样的一个const对象,那么对于这个对象的一切非const成员函数的调用,编译器为了保证对象的const特性,都会禁止并在编译期间报错。
所以如果你想让你的成员函数能够在const对象上进行操作的话,就要把这个函数声明为const成员函数。
假如f()是类中的成员函数的话,它的声明形如:
int f()const;//const放在函数的最后,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法
注意:类的构造和析构函数都不能是const函数。
3.建立了一个const成员函数,但仍然想用这个函数改变对象内部的数据。
这样的一个要求也会经常遇到,尤其是在一个苛刻的面试考官那里。
首先我们要弄清楚考官的要求,因为有两种方法可以实现,如果这位考官要求不改变原来类的任何东西,只让你从当前这个const成员函数入手,那么你只有使用前面提到的类型强制转换方法。
实例如下:
//假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函数f()来对这个r 进行++r操作,代码如下
void X::f()const
{(const_cast(this))->++r;}//通过this指针进行类型强制转换实现
另外一种方法就是使用关键字:mutable。
如果你的成员变量在定义时是这个样子的:
mutable int r;
那么它就告诉编译器这个成员变量可以通过const成员函数改变。
编译器就不会再理会对他的检查了。