C++ const关键字相关作业题要求理解及代码报错咨询
C++ const关键字作业题解
题目核心考察点
这道题核心是考察C++中const关键字在类场景下的三类用法约束,不需要实现复杂业务逻辑,只要把四个约束场景演示正确即可:
- 类中const数据成员的初始化、使用限制
- 末尾带
const的常量成员函数的权限约束 - 不同const属性的成员函数操作不同const属性数据成员时的合法/非法边界
题目要求四个函数都返回int类型值,这里的“返回修改后的整型值”指返回经过逻辑处理后的结果值,不要求必须修改类的成员变量本身——很多编译报错都是因为尝试做C++语法明确禁止的const修改操作。
你现有代码的报错原因
- 基础语法错误:
ConstData函数定义缺少左大括号{,函数体必须被{}完整包裹,属于书写疏漏 - 函数名不匹配:题目要求的后两个函数名是
NonFunction、ConstantBoth,你注释里写的ConstFunction、ConstBoth和要求不符,主函数调用时找不到对应函数定义 - 返回值违规:你注释里写的
ConstBoth返回类型是void,不符合题目“返回类型不得为void”的要求 - 逻辑违规:你尝试直接在成员函数内给const数据成员赋值、在const成员函数内修改普通成员,这些操作本身就被C++语法禁止,必然触发编译报错,这也是这道题要演示的const约束本身
符合题目要求的可运行代码
#include<iostream> using namespace std; class Project { private: const int const_num; // 题目要求声明的int类型常量数据成员 int normal_num; // 普通非常量数据成员 public: // const数据成员必须在构造函数初始化列表完成赋值 Project():const_num(5), normal_num(0){} // 1. 非常量成员函数,操作非常量数据:可直接修改普通成员 int NonConstant(int x) { normal_num = x; return normal_num; } // 2. 非常量成员函数,操作常量数据:const成员初始化后不可直接修改,返回计算后的结果值 int ConstantData(int x) { // 放开下一行注释会直接编译报错:不能给const数据成员赋值 // const_num = x; return const_num + x; } // 3. 常量成员函数(末尾加const),操作非常量数据:const函数内不能修改普通非mutable成员 int NonFunction(int x) const { // 放开下一行注释会直接编译报错:const成员函数内不能修改普通成员 // normal_num = x; return normal_num + x; } // 4. 常量成员函数,操作常量数据:只读访问const成员合法 int ConstantBoth(int x) const { return const_num + x; } }; int main() { Project obj; cout<<"NonConstant(1): "<<obj.NonConstant(1)<<endl; cout<<"ConstantData(1): "<<obj.ConstantData(1)<<endl; cout<<"NonFunction(1): "<<obj.NonFunction(1)<<endl; cout<<"ConstantBoth(1): "<<obj.ConstantBoth(1)<<endl; return 0; }
关键const规则备忘
- 类的const数据成员必须在构造函数初始化列表赋值,对象创建后任何位置都不能直接修改其值
- 成员函数参数列表后加
const才是常量成员函数,这种函数内的this指针是const属性,不能修改类的非mutable成员,也不能调用类的非const成员函数 - 非const成员函数可以读写普通成员,但依然没有权限修改const数据成员
- const成员函数可以被const对象、非const对象调用,非const成员函数只能被非const对象调用
内容的提问来源于stack exchange,提问作者mrc
相关产品推荐
相关产品推荐

