【C++】类和对象---const成员,取地址及const取地址操作符重载,static成员

目录

⭐const成员

⭐取地址及const取地址操作符重载

⭐static成员

⭐概念

⭐特性


⭐const成员

将const修饰的"成员函数"称之为const成员函数 ,const修饰类成员函数,实际修饰该成员函数
隐含的this指针 ,表明在该成员函数中不能对类的任何成员进行修改。

看看下面的代码

cpp 复制代码
class Date
{
public:
    Date(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    void Print()
    {
        cout << "Print()" << endl;
        cout << "year:" << _year << endl;
        cout << "month:" << _month << endl;
        cout << "day:" << _day << endl << endl;
    }
    void Print() const
    {
        cout << "Print()const" << endl;
        cout << "year:" << _year << endl;
        cout << "month:" << _month << endl;
        cout << "day:" << _day << endl << endl;
    }
private:
    int _year; // 年
    int _month; // 月
    int _day; // 日
};
void Test()
{
    Date d1(2022, 1, 13);
    d1.Print();
    const Date d2(2022, 1, 13);
    d2.Print();
}

运行结果:

  • 左图中有两个Print()函数,一个是const成员函数,另一个不是const成员函数
  • 右图中只有一个const成员函数的Print()

对比两个的运行结果可以发现:

  • const对象只能调用const成员函数
  • 非const对象既可以调用const成员函数,也可以调用非const成员函数

请思考下面的几个问题:

  1. const对象可以调用非const成员函数吗?

不可以,const修饰了隐藏的this指针,调用非const成员函数属于权限的放大,不可行。
2. 非const对象可以调用const成员函数吗?

可以,允许这种权限缩小的行为
3. const成员函数内可以调用其它的非const成员函数吗?

不可以,权限放大了
4. 非const成员函数内可以调用其它的const成员函数吗?

可以,是权限的缩小

⭐取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

cpp 复制代码
class Date
{
public:
    Date* operator&()
    {
        return this;
    }
    const Date* operator&()const
    {
        return this;
    }
private:
    int _year; // 年
    int _month; // 月
    int _day; // 日
};

可以发现,无论写不写这两个重载函数,都可以正确地取地址,这就是因为这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需

要重载,比如想让别人获取到指定的内容(不过多介绍)

⭐static成员

⭐概念

声明为static的类成员 称为类的静态成员 ,用static 修饰的成员变量 ,称之为静态成员变量 ;用
static 修饰的成员函数 ,称之为静态成员函数静态成员变量一定要在类外进行初始化

一个思考题:实现一个类,计算程序中创建出了多少个类对象。

设置一个变量来记录创建类对象的个数,因为始终要对同一个变量进行操作,所以这个变量要设置成静态的成员变量,通过静态的成员函数来访问这个变量的大小。

cpp 复制代码
#include<iostream>
using namespace std;
class A
{
public:
    A() { ++_scount; }
    A(const A& t) { ++_scount; }
    ~A() { --_scount; }
    static int GetACount() { return _scount; }
private:
//声明
//不属于某一个对象,属于所有对象,属于整个类,不能给缺省值
    static int _scount;//要对同一个n进行操作,就要写成静态了
};
int A::_scount = 0;//在类外面定义
void TestA()
{
    cout << A::GetACount() << endl;//静态成员函数才可以这么访问
    A a1, a2;
    A a3(a1);
    cout << A::GetACount() << endl;
}
int main()
{
    TestA();
    return 0;
}

⭐特性

  1. 静态成员为所有类对象所共享,不属于某个具体的对象存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针不能访问任何非静态成员
  5. 静态成员也是类的成员受public、protected、private 访问限定符的限制

【问题】

  1. 静态成员函数可以调用非静态成员函数吗? 不可以,静态成员函数没有this指针,不能访问非静态的成员变量
  2. 非静态成员函数可以调用类的静态成员函数吗? 可以的,它们都在同一个类里面

⭐感谢你的阅读,希望本文能够对你有所帮助。如果你喜欢我的内容,记得点赞关注收藏我的博客,我会继续分享更多的内容。⭐

相关推荐
zzywxc78716 分钟前
详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
开发语言·javascript·人工智能·深度学习·金融·prompt·流程图
浮灯Foden29 分钟前
算法-每日一题(DAY13)两数之和
开发语言·数据结构·c++·算法·leetcode·面试·散列表
淡海水42 分钟前
【原理】Struct 和 Class 辨析
开发语言·c++·c#·struct·class
Q_Q19632884751 小时前
python的电影院座位管理可视化数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
杜子不疼.1 小时前
《Python学习之第三方库:开启无限可能》
开发语言·python·学习
青川入梦2 小时前
MyBatis极速通关上篇:Spring Boot环境搭建+用户管理实战
java·开发语言·mybatis
CC__xy2 小时前
04 类型别名type + 检测数据类型(typeof+instanceof) + 空安全+剩余和展开(运算符 ...)简单类型和复杂类型 + 模块化
开发语言·javascript·harmonyos·鸿蒙
青草地溪水旁2 小时前
UML函数原型中stereotype的含义,有啥用?
c++·uml
萤丰信息2 小时前
技术赋能安全:智慧工地构建城市建设新防线
java·大数据·开发语言·人工智能·智慧城市·智慧工地
青草地溪水旁2 小时前
UML函数原型中guard的含义,有啥用?
c++·uml