如何定义一个类的特殊成员?
摘要:const 成员 const 是C语言延续的关键字,核心语义为只读不可修改,在类中用于限定成员(数据方法)的只读属性,帮助编译器优化,提升代码安全性与效率。 const 类数据(成员属性) 核心用途 修饰一旦初始化就不可修改的类属性(如身
const 成员
const 是C语言延续的关键字,核心语义为只读不可修改,在类中用于限定成员(数据/方法)的只读属性,帮助编译器优化,提升代码安全性与效率。
const 类数据(成员属性)
核心用途
修饰一旦初始化就不可修改的类属性(如身份证号、学号、固定名称等)。
初始化方式(两种)
初始化方式
语法示例
特点与适用场景
构造函数初始化列表
cpp class Person { const unsigned int ID; public: Person(unsigned int id) : ID(id) {} // 初始化列表赋值 };
1. 支持对象创建时传入不同初始值(如不同学生的学号)
2. 兼容性强,支持所有C++标准
类内直接初始化
cpp class Person { const unsigned int ID = 1234; // 类内定死值 };
1. 所有对象共享同一固定值,不可修改
2. 仅支持C++11及以上标准,老旧编译器可能报错
3. 适用场景:类的公共固定属性(如学校名称)
典型示例
class Student {
private:
// 所有学生共享的固定属性(类内初始化)
const string schoolName = "XXX学院";
// 每个学生独有的只读属性(初始化列表赋值)
const int ID;
public:
// 构造函数初始化列表为ID赋值
Student(int id) : ID(id) {}
};
int main() {
Student Jack(001); // ID=001,schoolName=XXX学院
Student Lucy(002); // ID=002,schoolName=XXX学院
}
注意事项
const 类数据不可在构造函数体内部赋值(仅能通过初始化列表或类内初始化);
类内初始化的 const 成员,本质是编译期常量(若值为字面量),内存占用更高效。
const 类方法
核心用途
声明该方法不会修改类的任何数据成员,也不会调用非 const 方法,是“只读操作”的明确标识。
语法规则
const 关键字必须放在函数参数列表之后;
声明与定义中必须同时包含 const(const 是方法重载的依据之一)。
示例代码
// 头文件 Person.h
#ifndef _PERSON_H
#define _PERSON_H
#include <string>
using namespace std;
class Person {
int age;
string name;
public:
// 声明时加const
void showInfo() const;
void setName(string newName); // 非const方法
};
#endif
// 实现文件 Person.cpp
#include "Person.h"
// 定义时必须加const,与声明一致
void Person::showInfo() const {
// 错误:const方法不能修改成员数据
// age = 100;
// 错误:const方法不能调用非const方法
// setName("刘德华");
cout << "姓名:" << name << ",年龄:" << age << endl;
}
注意事项
const 对象只能调用 const 类方法(非 const 对象可调用所有方法);
逻辑上不修改成员数据的方法,务必声明为 const(提升编译优化效率,减少误操作)。
拓展:const 与 static 的组合
static const 类数据(C++11前常用)
class Student {
// 类内声明(必须类外定义)
static const int MAX_SCORE = 100;
};
// 类外定义(C++11前必须,C++11后可省略,但建议保留兼容性)
const int Student::MAX_SCORE;
特性:所有对象共享、只读、编译期常量(值需为字面量);
适用场景:类的公共常量(如满分、最大容量)。
