c++中为什么会引入const

C++11 constexpr和const的区别详解 我们知道,constexpr 是 C++ 11 标准新添加的关键字,在此之前(C++ 98/03标准)只有 const 关键字,其在实际使用中经常会表现出两种不同的语义。举个例子: #include <iostream> #include <array> using namespace std; void dis_1(const int x) { //错误,x是只读的变量 array <int,x> myarr{1,2,3,4,5}; cou 阅读详情

c++的提出者当初是基于什么样的目的引入(或者说保留)const关键字呢?,这是一个有趣又有益的话题,对理解const很有帮助。

1. 大家知道,c++有一个类型严格的编译系统,这使得c++程序的错误在编译阶段即

可发现许多,从而使得出错率大为减少,因此,也成为了c++与c相比,有着突出优点

的一个方面。

2. c中很常见的预处理指令 #define variablename variablevalue 可以很方便地进行值替

代,这种值替代至少在三个方面优点突出:

一是避免了意义模糊的数字出现,使得程序语义流畅清晰,如下例:
#define user_num_max 107 这样就避免了直接使用107带来的困惑。

二是可以很方便地进行参数的调整与修改,如上例,当人数由107变为201时,进

改动此处即可,

三是提高了程序的执行效率,由于使用了预编译器进行值替代,并不需要为这些

常量分配存储空间,所以执行的效率较高。

鉴于以上的优点,这种预定义指令的使用在程序中随处可见。

3. 说到这里,大家可能会迷惑上述的1点、2点与const有什么关系呢?,好,请接着向下

看来:

预处理语句虽然有以上的许多优点,但它有个比较致命的缺点,即,预处理语句

仅仅只是简单值替代,缺乏类型的检测机制。这样预处理语句就不能享受c++严格类

型检查的好处,从而可能成为引发一系列错误的隐患。

4.好了,第一阶段结论出来了:
结论: const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承

它的优点。

现在它的形式变成了:

const datatype variablename = variablevalue ;
为什么const能很好地取代预定义语句?
const 到底有什么大神通,使它可以振臂一挥取代预定义语句呢?

1. 首先,以const 修饰的常量值,具有不可变性,这是它能取代预定义语句的基础。

2. 第二,很明显,它也同样可以避免意义模糊的数字出现,同样可以很方便地进行

参数的调整和修改。

3. 第三,c++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符

号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的

效率也很高,同时,这也是它取代预定义语句的重要基础。

这里,我要提一下,为什么说这一点是也是它能取代预定义语句的基础,这是因为,

编译器不会去读存储的内容,如果编译器为const分配了存储空间,它就不能够成为一

个编译期间的常量了。

4. 最后,const定义也像一个普通的变量定义一样,它会由编译器对它进行类型的检

测,消除了预定义语句的隐患。

const 使用情况分类详析

1.const 用于指针的两种情况分析:
int const *a; file://a/可变,*a不可变
int *const a; file://a/不可变,*a可变

分析:const 是一个左结合的类型修饰符,它与其左侧的类型修饰符和为一个类型

修饰符,所以,int const 限定 *a,不限定a。int *const 限定a,不限定*a。

2.const 限定函数的传递值参数:

void fun(const int var);

分析:上述写法限定参数在函数体中不可被改变。由值传递的特点可知,var在函

数体中的改变不会影响到函数外部。所以,此限定与函数的使用者无关,仅与函数的

编写者有关。
结论:最好在函数的内部进行限定,对外部调用者屏蔽,以免引起困惑。如可改写如

下:

void fun(int var){
const int & varalias = var;

varalias ....

.....

}

3.const 限定函数的值型返回值:

const int fun1();

const myclass fun2();

分析:上述写法限定函数的返回值不可被更新,当函数返回内部的类型时(如fun1)

,已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免

困惑。当函数返回自定义的类型时(如fun2),这个类型仍然包含可以被赋值的变量

成员,所以,此时有意义。

4. 传递与返回地址: 此种情况最为常见,由地址变量的特点可知,适当使用const,意

义昭然。

5. const 限定类的成员函数:

class classname {

public:

int fun() const;

.....

}

注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声

明中和定义中均要使用const,因为const已经成为类型信息的一部分。

获得能力:可以操作常量对象。

失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。


 

const描述符可修饰全局函数吗?为什么C#有const和readonly两种常量关键字?C++成员函数为什么可以由const和非const版本?const常量的不同形式? C++可以用const修饰成员函数,表示成员函数不会修改任何类成员,这是安全的编码习惯。注意,这仅仅适用于类的成员函数,如果是形如C语言的全局函数,是不可以用const修饰。但,const可以修饰函数参数。 阅读详情

相关推荐

条款13:优先选用const_iterator,而非iterator

摘要:优先选用const_iterator的实践指南 在STL中,const_iterator(指向不可修改元素的迭代器)比普通iterator更安全、更清晰地表达“只读”意图。C++98中由于支持不足(创建困难、使用受限),其优势难以发挥;但C++11通过cbegin()/cend()等成员函数和非成员函数std::begin()显著改善了可用性。 核心建议: 默认使用const_iterator:除非需要修改元素,否则优先选择它以避免意外修改,增强代码安全性。 C++11/14优化:利用非成员函数(如s

大胡子的博客 2256

<C++>快速掌握set 容器|去重的底层原因|使用仿函数定义排序规则

set 容器的底层实现是二叉树,在插入元素的时候会自动进行升序的排序操作,set 容器有去重的功能,而 multiset容器允许插入相同元素… set容器在STL编程里常常用到,那么我就总结一下它的用法,抓住源码分析去重、排序的原理

叶落秋白的博客 3262

C++中为什么char**不能转换成const char**? 探索C语言和C++中const的美丽故事

本文从一个大家很可能遇到的C++bug中引出对C/C++历史的探索, 并通过实验等方式结合资料分析了这个bug的根源问题, 最后给出了多种优秀的解决方案。

weixin_43558951的博客 2343

【基本容器的使用】

容器

江边小客的博客 269

C++中const的理解

详细介绍C++语言的const关键字的各种用法。

weixin_42026107的博客 4964

void f(const int n)和void f(int n)为什么是重定义?C++成员函数为什么可以有const和非const版本?为什么C#有const和readonly两种常量关键字?

函数参数用const修饰,const不影响函数签名,所以这样的函数定义是重定义。编译器看到参数有const,只是为了确保代码不会意外传入非const参数,而并不是生成了一个带const区分符的不同函数。它与类const成员函数不同,这是用于区分const对象和非const对象。

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 844

C++STL为什么要有const_iterator

这是个困扰我很久了的问题,可能一开始对面向对象的理解不够深。 刚刚想明白了,随手记录一下。 先从const iterator和const_iterator说起 const iterator 是iterator本身是个常量,iterator本身里面存的是指针,也就是iterator的值,也就是那个指针不能改变,也就是不能指向其他的位置,但是所指向的位置的元素是可以通过这个iter...

weixin_30687587的博客 603

自动驾驶开发者必看:nuscenes数据集23类物体标注全解析(附避坑指南)

本文深入解析nuscenes数据集的23类物体标注系统,为自动驾驶开发者提供全面的标注规范解读和实战避坑指南。涵盖多模态数据组织、类别细分规则、属性系统应用技巧以及标注质量验证方法,帮助开发者高效利用这一标杆数据集提升模型性能。

weixin_29041767的博客 256

我的C++primer长征之路:关联容器

关联容器 概述 关联容器支持普通容器的操作,不支持顺序容器中位置相关的操作,如push_back等,也不支持构造函数或插入操作的接收一个元素值和数量值得操作,如vectorv(10,0)。 普通容器的操作 类型别名 iterator 此容器类型的迭代器 const_iterator 可以读取元素,但不能修改元素的迭代器类型 size_type 无符号整数类型,足够保...

weixin_40313940的博客 267

【实用教程】使用AlphaFold2进行蛋白质结构在线预测

使用Colab进行简单快速的AlphaFold2在线的蛋白质三维结构预测

Eumenidus的博客 14万+

以GD32F103C8T6为例的核心板原理图PCB绘制学习笔记简单总结

重点在supplier part是立创商城的编号,可以搜到。

2301_80397661的博客 3262

STL_multiset容器

与set的不同: 可以存储多个值相同的元素。 成员方法: 成员方法 功能 begin() 返回指向容器中第一个(注意,是已排好序的第一个)元素的双向迭代器。如果 multiset 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 end() 返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 multiset 容器用 const 限定,则该方法返回的是 const 类型的

weixin_42542290的博客 397

基于Halium 9为小米平板4移植Ubuntu Touch:内核适配与驱动调试实战

在移动设备生态中,Linux内核作为核心,通过硬件抽象层(HAL)管理底层硬件驱动,为上层系统提供统一接口。其模块化设计允许深度定制,是实现跨平台移植的技术基础。Halium项目正是利用这一原理,构建了一个中间层,将安卓内核的硬件支持能力“翻译”成标准Linux发行版能识别的格式,从而在手机、平板等移动设备上运行Ubuntu Touch、postmarketOS等移动Linux系统,极大地拓展了老旧设备的再利用价值。这一技术为开发者提供了在常见安卓硬件上进行Linux系统开发与定制的可能,尤其在嵌入式与物联

weixin_42639246的博客 372

【C++面试100问】第八十五问:有了const,C++11为什么还要引入constexpr

B站讲解视频

lxiao428的博客 737

使用moveit!控制真实机械臂(5)——编写真实机械臂节点中的action服务程序

上一篇文章中,我们简要介绍了ROS中action的基本知识,为了控制真实机械臂,我们已经修改了moveit配置文件,使得moveti启动后具备一个control_msgs::FollowJointTrajectoryAction类型的action客户端,接下来,我们完成该类型action的另一半,编写C++程序来实现action的服务端。由于底层机器人控制程序一般差别都很大,这里展示的只是编程要点...

爱学习的草莓熊 1万+

Android自动化新方案:ESP32-C3蓝牙HID模拟触控与手势操作实战(附源码)

本文详细介绍了使用ESP32-C3通过蓝牙HID协议实现Android设备自动化操作的完整方案。该硬件方案成本低廉且能完美规避系统风控,可模拟鼠标移动、点击及复杂手势操作,延迟低于50毫秒,适用于游戏连招和应用测试等场景。文章包含完整的源码实现和性能优化技巧。

kotlin6android的博客 377

C++已经有了const,为什么还要增加一个新关键字constexpr?

const和constexpr一、可执行程序的出生过程一、const和constexpr二、必须使用constexpr的场景三、const和constexpr区别与联系 一、可执行程序的出生过程 一个源程序到一个可执行程序的过程必须经过预编译、编译、汇编、链接,最后打包成可执行的程序。 预编译会处理各种条件编译指令,如#if、#endif等,对#define等进行宏展开,保留一些必要编译指令如#pragma,删除一些不必要的注释等等,预编译是为了后面的编译做准备。 编译会把预编译生成的.i/.ii文件进行语

ISmileLi的博客 928

飞牛fnNAS虚拟机标准安装

飞牛NAS是一款基于Debian开发的国产免费NAS系统,支持x86架构设备,可将闲置硬件改造为NAS服务器。系统安装简便,支持多种存储模式与硬盘休眠功能,具备智能影视管理、照片备份等实用功能,并提供多种远程访问方式。飞牛NAS还支持Docker扩展,目前已承诺永久免费。文章详细介绍了在VMware虚拟机中安装飞牛NAS的步骤,包括下载镜像、创建虚拟机、初始化设置等过程,并展示了创建共享文件夹等基本操作,帮助用户快速上手这款功能强大的免费NAS系统。

dgnankai的专栏 3260

【CPP】const放在不同位置的作用

const & constexpr

记忆超差的本人的博客 1865

【OpenClaw从入门到精通】第12篇:OpenClaw 2026子代理实战全攻略:用ACP架构搭建多智能体协作网络(附完整代码)

本文聚焦OpenClaw 2026.3.2版本默认启用的ACP(Agent Communication Protocol)子代理机制,从核心概念、底层原理到企业级实操全流程拆解。先解析子代理的定义、ACP协议通信原理及主从代理分工逻辑,再提供环境准备的详细步骤(版本验证、配置调整、技能安装);随后通过三个递进式虚拟案例(客服分流、智能文档处理、企业级招聘全流程),提供可直接运行的完整代码、执行结果及技术要点解析;最后补充子代理管理运维、性能优化与避坑指南。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2382

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++中const变量的修改与赋值

title: C++中const变量的修改与赋值 date: 2021-02-25 20:26:16 description: C++中const变量的修改与赋值  出于避免对数据的无意修改的需求,C及C++语言引入了const关键字。与C语言中的const相比,C++中的const具有更丰富的用法。C++中的const除了可用于修饰变量,指针,函数及函数参数,还可用于修饰类对象,类成员,类成员函数等。由于其丰富的用途,往往容易对其产生误解,尤其是与指针用法结合在一起时。下面以一些实例来说明这个问题。 .

qq_38877888的博客 2万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

const用法详解

const (1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值. 加粗样式 详细内容: 1、什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新:) 2、为什么引入const? const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。 3、cons有什么主要的...

zhwlc的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++中的const_c++ const变量

C++ 中的 const 变量虽然也会占用内存,也能使用获取得它的地址,但是在使用时却更像编译时期的#define;#define也是值替换,可见范围也仅限于当前文件。很多C++教程在对比 const 和 #define 的优缺点时提到,#define 定义的常量仅仅是字符串的替换,不会进行类型检查,而 const 定义的常量是有类型的,编译器会进行类型检查,相对来说比 #define 更安全,所以鼓励大家使用 const 代替 #define。

2401_84240431的博客 968

C++中我如何合理使用const和constexpr?

constexpr所限定的变量必须是编译阶段完成的变量,当我们用非编译阶段完成的变量给constexpr限定的指针赋值时,便会发成错误。的 “条款3:尽可能使用const” 就指出const在指针运用中约束的不同——如果关键字const出现在星号左边,表示被指物是常量;使用constexpr限定的函数实际上是将函数在编译过程中转换为常量表达式,在其中加入复杂语句,可能会导致常量表达式转换失败。除非有非得使用const的情况发生,否则可使用const的地方,一律可改为使用constexpr。

2401_82410644的博客 1111

C++ const 深度解析:从常量定义到编译器优化,彻底理解 const 的全部用法

fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;const在左侧const在右侧const同时在两侧遇到 const 和指针声明从右往左读类型const 出现在哪?底层 const指向的内容不可修改指针本身可以指向别处顶层 const指针本身不可修改指向的内容可以修改两层 const指针本身不可修改。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1387

c++ const 关键字

C++中的const关键字用于定义常量,确保数据不可变性和代码安全性。主要用法包括:定义常量变量替代宏常量、修饰指针(指向常量/常量指针)、函数参数保护、类const成员函数等。const提供类型安全、明确设计意图,constexpr则用于编译期常量。最佳实践建议默认使用const,避免修改不必要的数据,但需谨慎使用const_cast强制转换。合理使用const能提高代码可读性、安全性和性能。

如梦人身 913
上一篇: Giving a .NET Assembly a Strong Name
下一篇: [翻译]C#中的泛型 (From dotNet SDK 2.0 Beta1)
lakeaustin
博客等级 码龄22年 0粉丝 4原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值