You need to enable JavaScript to run this app. C++ explicit构造函数、初始化列表及const成员函数语法问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

C++ explicit构造函数、初始化列表及const成员函数语法问题咨询

问题1解答

第2-3行对应的语法是带默认参数的explicit显式构造函数 + 成员初始化列表:

  • explicit关键字用来禁止构造函数的隐式类型转换,避免隐式转换带来的预期外行为
  • 入参int value=0给了默认实参,因此这个构造函数同时承担默认构造函数的作用,可以不传参数直接创建类a的实例
  • 冒号开头的部分是成员初始化列表,作用是在构造函数体执行前直接初始化类成员,比在构造函数体内赋值的效率更高,也是初始化const成员、引用成员的唯一合法方式

两种成员初始化写法的区别:

  • :storedvalue(value){}是传统的直接初始化语法,允许隐式窄化转换:比如传入的value是double类型的3.9时,会自动截断为int类型的3,编译最多给出警告不会报错
  • :storedvalue{value}{}是C++11引入的列表初始化(统一初始化)语法,禁止隐式窄化转换:如果传入的类型无法安全转换为storedvalue对应的int类型,编译会直接报错,能从语法层面避免很多隐式转换带来的bug,通用性和安全性更高

问题2解答

两种写法的const修饰的对象完全不同,功能差异很大:

  • const int read():const修饰的是函数的返回值,代表这个函数返回的int值是常量,不能被修改(比如a_instance.read() = 10这类操作会编译报错)。但这个函数本身是普通非const成员函数,函数内部允许修改类的非const成员变量,且只能被类的非const实例调用,const实例无法调用该函数。
  • int read() const:const修饰的是成员函数本身,代表这是一个常量成员函数。函数内部不允许修改类的任何非mutable成员变量,也不能调用其他非const成员函数。同时这类函数支持被类的const实例、非const实例共同调用,是只读类成员函数的标准写法。

内容的提问来源于stack exchange,提问作者venki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 07:45:01