友元和const修饰成员函数

简介: 友元和const修饰成员函数

const修饰成员函数

常函数:

1.成员函数后加const后我们称为这个函数为常函数
2.常函数内不可修改成员函数属性
3.成员属性声明时加关键字mutable后,在常函数中依然可以修改
代码如下:

class Person
{
    
public:
    //在成员函数后加const,修饰的是this的指向,让指针指向的值也不可以被修改
    void showPerson() const
    {
    
        //m_A = 100;常函数内不可修改成员函数属性
           m_B = 100; //成员属性声明时加关键字mutable后,在常函数中依然可以修改
    }
    int m_A;
    mutable int m_B; //特殊变量,即使在常函数中,也可以修改这个值,加关键字mutable
};

常对象:

1.声明对象前加const称该对象为常对象
代码如下:

#include
using namespace std;
class Person
{
    
public:
    void showPerson() const
    {
    
           m_B = 100; //成员属性声明时加关键字mutable后,在常函数中依然可以修改
    }
    void func()
    {
    
        m_A = 100;
    }
    int m_A;
    mutable int m_B; //特殊变量,即使在常函数中,也可以修改这个值,加关键字mutable
};
int main()
{
    
    const Person p; //在对象前加const,就成了常函数
    //p.m_A = 100;
    p.m_B = 100;//m_B是一个特殊的值即使在常对象下,也是可以修改的。
    p.showPerson();
    //p.func();常对象只能调用常函数
    system("pause");
    return 0;
}

友元

在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类,访问另一个类中私有成员
友元的关键字为 friend
友元的三种实现

1.全局函数做友元
2.类做友元
3.成员函数做友元

1.全局函数做友元

#include
#include
using namespace std;
class Building
{
    
public:
    Building()
    {
    
        this->m_SittingRoom = "客厅";
        this->m_BedRoom = "卧室";
    }
public:
    string m_SittingRoom;//客厅
private:
    string m_BedRoom;//卧室
};
void goodgay(Building*building)
{
    
    cout << "好基友正在访问: " << building->m_SittingRoom << endl;
    //cout << "好基友正在访问: " << building->m_BedRoom << endl;
             //全局函数是无法访问类中的保护权限中的成员的
}

所以这时候就需要友元

#include
#include
using namespace std;
class Building
{
    
    friend void goodgay(Building* building);
    //类似于函数的申明,只是在前面多加一个    friend就创建了一个友元,这样就可以
    //该全局函数就可以访问该类保护权限里面的内容了
public:
    Building()
    {
    
        this->m_SittingRoom = "客厅";
        this->m_BedRoom = "卧室";
    }
public:
    string m_SittingRoom;//客厅
private:
    string m_BedRoom;//卧室
};
void goodgay(Building*building)
{
    
    cout << "好基友正在访问: " << building->m_SittingRoom << endl;
    cout << "好基友正在访问: " << building->m_BedRoom << endl;
}

2.类做友元

其实很简单
只需要在此类里面加一个类友元的声明就行如下:

friend class GoodGay;

具体代码如下:

#include
#include
using namespace std;
class Building;
class GoodGay
{
    
public:
    GoodGay();
    void visit();
private:
    Building* building;
};
class Building
{
    
    friend class GoodGay;  //类做友元
public:
    Building();
public:
    string m_SittingRoom;//客厅
private:
    string m_BedRoom;//卧室
};
//类外定义类内函数
Building::Building()
{
    
    this->m_SittingRoom = "客厅";
    this->m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
    
    building = new Building;
}
void GoodGay::visit()
{
    
    cout << building->m_SittingRoom << endl;
    cout << building->m_BedRoom << endl;
}
int main()
{
    
    GoodGay a;
    a.visit();
    system("pause");
    return 0;
}

3.成员函数做友元

只需要在类内添加如下即可:

friend void GoodGay::visit();

具体代码如下:

//类成员做友元
#include
#include
using namespace std;
class Building;
class GoodGay
{
    
public:
    GoodGay();
    void visit();
private:
    Building* building;
};
class Building
{
    
    friend void GoodGay::visit();
public:
    Building();
public:
    string m_SittingRoom;//客厅
private:
    string m_BedRoom;//卧室
};
Building::Building()
{
    
    this->m_SittingRoom = "客厅";
    this->m_BedRoom = "卧室";
}
GoodGay::GoodGay()
{
    
    building = new Building;
}
void GoodGay::visit()
{
    
    cout << building->m_SittingRoom << endl;
    cout << building->m_BedRoom << endl;
}
相关文章
|
Java 数据库连接 mybatis
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
在进行springboot和mybatis遇到了这个错误 Servlet.service() for servlet [dispatcherServlet] in context with path [] th
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
|
前端开发 JavaScript
前端模拟接口工具推荐——Apifox(mock数据)【图解教程】
前端模拟接口工具推荐——Apifox(mock数据)【图解教程】
3262 1
|
JSON 数据挖掘 API
1688API接口推荐:1688商品列表数据接口
1688API接口推荐:1688商品列表数据接口
|
前端开发
css 动画播放暂停
css 动画播放暂停
113 0
|
Web App开发 Ubuntu Linux
Ubuntu Linux下搭建FTP服务器图解
1 首先用命令检查是否安装了vsftpd vsftpd -version 如果未安装用一下命令安装 apt-get install vsftpd 安装完成后,再次输入vsftpd -version命令查看是否安装成功 2 新建一个文件夹用于FTP的工作目录 mkdir /home/ftp 3 新建FTP用户并设置密码以及工作目录 ftpna
4163 0
|
存储
带你熟练使用list
带你熟练使用list
88 0
|
机器学习/深度学习 数据采集 人工智能
Meta这篇语言互译大模型研究,结果对比都是「套路」
Meta这篇语言互译大模型研究,结果对比都是「套路」
640 0
|
关系型数据库 MySQL Linux
linux数据库rpm安装mysql数据库rpm包安装顺序
linux数据库rpm安装mysql数据库rpm包安装顺序
345 0
|
Java 应用服务中间件
Elasticsearch-Jest 配置ES集群&源码解读
Elasticsearch-Jest 配置ES集群&源码解读
251 0
一个有意思的面试题 → 线程交替输出问题
问题描述   用两个线程,一个输出数字,一个输出字母,交替输出 1A2B3C4D...26Z