c++常量定义支持两种语法。 #define 常量名称 常量值const 常量类型 常量名称 = 常量值例如我们分别用两种语法表示linux和windows的换行符#include <iostream>#define WIN_EOL (){ std::cout << "Hi Windows" << WIN_EOL; std::cout << "Hi Linux" << LIN_EOL; return 0;}注意:常量定义为大写字母形式是一种编程代码规范
吐槽一下: 指针常量与常量指针的翻译就好比机器学习中Regularization翻译成正则化一样,讲真,正则化这个说法确实要比规则化显得高端些,但是到了理解的时候,还是要按照规则化理解。 指针常量与常量指针这个概念是一样的,英文里没有pointer const这个词,只有pointer to const和const pointer这两个词。 ,在这里标个号: 1,2暂时称为第一类,3暂时称为第二类,那么第一类和第二类到底哪个叫做指针常量,那个叫做常量指针呢? 说实话我都不知道指针常量与常量指针的叫法是不是够官方,我只能说概念非常混淆,而且其实它的两个名字并不重要,关键的是声明方式与作用的区别。 百度百科认为第一类应该叫做常量指针,第二类叫做指针常量 ? ?
常量表达式主要是允许一些计算发生在编译时,即发生在代码编译阶段而不是代码运行阶段。这是很大的优化,因为如果有些事情可以在编译时做,那么它只会做一次,而不是每次程序运行时都计算。 只能是一个常量表达式 //函数中只能有一条return语句,在linux下编译失败,在vs2017上编译通过 constexpr int getconst() { constexpr int i = 函数体必须为空 初始化列表只能由常量表达式来赋值 struct Date { constexpr Date(int y, int m, int d): year(y), month(m), day return day; } private: int year; int month; int day; }; int main() { constexpr Date PRCfound { 1949, 10 << endl; // 10 return 0; } 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
常量 就是那些值不能被改变的变量。定义后,再也没有任何方法可以改变常量的值。const:不可改变的值(通常使用这种)。 常量定义const 常量名称:数据类型=值;使用 const 关键字定义常量。定义常量时必须指定数据类型。常量名称的命名规则和之前变量的命名规则一样,但常量名称一般都是 大写字母。 ("{}",PI);//输出 3.1415926}常量 可以在任意作用域里定义,包括全局作用域。也就是可以在任何地方定义。常量 只是一个符号,会在 编译时 替换为具体的值。 ("{}",price);//输出 299同名常量Rust 中,常量不能被隐藏,也不能被重复定义。
rci = 90;//错误 不能修改 允许常量引用绑定到非常量的对象、字面值或表达式上 int i = 20; const int &ri(20); const int &ri3(i + ri); 常量引用仅对引用可参与的操作作出了限定 ,对于引用的对象本身未做限定 int i(10); const int &c(i); i = 90;//i不是常量,可以改变值 c = 20;//错误,c是一个常量引用,const限定了c为常量不能修改 cout << c << endl;//值为90 //指针和const int iv(10); int iv1(23); const int * pci1(&iv);//指向常量的指针,限定了该指针的操作 字面值和constexpr 常量表达式:字面值是常量表达式,用常量表达式初始化的const对象也是常量表达式 const int ci = 20;//ci是常量表达式 const int cii = ci + 90;//cii是常量表达式 int iv = 30;//iv不是常量表达式 声明为constexpr的变量一定是常量,而且必须用常量表达式初始化 constexpr int cif = 23;
参考链接: C++变量, 字面量和常量 日期:2020年3月27日 作者:Commas 注释:开始我的C++学习的奇妙之旅,愿意和我一起学习的小伙伴们可以关注我,也可以给我点赞,如若博客有哪里写的不好的地方 ,还望各位看官指出,非常感谢…… 更多C++内容,请看我的《C++学习的奇妙之旅》 文章目录 一、前言二、基本数据类型三、常量(一)常量的类型(1)整数常量(2)浮点常量(3)布尔常量(4)字符与字符串常量 类型读写说明常量仅只读,在定义并初始化后,不可修改原值变量可读写,在程序运行中,可以修改变量值 二、基本数据类型 在C++中,数据类型决定了变量存储的大小和布局,基本数据类型可分为以下4类: 整数类型 ):浮点数类型;布尔类型(bool):存储true\false;字符类型(char):实际上存储的是整数,可以容纳单字符的编码(ASCII码); 不知道有没有注意到,和其他高级程序语言有点不太一样,C+ 在标准C++类库中有一个String类,这个是值得推荐的,很C++字符串风格。
一、const变量的一些基本特点 ①const修饰的变量不能被修改 const int a=10;a=20;//错误 ②因为const修饰的变量不能被修改,所以必须被初始化 int a=10;const int b=a; //正确const int c=10; //正确 ③const修饰的变量可以赋值给其他值 const int a=10;int b=a;//正确 ④可以有常量引用 int a=10 : const出现在“*”号的左边,代表所指之物是常量 const出现在“*”号的右边,代表指针自身是个常量 初始化与使用 常量指针,因为所指对象是个常量,所以有下面的规则 可以常量指针指向于常量或非常量 pa = 1; //不能通过常量指针修改所指对象的值 指针常量,因为指针是个常量,而不是类型是常量,因此有下面的规则: 只能指向于非常量,不能指向于常量(因为放置指针常量修改常量的值 pb = &b; //错误,b是常量 *pa = 10; //正确,可以修改指向对象的值pa = &c; //错误,不能修改pa的指向(因为指针自身是个常量) 常量指针常量,有如下规则: 可以使用常量
大家好,又见面了,我是全栈君 常量折叠概念 常量折叠表面上的效果和宏替换是一样的,只是“效果上是一样的”,而两者真正的区别在于,宏是字符常量,在预编译宏替换完成后,该宏名字会消失,所有对宏的引用已经全部被替换为它所对应的值 ,编译器当然没有必要维护这个符号,而常量折叠发生的情况是,对常量的引用情况全部替换为该常量的值,但是,常量名并不会消失,编译器会把它放入到符号表中,同时会为该变量分配空间,栈空间或全局空间。 const在C和C++中的区别 const int buffsize = 10; char buff[buffsize]; 上面的代码在C++中可以,但在C中不行,因为buffsize占用存储的某个地方 ,所以C编译器不指定它在编译时的值 const int buffsize; 上面的代码在C中可以,因为在C中默认const为外部链接,C++默认const为内部链接,所以再C++中要写成extern 在一个类里使用const的意思是“在这个对象寿命周期内,这是一个常量”。然而,对这个常量来讲,每个不同的对象可以含一个不同的值。
在 C++ 语言中 , 常量引用 是 引用类型 的一种 ; 借助 常量引用 , 可以将一个变量引用 作为实参 传递给一个函数形参 , 同时保证该值不会在函数内部被修改 ; 这样既保证了参数传递效率 , ; 2、常引用语法示例 常量引用示例 : 下面的代码 , 就是上述 使用 普通变量 初始化 常量引用 : // 定义变量 a int a = 10; // 定义变量 a 的 常量引用 b const ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 正确代码示例 : // 包含 C++ 头文件 #include "iostream" // num 值 , 就会在编译时报错 //num = 0; } int main() { // 定义普通变量 a int a = 10; // 向函数中传入 变量 a 作为常量引用参数 / a 地址传入 fun(a); // 控制台暂停 , 按任意键继续向后执行 system("pause"); return 0; } 执行结果 : fun 函数接收到参数 num = 10
一、普通引用 1、概念说明 之前的 【C++】C++ 引用详解 ① ~ ⑦ 博客中 , 讲解的都是 普通引用 , 也就是 将 普通变量 赋值给 引用 , 过程如下 : 先定义 普通变量 a , 然后定义 已存在变量 a 的引用 b ; 这里的 引用 b 就是 普通引用 ; // 定义变量 a int a = 10; // 定义变量 a 的引用 b int& b = a; 2、代码示例 - 普通引用 : error C3892: “b”: 不能给常量赋值 2、常量引用概念与语法 在 C++ 语言中 , " 常量引用 " , 英文名称为 Const Reference , 是一种引用类型 , 另外一种引用就是 常量引用 b 修改 变量 a 的值 , 则会报错 : error C3892: “b”: 不能给常量赋值 错误代码示例 : // 包含 C++ 头文件 #include "iostream" // 常量引用 // 定义变量 a int a = 10; // 定义变量 a 的 常量引用 b const int& b = a; // 打印 常量引用 b 的值 printf("b = %
常量可以是字符、字符串、布尔型、数字型的值。 需要注意的是,常量不可以使用 := 语法定义。 true 数值常量是高精度的 值。 未指定数据类型的常量,由上下文来决定其类型。 fmt" ) const ( Big = 1 <<100 Small = Big >> 99 ) func needInt(x int) int { return x * 10
— 1 — 常量对象 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加 const 关键字。 --- — 2 — 常量成员函数 在类的成员函数后面可以加 const 关键字,则该成员函数成为常量成员函数。 这里有两个需要注意的点: 在常量成员函数中不能修改成员变量的值(静态成员变量除外); 也不能调用同类的 非 常量成员函数(静态成员函数除外)。 const Sample obj; obj.value = 100; // 出错,常量对象不可以被修改 obj.func(); // 出错,常量对象上面不能执行 非 常量成员函数 obj.GetValue; // OK,常量对象上可以执行常量成员函数 return 0; } ---- — 3 — 常量成员函数重载 两个成员函数,名字和参数表都一样,但是一个是
rBAoL1-Q20mAN44lAAO6uDAqdEA653.png const常量机制分析 const为C/C++常用的修饰符,表示该变量是一个常量,不可被修改等含义。 const int var = 10; int* ptr_const = (int*) (&var); ptr_const = 20; 1) 局部const变量,对于C++程序,该变量地址中的值可以被修改 对于C++程序: int main(int argc,char**argv) { const int var = 10; int* ptr_const = (int*) (&var); 3,C和C++中实现机制一样吗? 3.1不同点: 对于局部const变量,C++在变量具体使用地方通过常量替换实现。C语言中表示只读的变量。 3.2 相同点: 都不能对只读数据段的常量进行修改。 特别注意点: 对于头文件定义字符串指针常量的正确定义如下: const char * const constCharPtr="hello const"; 表示指针常量,则可以放在头文件。
1.认识临时变量的常量性 关于临时变量的常量性,先看一段代码。 2.临时变量常量性的原因 为什么临时对象作为引用参数传递时,形参必须是常量引用呢?很多人对此的解释是临时变量是常量,不允许赋值改动,所以作为非常量引用传递时,编译器就会报错。 注意,这里与《C++编程思想》在第八章中的“临时量”小节中认为“编译器使所有的临时量自动设为const”的说法有些不同。 那编译器为何作出如此限制呢? 但如果把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,临时变量所在的表达式执行结束后,临时变量就会被释放,所以,一般说来, 修改一个临时变量是毫无意义的,据此,C++编译器加入了临时变量不能作为非 ---- 参考文献 [1]c++中临时变量不能作为非const的引用参数 [2]C++编程思想[M].刘宗田译.8.3.2.1临时量
** 一:常量 ** 常量指针,指针常量,常量指针常量 a)常量定义:不可修改的值,例如250,’A’ b)const关键字功能:将变量常量化,四种形式 (1)const可以修饰普通变量,一旦修饰该变量 ,该变量就当做常量看待,不可再更改 Const int a=250;//将变量a常量化 A=200;//gcc编译器报错 (2)常量指针:不能通过指针变量来修改指向的内存区域的数据,主要目的是保护数据不可篡改 例如 int a=250; Const int *pa=&a;//定义初始化一个常量指针 或者 int a=250; Int const *pa=&a; //定义初始化一个常量指针 Printf(“a=%d\n”,*pa);//可以查看 int b=300; pa=&b;//pa重新指向b变量,可以修改指针变量本身保存的地址 *pa=400;//gcc编译报错 (3)指针常量 ("a=%d\n",*pa); int b=200; *pa=&b;//不可以,gcc报错 printf("a=%d\n",*pa); (4)常量指针常量:指针本身和指向的内容都不可修改 **
C++中的const关键字可以声明运行时常量,但有的时候需要编译时常量。 例如定义数组需要的是编译时常量。 C++11通过constexp来声明常量,具有编译时常量性。 3; int a[size] = { 0 }; constexpr函数 constexpr int size() { return 3; } int a[size()] = { 0 }; 常量表达式是一个函数 ,该函数具有以下限制: 函数中只能有一条return语句 函数必须有返回值 在使用前必须定义 return返回语句表达式中不能使用非常量表达式的函数、全局数据。 只能是一个常量表达式 一个constexpr函数,只允许包含一行可执行代码,但允许包含typedef、 using 指令、静态断言等。
下面的代码 , 就是上述 使用 普通变量 初始化 常量引用 : // 定义变量 a int a = 10; // 定义变量 a 的 常量引用 b const int& b = a; 2、使用 " 常量 / 字面量 " 初始化 " 常量引用 " 在 博客 【C++】C 语言 和 C++ 语言中 const 关键字分析 ( const 关键字左数右指原则 | C 语言中常量的原理和缺陷 | C " , 引用一个字面量 , 字面量 是 数值 , 这是合法的 ; // 常量引用 引用字面量 , 不会报错 const int& n = 30; 上述用法 , C++ 编译器 会为 常量引用 n 分配一个内存空间 , 这是 const 常量分配内存空间的 三种情况之一 ; 3、C / C++ 常量分配内存的四种情况 C 语言中 const 常量 是 只读变量 , 有独立的存储空间 ; C++ 语言中的 使用 普通变量 初始化 常量引用 // 定义变量 a int a = 10; // 定义变量 a 的 常量引用 b // 使用 普通变量 初始化 常量引用 const int& b = a;
前言 const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改。 const 声明常量 const定义常量与使用let 定义的变量相似: 二者都是块级作用域 都不能和它所在作用域内的其他变量或函数拥有相同的名称 两者还有以下两点区别: const声明的常量必须初始化, 而let声明的变量不用 const 定义常量的值不能通过再赋值修改,也不能再次声明。 块级作用域 const定义常量也有块级作用域 var a = 10; const x = 'world'; if (a > 0){ const x = 'hello'; console.log : const a = ['hello', 'world']; a = ['x', 'y']; // 报错 总结:常量就是值(内存地址)不能变化的量,const定义常用需给初始值。
图片宏常量 define,一般定义在文件头const 在代码中定义常量使用方式不一样。 宏定义 #define 和常量 const 的区别类型和安全检查不同宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查编译器处理不同宏定义是一个 "编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期;const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据存储方式不同宏定义是直接替换,不会分配内存,存储于程序的代码段中 ;const常量需要进行内存分配,存储于程序的数据段中定义域不同void f1 (){ #define N 12 const int n 12;}void f2 (){ cout<<N <<endl; //正确,N已经定义过,不受定义域限制 cout<<n <<endl; //错误,n定义域只在f1函数中}定义后能否取消宏定义可以通过#undef来使之前的宏定义失效const常量定义后将在定义域内永久有效
一·常量表达式和constexpr与const 常量表达式概念:值不会改变并且在编译过程中就能计算出结果的表达式。 int member=10; poi=&member;//错误 指向const对象的const指针 /*const type const 指针(第一个const限定int表示指针指向的单元是常量, 第二个const限定‘指针’表示指针的值也是常量,因此该指针所在的内存值不允许改变它所指向内存的值也不能改变)*/ int demo=10; const int *const pi=&demo;对象及内容都不能改变 a=10;//const引用仅对自己可参与的操作进行了限定对所指向的对象本身是不是常量未作限定。因为指向的对象也可能不是const,所以允许通过其他途径改变它的值。 字符串流stringstream是 C++ 提供的一个字符串流(stream),和iostream、fstream有类似的操作方式 istringstream 从string中读取数据 定义 istringstream