-
2019-10-20 21:13:08
在 C++ 中,有两种简单的定义常量的方式:
1 使用 #define 预处理器。
2 使用 const 关键字。#define 和 const 的区别:
角度1: 就定义常量说的话, const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。
角度2: 就起作用的阶段而言,#define 是在编译的预处理阶段起作用,而 const 是在 编译、运行的时候起作用。
角度3: 就起作用的方式而言,#define 只是简单的字符串替换,没有类型检查。而 const 有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 正因为 define 只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:
#define N 2+3 // 我们预想的 N 值是 5,我们这样使用
double a = N/2; // 我们预想的 a 的值是 2.5,可实际上 a 的值是 3.5角度4: 就空间占用而言, 例如:
#define PI 3.14 //预处理后 占用代码段空间
const float PI=3.14; // 本质上还是一个 float,占用数据段空间角度5: 从代码调试的方便程度而言, const 常量可以进行调试的,#define 是不能进行调试的,因为在预编译阶段就已经替换掉了
角度6: 从是否可以再定义的角度而言, const 不足的地方,是与生俱来的,const 不能重定义,而 #define 可以通过 #undef 取消某个符号的定义,再重新定义。
补充:在一个类里建立一个 const 时,不能给他初值;
foo{ public: foo():i(100){} private: const int i=100; // 错误!!! }; //或通过如下方式进行初始化 foo::foo():i(100){}
const 修饰的成员函数中不能修改成员变量,不能调用非 const 修饰的函数
void showData()const{}
更多相关内容 -
EDA/PLD中的在C++中定义常量的两种方法的分析比较
2020-11-07 21:36:52在C++中,要定义一个常量,有两种主要的做法 1. 符号常量 (#define) 2. 常值变量 (const) 符号常量的定义方式,其实与C++本身没有关系,它是一个编译器指令,或者称为预处理指令(有关的预处理指令还有#... -
在C++中定义常量的两种方法的分析比较
2021-01-19 22:36:56在C++中,要定义一个常量,有两种主要的做法 1. 符号常量 (#define) 2. 常值变量 (const) 符号常量的定义方式,其实与C++本身没有关系,它是一个编译器指令,或者称为预处理指令(有关的预处理指令还有#... -
C++中的常量定义小结
2021-01-01 04:45:36一般来说,使用C语言编程时我们都习惯在代码当中使用C当中的宏定义来定义一个数值常量: #define MY_CONST 7 在C++开发项目时,也会经常存在沿袭C当中常量用法情况。所以,如下的一种写法看起来反倒觉得有些不正宗... -
C++中定义常量的几种方式
2022-04-01 14:46:14C++中定义常量的几种方式概述
在程序运行过程中,始终不发生改变的量,称之为常量。在 C++ 语言中常量是个固定值,也就是说常量值在定义后不能进行修改。
#define
①.宏常量
#define 是 C 语言中定义常量的方式,在 C++ 中也可以使用。
②.#define 的使用#define MAX = 200
③.宏常量的特点
define 在预处理阶段起作用;宏常量没有数据类型,只是进行文本替换替换;宏常量在内存中会产生多份相同的备份。
若仅用于定义常量,在 C++ 中不推荐使用。const
①.const 限定符
const 是 C++ 中的变量修饰符,表示该变量是只读的,不可改变的,const 是变量类型的一部分。
②.const 的使用const int max = 20;
③.const 变量的特点
const 在编译、运行阶段起作用;const 常量有数据类型,编译器可以进行类型安全检查;const 常量在程序运行过程中只有一份备份。enum
①.enum 枚举类
enum 是 C++ 中一种派生数据类型,它是由用户定义的若干枚举常量的集合。
②.enum 的使用enum class color{ red,green,blue };
③.enum 类型的特点
enum 在编译时被全部求值;enum 常量隐含数据类型是整数,其最大值有限,且不能表示浮点类型 ;枚举常量不会占用对象的存储空间。constexpr
①.constexpr 常量表达式
C++ 中使用 constexpr 表示常量表达式,是指值不会改变并且在编译过程就能得到计算结果的表达式,constexpr 是声明的一部分,而不是变量类型的一部分。
②.constexpr 的使用constexpr int max = 35;
③.constexpr 的特点
constexpr 的变量的值必须是编译器在编译的时候就可以确定的。
-
详解C++中常量的类型与定义
2020-09-02 09:52:14主要介绍了详解C++中常量的类型与定义,使用#define与const来定义常量是C++入门学习中的基础知识,需要的朋友可以参考下 -
C++在类内声明并定义静态成员常量数组(static constexpr const int member[])
2021-09-11 23:57:59对于C++23标准,如果我们想要某个类的成员变量能被此类的所有对象访问,且该变量不可修改,那么我们一般会选择将该变量声明为静态成员常量。例如此代码: class Decrypter{ static const int mask = 0x8a; public...对于C++23标准,如果我们想要某个类的成员变量能被此类的所有对象访问,且该变量不可修改,那么我们一般会选择将该变量声明为静态常量。例如此代码:
class Decrypter{ static const int mask = 0x8a; public: void decrypt(){ ... } };
其中,我们把Decrypter::mask声明为了一个静态常量。对于Decrypter类的所有对象而言,都能访问到同一个mask,节约了内存空间。
然而,如果我们把mask改为一个mask数组,如下列代码所示:
class Decrypter{ static const int mask[] = {0x8a, 0x2b, 0x3c}; public: void decrypt(){ ... } };
此时编译器就会报错:
error: in-class initialization of static data member 'const int Decrypter::mask []' of incomplete type
翻译过来就是:“错误:不完整类型的静态成员'const int Decrypter::mask []'的类内初始化”。
这句话连谓语都没有,简直晦涩难懂。
猜测其大致意思为:mask数组在初始化时遇到了错误,原因是其类型不完整。
解决办法有两种:
第一种方法是将定义搬到类外面去:
class Decrypter{ static const int mask[]; public: void decrypt(){ ... } }; const int Decrypter::mask[] = {0x8a, 0x2b, 0x3c};
个人并不是很喜欢这种做法,因为破坏了直观性。万一这个静态常量下面的代码非常多,为了看他这一个静态常量的定义内容,我们还得用鼠标滚下去,再滚上来,很破坏阅读程序时的思维连贯性。也可能是博主最近学习了Python,不太喜欢这种形式。
所以为了依然在类内定义此静态常量,一般会采用第二种方法。
第二种方法是在前面加一个“constexpr”:
class Decrypter{ constexpr static const int mask[] = {0x8a, 0x2b, 0x3c}; public: void decrypt(){ ... } };
这样编译器就不会报错了,程序完美运行,同时也达到了在类内直接定义此静态常量的目的。
第一次看到这个关键字就很萌,这尼玛什么神仙关键字啊
然后一查资料:“常量表达式(constexpr)在编译期就可以计算出结果。”
然而这里的constexpr显然不是在编译期计算出来的,比如我写这串代码,也能正常运行:
#include <iostream> using namespace std; class Decripter{ constexpr static const int mask[] = {10, 20, 30}; int x; public: Decripter(): x(0){} int next(){ return mask[x++]; } }; int main() { Decripter dd; cout << dd.next() << endl; //10 cout << dd.next() << endl; //20 cout << dd.next() << endl; //30 return 0; }
由于x是一直在变化的,所以显然不可能在编译期间得出
我反正是很懵的。。。
-
C++ 定义常量的两种方式
2021-09-09 01:06:11C++定义常量的方式有两种: 1、#define 宏常量 通常在文件上方定义 2、const 修饰的变量 通常在变量定义前加关键字 const #include <iostream> using namespace std; //1、宏常量 #define Day 7 ...常量的作用:
用于记录程序中不可更改的数据
C++定义常量的方式有两种:
1、#define 宏常量
通常在文件上方定义
2、const 修饰的变量
通常在变量定义前加关键字 const
#include <iostream> using namespace std; //1、宏常量 #define Day 7 int main() { //Day = 8; //错误,Day是常量,一旦修改就会报错 cout << "day =" << Day << endl; //2、const修饰的变量 const int month = 12; //month = 24; //错误,const修饰的变量也称为常量 cout << "month=" << month << endl; return 0; }
-
类里面怎么定义const常量 C++
2020-07-07 16:15:071、 类里面怎么定义const常量 C++ ...假如定义一个非整型的常量该如何?enum无法完成此项操作,同时丧失了枚举本来的作用。 方法三:(正确,最好) 使用静态常量; class Test { static .. -
C++中常量定义的两种方法
2020-08-18 23:41:00尽量使用const定义,#define在编译出错的时候很难排错,是宏替换的方式,只是把标识符用定义好的常量信息或数值替换过去;而const容易排错,出错时可以通过编译工具审查,可以作为语法错误检测出来。 ... -
c++类中如何定义常量
2013-09-17 16:56:11如何在c++中定义常量: 不能在类中初始化const数据成员,因为在类没有被初始化的时候,成员是不存在的。const成员只在某个对象的生存周期中存在的,不同的对象中const成员变量的值不一样。 class Const { ... -
C++类中的常量
2019-01-03 10:12:00C++类中的常量 常量是一种标识符,它的值在运行期间恒定不变。C语言用 #define来定义常量(称为宏常量)。C++ 语言除了 #define外还可以用const来定义常量(称为const常量)。 1 为什么需要常量 如果不使用常量... -
C++类中常量定义
2017-03-04 12:56:05有时我们希望某些常量只在类中有效。由于#define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是我们所期望的。const数据成员只在... -
c++ 中定义常量的两种方法
2018-08-03 11:07:33c++中定义常量有两种方法: 1.使用#define预处理器 #define SCREEN_HEIGHT 640 2.使用const关键字 const int SCREEN_WIDTH 960; 所谓常量,即在程序执行期间不会改变的变量,常量可以是任意类型的变量,只不过... -
C++类内静态常量定义和声明及enum hack
2017-07-22 16:33:31此篇文章介绍类内静态常量定义和声明的用法,在编程时经常遇到需要定义一个常量,而且如果要确保其的有效性在某个范围内,则需要将其定义在一个class内。而其用法常会遇到一些问题,下面简要说明其中会遇到的一个... -
C++ 类内常量定义 static const
2020-04-05 18:06:48在C++类内定义常量常用方式static const ,enum, 或const等形式。 static const : 在头文件中CTest类内声明如下: static const int SIZE = 10; // 类内声明,同时初始化,仅适用于整型变量,ints/chars/bools... -
C++类中定义常量
2013-05-08 09:39:55C++类中定义常量 2009-02-13 17:26:43| 分类: C/VC/C++ |字号 订阅 在C++类中定义常量,有以下两种方法: 1.在类定义体内定义枚举常量; 例如: class A { public: enum { ... -
C++ 定义常量pi
2021-03-27 08:49:17const double pi = acos(-1); -
C++ 如何正确高效地定义字符串常量
2020-04-10 16:23:35阅读gtest.cc 代码发现 字符串常量都定义成数组的形式,为什么不定义成指针呢? // A test filter that matches everything. static const char kUniversalFilter[] = "*"; // The default output file for XML ... -
C++ 类中定义常量的方法
2012-12-18 11:00:271.在类定义体内定义枚举常量; 例如: class A { public: enum { THREAD_NUM = 100, MEM_BLOCK_SIZE = 1024, PORT = 8080 }; }; 这样定义出来的常量值在程序运行过程中是不能被修改的,编译的时候就已经... -
C++ 定义常量const
2019-02-26 20:59:22//只能在定义该常量的函数里使用(如在main函数中定义,则在area函数就不能用),如果定义在这个位置则在整个程序的任何位置都可以用 double area(double r) { return PI*r*r; } int main() { ... -
【C++】定义数组大小用常量
2021-02-04 17:23:00新建一个需要从键盘输入大小的数组时,程序报错 int n; cin>>n; int a[n]; 采用动态内存分配的方法,修改为: int n; cin>>n; int *a = new int[n]; . . . delete[] a; 参考:... -
c++11 编译期常量定义
2020-05-08 10:34:37在c++11之前,在类中定义编译期常量的方法: template<typename Type> struct Size { static const int x = 1; }; template<typename Type> struct Size { enum{ x = 1, y = 2 }; }; 在c++11中定义... -
C++_类的常量成员
2019-05-29 16:20:33一、关于C++的四个强转 格式:类型(变量、表达式、值) (C语言的强转方式C++适用,但是C++的强转C语言不适用) 1.static_cast 格式:static_cast<类型1>(值); 说明: 值将会转换成类型1... -
【C++】定义全局常量的一个优雅的方案
2016-03-21 10:42:06namespace!借助命名空间的变量可以在全局范围访问的特性。 -
c++中静态字符串常量定义方法
2017-12-01 13:14:32写过c#或则java的知道可以在类中定义静态或自读的字符串常量,但是在c++里面实现方法不一样,在c++的头文件里面直接:static const std::string CONST="str"; 这样是无法编译通过的,c++只允许像int类型的静态变量... -
C++里是怎么定义常量的?常量存放在内存的哪个位置?
2019-10-01 10:07:17对于局部常量,存放在栈区; 对于全局常量,编译期一般不分配内存,放在符号表中以提高访问效率; 字面值常量,比如字符串,放在常量区。 转载于:https://www.cnblogs.com/pacino12134/p/11255408.html... -
C++字符串变量、字符串常量、string变量在内存中的存储分析
2021-05-19 12:26:13C++中内存布局,内存地址:栈区>堆区>静态存储区 一、字符串常量和字符串变量 我们知道字符串常量是存储在文字常量区,也即C++中的静态存储区。 而字符串变量一般定义在栈...//字符串变量ss中第一个字符h的存