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
相关产品推荐
相关产品推荐

