成员函数常量

重载函数与一个const和非const版本通常是当返回值需要不同的常量。在上面的例子中,对getvalue() const版本返回const引用,而非const版本返回一个非const引用。

让我们使我们的日期类的成员函数常量可以使用const对象看日期:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Date
{
private:
    int m_nMonth;
    int m_nDay;
    int m_nYear;
 
    Date() { } // private default constructor
 
public:
    Date(int nMonth, int nDay, int nYear)
    {
        SetDate(nMonth, nDay, nYear);
    }
 
    void SetDate(int nMonth, int nDay, int nYear)
    {
        m_nMonth = nMonth;
        m_nDay = nDay;
        m_nYear = nYear;
    }
 
    int GetMonth() { return m_nMonth; }
    int GetDay()  { return m_nDay; }
    int GetYear() { return m_nYear; }
};

唯一的非构造函数的成员函数不能修改成员变量(或调用函数修改成员变量)是访问功能。因此,他们应该是。这里是我们的日期类const版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Date
{
private:
    int m_nMonth;
    int m_nDay;
    int m_nYear;
 
    Date() { } // private default constructor
 
public:
    Date(int nMonth, int nDay, int nYear)
    {
        SetDate(nMonth, nDay, nYear);
    }
 
    void SetDate(int nMonth, int nDay, int nYear)
    {
        m_nMonth = nMonth;
        m_nDay = nDay;
        m_nYear = nYear;
    }
 
    int GetMonth() const { return m_nMonth; }
    int GetDay() const { return m_nDay; }
    int GetYear() const { return m_nYear; }
};


### 静态成员函数与普通成员函数常量成员函数的区别 静态成员函数、普通成员函数常量成员函数在 C++ 中有着不同的定义、使用场景和限制。以下是它们的主要区别: #### 1. 静态成员函数 静态成员函数是类的全局函数,属于整个类而非某个特定对象。它可以通过类名直接调用,也可以通过对象调用,但不依赖于具体的对象实例[^1]。 - **定义方式**:需要在函数声明前加上 `static` 关键字。 - **访问权限**:只能访问静态成员变量或静态成员函数,不能直接访问非静态成员变量或普通成员函数[^1]。 - **调用方式**:`ClassName::StaticFunction()` 或 `object.StaticFunction()`。 - **特点**: - 不包含隐式的 `this` 指针,因此无法访问非静态成员。 - 常用于实现与类相关的全局功能。 示例代码如下: ```cpp class MyClass { public: static void StaticFunction() { // 可以访问静态成员变量 count++; } static int count; }; int MyClass::count = 0; int main() { MyClass::StaticFunction(); // 调用静态成员函数 return 0; } ``` #### 2. 普通成员函数 普通成员函数属于类的具体对象实例,必须通过对象调用。它能够访问类中的所有成员(包括静态和非静态成员)。 - **定义方式**:无需特殊关键字。 - **访问权限**:可以访问静态成员变量、静态成员函数、非静态成员变量和非静态成员函数。 - **调用方式**:`object.NormalFunction()`。 - **特点**: - 包含隐式的 `this` 指针,指向调用该函数的对象。 - 通常用于操作对象的状态。 示例代码如下: ```cpp class MyClass { public: void NormalFunction() { // 可以访问非静态成员变量 value = 42; } int value; }; int main() { MyClass obj; obj.NormalFunction(); // 调用普通成员函数 return 0; } ``` #### 3. 常量成员函数 常量成员函数用于保证对象的状态在函数调用过程中不会被修改。它通过在函数声明后添加 `const` 关键字来实现[^2]。 - **定义方式**:在函数声明后加上 `const`。 - **访问权限**:只能访问常量成员变量和其他常量成员函数,不能修改任何非静态成员变量。 - **调用方式**:`constObject.ConstFunction()`。 - **特点**: - 包含 `this` 指针,但其类型为 `const`,确保对象不可被修改。 - 常用于只读操作或查询操作。 示例代码如下: ```cpp class MyClass { public: int getValue() const { return value; // 只能读取成员变量 } int value; }; int main() { const MyClass obj = MyClass{42}; obj.getValue(); // 调用常量成员函数 return 0; } ``` ### 总结 - **静态成员函数**:属于类本身,不依赖具体对象,无法访问非静态成员。 - **普通成员函数**:属于对象实例,可以访问所有成员,依赖于具体对象。 - **常量成员函数**:保证对象状态不变,只能访问常量成员变量或其他常量成员函数。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值