C++基础#3:const用法详细介绍

C++编程基础:const、define、typedef、inline与constexpr的深度解析与实践指南 在C++编程中,常量定义、类型别名和函数内联是构建高效、健壮代码的基础技术。常量定义的核心在于确保数据的不可变性和类型安全,这直接关系到程序的稳定性和内存安全。从原理上讲,C++提供了多种机制来实现这一目标,例如const关键字通过类型系统在编译期进行约束,而#define宏则是在预处理阶段进行文本替换,缺乏类型和作用域保护。这些基础技术的价值在于,它们不仅是语法糖,更是与编译链接模型、作用域规则深度耦合的核心概念,能显著提升代码的可维护性和性能。在实际应用场景中,例如在多线程服务器开发或大型项目构建时,错 阅读详情

本篇描述了const数据成员在类中的定义及其访问规则。

1. const数据成员的初始化:
(1) 在对象层次上,常量几乎没有任何意义,因此const数据成员通常也是静态的,即用static const来修饰而不是const;
(2) 正如static数据成员一样,satic const数据成员也必须在源文件中为其分配空间并进行初始化,也是最后一次对其赋值的机会。 另外,C++规定,如果数据成员是简单类型(如int,char.....),则允许程序员在声明的同时进行赋值;

(3) 如果真的只用const 而不是static的话,那么,必须在构造函数中以初始化列表的形式对这个const数据成员进行初始化。

例:

#include <stdio.h>

class MaxDefine{
      private:
           int x;
      public:
          //const int MaxDefine_10 = 10;  //compiler error: ISO C++ forbids initialization of member `MaxDefine_10'
          const int MaxDefine_100;     
          static const int MaxDefine_1000;
          static const int MaxDefine_10000 = 10000;

      public:
          MaxDefine(int value ): MaxDefine_100(value)  //必须以这样的初始化列表的形式来进行初始化
          {
              //  MaxDefine_100 = value;//不能这样做,这种写法相当于对常量进行赋值,这不允许,除非是声明的同时进行赋值。
          }

};

int const MaxDefine::MaxDefine_1000 = 1000;

void TestMaxDef(void)
{
     MaxDefine m100(100);
     printf(" m100.MaxDefine_100 = %d /n", m100.MaxDefine_100); // OK: m100.MaxDefine_100 = 100

     printf(" m100.MaxDefine_100 = %d /n", MaxDefine.MaxDefine_100); //expected primary-expression before '.' token. 因为MaxDefine_100属于对象而不属于类。


     printf(" MaxDefine::MaxDefine_1000 = %d /n", MaxDefine::MaxDefine_1000);  // OK: MaxDefine::MaxDefine_1000 = 1000
     printf(" MaxDefine::MaxDefine_10000 = %d /n", MaxDefine::MaxDefine_10000);//OK: MaxDefine::MaxDefine_10000 = 10000
}

int main(void)
{
    TestMaxDef();
    while(1);
    return 0;
}

//result:
/*  MaxDefine::MaxDefine_1000 = 1000;
  MaxDefine::MaxDefine_10000 = 10000;
*/

代码说明:

(1) compiler error: ISO C++ forbids initialization of member `MaxDefine_10':

不能对数据成员在初始化时进行赋值操作,即使赋值0也不可以。

 

2. const数据成员与const成员函数:
(1)不能将静态方法声明为const,因为这是多余的。静态方法根本没有相应的类实例,因此它们不可能修改内部值。
(2)非const对象可以调用const和非const方法,但是,const对象只能调用const方法。

 

例:

#include <stdio.h>
class Widget {
      private:
          int h; //height
          int w; //width
          static const int hMax = 320;
          static const int wMax = 240;
      public:
          Widget(int height, int width):
                h(height < hMax ? height: hMax),
                w(width < wMax ? width: wMax)
          {
                //nothing
          }
         
          int get_height() const;
          int get_width() const;
         
          void printSize()
          {
               printf(" printSize: height = %d /n",  h);
               printf(" printSize: height = %d /n",  w);
          }
};

int Widget::get_height() const { return h; }
int Widget::get_width() const { return w; }

int main(void)
{  
    Widget window(128, 240);
    const Widget window2(116,116);
   
    printf(" window.get_height() = %d /n", window.get_height());
    printf(" window.get_width() = %d /n", window.get_width());
    window.printSize();
    printf("/n");

    printf(" window2.get_height() = %d /n", window2.get_height());
    printf(" window2.get_width() = %d /n/n", window2.get_width());
    //window2.printSize(); //compile error:passing `const Widget' as `this' argument of `void Widget::printSize()' discards qualifiers
   
    while(1);
    return 0;
}
//result:
/*
 window.get_height() = 128
 window.get_width() = 240
 printSize: height = 128
 printSize: height = 240
 
 window2.get_height() = 116
 window2.get_width() = 116
*/        

代码说明:

compile error:passing `const Widget' as `this' argument of `void Widget::printSize()' discards qualifiers:

编译错误,因为widget2是const数据成员,那么,它只能访问const成员函数,而不能访问非const成员函数。

3. 有用链接:

以上描述了const数据成员在类中的定义及其访问规则,而其它更加详细的用法,请参考以下文章:

http://blog.chinaunix.net/u3/96369/showart_2054536.html

http://www.yuanma.org/data/2007/0429/article_2549.htm

 

【C++深度剖析学习总结】 3 C++对const的扩展 – 作者 Allen 转载请注明出处 微信公众号「炫色Allen」(微信号:Allen5G) 函数参数的默认值 c++可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 提个小问题问题:当函数声明和定义中的参数默认值不同时会发生什么? 5-1 #include &lt;stdio.h&gt; int mul(int x = 0); int main(int... 阅读详情

相关推荐

Windows11下QGIS 3.34.4安装Geo-SAM插件全流程(附RTX3060 CUDA12.0配置技巧)

本文详细介绍了在Windows 11系统中为QGIS 3.34.4安装和配置Geo-SAM插件的完整流程,特别针对RTX 3060显卡用户提供了CUDA 12.0与PyTorch环境的精准搭建方案。通过预编码与交互式分割两大核心步骤,该插件能显著提升遥感图像半自动标注的效率,降低硬件门槛,是地理信息处理领域融合AI技术的实用指南。

weixin_29089057的博客 296

C++类内成员初始化

C++类内成员初始化

转载和创作优秀的博客 1207

安装VMware,出现没有虚拟网络适配器的问题

安装VMware,出现没有虚拟网络适配器的问题

Young_Harry的博客 1万+

C++ 常见错误

#include using namespace std; class A { public: A(); ~A(); int i = 0;//普通变量不能在类中进行初始化 /* error: ISO C++ forbids initialization of member ‘i’ */ static int j = 0;//只有静态常量整形才能在类

1088

微信自动化进阶:Python识别特定消息并自动回复(基于win32api控件操作)

本文详细介绍了如何使用Python和win32api实现微信消息的智能监控与自动回复。通过精准识别聊天记录中的特定关键词,结合多级匹配策略和性能优化技巧,构建稳定高效的自动化回复系统,适用于企业客服、个人助手等场景。

weixin_42663213的博客 441

从Delphi 7到Delphi 10.4.1的代码迁移:关键挑战与实用解决方案

本文详细探讨了从Delphi 7升级到Delphi 10.4.1进行代码迁移的关键挑战与实用解决方案。核心内容包括应对Unicode字符串处理、64位数据类型变化、VCL/FMX界面框架选择、第三方组件迁移以及数据库层现代化改造(如从BDE迁移至FireDAC)。文章为开发者提供了系统的迁移前准备、核心问题攻克策略及测试落地指南,旨在帮助团队高效、平稳地完成系统现代化升级。

weixin_29250403的博客 531

C++成员变量初始化顺序

class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout << "n1:" << n1 << ", n2: " << n2 <<endl; } }; int ma

yinqiaohua的专栏 759

uniapp 开发微信小程序请求问题 , 真机调试正常,开发工具正常,但是使用扫码预览接口都是不通的,发布到体验版也是请求失败

uniapp开发小程序体验版接口请求失败(真机可以)

weixin_60408555的博客 3954

[C++] C++编译失败分析例子

1. ISO C++ forbids initialization of member `C' making `C' static ISO C++ forbids in-class initialization of non-const static member `C' 在C++中,禁止在constructor之外初始化成员变量,只能声明。只能初始化static 变量。 例如: int a;

virus026的专栏 3722

STM32驱动数码管:从硬件连接到动态显示实现

本文详细介绍了使用STM32单片机驱动数码管的完整流程,从硬件连接到软件实现。内容涵盖共阳/共阴数码管原理、GPIO配置、段码表生成,并重点解析了多位数码管动态显示的核心技术,包括动态扫描原理、消影处理及实战代码,帮助开发者快速掌握这一嵌入式开发基础技能。

p5l2m9n4o6q的博客 575

芒果YOLO11改进21:检测头Head篇:即插即用|新颖轻量化非对称多级压缩LADH检测头,原创改进适配YOLOv8高效检测头,检测头新颖性改进,全网首发独一份

检测头Head篇:即插即用|新颖轻量化非对称多级压缩LADH检测头,原创改进适配YOLOv8高效检测头,检测头新颖性改进,全网首发独一份

包括YOLOv5、YOLOv7、YOLOv8等模型改进 791

如何解决"ANSI C++ forbids data member `ip_opts' with same name as enclosing class"的编译错误

在编译选项中加入-fpermissive

风起云才会涌 1566

Qt代码-软件商店

ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString()));

寒寒豆豆软件公司的博客 111

C++系列-const所有用法总结

C++系列-const所有用法总结

weixin_48668114的博客 1327

数学建模模型总结

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++基础——const用法

1 const基本用法 void func() { const int a=1; int const b=2; // 一样的 const int * c;// const 修饰的是指针c所指向的内存空间,不能修改 int* const d;// const 修饰的是指针变量本身不能被改变 const int* const e;// 两者均不能修改 } 2. const 变量在C语言和C++语言中的区别: void func() { const int a=15; int* p=N

听风雨 269

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++基础——const基本用法

C++中三目运算符可以当左值 (a < b ? a : b )= 30; //返回一个最小数 并且给最小数赋值成30 const的基本用法 int main() { const int a; int const b; const int *c; int * const d; const int * const e ; return 0; } Int func1(const ) 初...

Orange_Wu的博客 180

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c++中const的用法总结

1 const基础知识(用法、含义、好处) 初级理解:const是定义常量==》const意味着只读 int main() { const int a=10;//定义一个常量,必须进行初始化 const int a;这句是错误的 int const b=10; //和上面的一句作用效果是相同的 const int *c; //const修饰的是指针指向的内存空间,不能被修改 int * const d; //const修饰的是指针 ,指针的值不能被修改 con

蜀沐的博客 265

C++面试基础系列-const

const表示常类型,其值不可更改。 类型检查 const具有类型,并支持所有类型 const修饰,名为常量,具备不可更改属性 防更改,保护作用,增加程序健壮性 节省空间,内存 从汇编上看,const实质是使用内存地址访问,#define是立即数 const常量存储在内存中,只有一个内存地址,#define是预编译时,拷贝到代码中,不占用内存空间(RAM),占用ROM。 3.const作用域 const 常量具有块作用域(如果定义在函数或代码块内部)或文件作用域(如果定义在所有函数外部),

wesigj的博客 1674

【转载】C++ Const关键字用法总结

原文地址:https://www.namidame.tech/C++_Const.html 用法 例子 说明 const变量 const int a; 不能改变值,必须初始化 const类变量 const MyClass a; 不能修改成员变量,不能调用非const函数 指向const变量的指针 const int * a; 不能修改指向的内容,可以改变指向的对象 const指针 int * const a; 可以修改指向的内容,不能改变指向的对象 指向const变量的con

boxboss的博客 2205

C++基础#24:C++中的const_cast,数据类型转换

C++中的const_cast运算符用于修改类型的const或volatile属性,从而强制消除对象的常量性。使用const_cast去除const限定的目的并不是为了修改它的内容。变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。

记录和分享程序人生的点点滴滴 3435

限定符const用法详解

离变量最近的说明了变量的性质----pi左边是const,说明pi是一个const对象,* 说明pi是一个常量指针,而const int 说明常量指针pi指向的对象是const int 类型的变量,即整型变量。(但是,两者必须为同一类型的变量,否则,编译器将在类型转换的过程中创建临时变量,就无法通过修改p2来控制b,而是控制临时变量)(但是,两者必须为同一类型的变量,否则,编译器将在类型转换的过程中创建临时变量,就无法通过修改p2来控制b,而是控制临时变量):表示被限定的对象一旦确定,就不能被修改。

2301_79357377的博客 1724

如何在C++项目中快速集成Sonic-Cpp?超详细安装与配置指南

想要在C++项目中实现极速JSON序列化和反序列化吗?Sonic-Cpp正是您需要的解决方案!作为一款基于SIMD指令集加速的高性能JSON处理库,Sonic-Cpp能够显著提升您的应用程序JSON处理性能。本文将为您提供完整的Sonic-Cpp集成指南,帮助您快速掌握这款强大的C++ JSON库。 ## 📦 Sonic-Cpp是什么? Sonic-Cpp是字节跳动开源的一款高性能JSON序

gitblog_00443的博客 1012

C++语法中const到底是什么情况?

如何理解const

qq_45595546的博客 922

yaml-cpp:3步让你的C++项目轻松玩转YAML配置管理 [特殊字符]

还在为C++项目中的配置文件解析而烦恼吗?🤔 每次看到那些复杂的XML或者自定义格式的配置文件,是不是觉得头大?今天我要给你介绍一个超级实用的工具——**yaml-cpp**,它能让你像读小说一样轻松处理YAML格式的数据! **yaml-cpp**是一个专门为C++开发者打造的YAML解析和生成库,完全遵循YAML 1.2规范。想象一下,你的配置文件可以写得像下面这样清晰: ```yaml

gitblog_00813的博客 1185

从C到C++ 番外const的用法

c++中const关键字的使用 const引用 const引用,可以对const对象创建cosnt引用,也可以对普通对象创建

Gelercat的博客 411

CPlusPlus - #011 const的用法

const的用法

AlanL的专栏 486
上一篇: Linux下的Android + Eclipse环境搭建
下一篇: 王传福以350亿元登顶中国首富
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值