友元和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;
}
相关文章
|
4月前
|
编译器 C++
【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)
【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)
25 2
|
4月前
友元函数、成员函数和普通函数使用上的不同
友元函数、成员函数和普通函数使用上的不同
20 0
|
4月前
|
C++
C++——类和对象(初始化列表、匿名对象、static成员、类的隐式类型转换和explicit关键字、内部类)
C++——类和对象(初始化列表、匿名对象、static成员、类的隐式类型转换和explicit关键字、内部类)
|
4月前
|
C++
c++中const修饰成员函数的问题
问题引入: 看下面这一段代码:
41 0
|
4月前
|
编译器
static关键字修饰成员变量与成员函数
1. static概念 声明 为static的类成员称为类的静态成员,用static修饰的成员变量,称为静态成员变量;用static修饰的成员函数,称为静态成员函数,都存放在堆区。 静态成员变量一定要在类外进行初始化。
104 0
|
9月前
|
Java 编译器 C++
【C++初阶】——初始化列表&static成员&友元&内部类&匿名对象
前几篇文章我们对于分别对C++类和对象进行了一系列的探讨,包括类和对象的认识、类中的6个默认成员函数。在成员函数中我们学习了构造函数,但是构造函数还有一些问题需要我们继续深入的学习,让我们开始今天的学习吧!!!
|
10月前
|
编译器 C++
C++类与对象 - 4(初始化列表,Static成员,友元,内部类,匿名对象)
C++类与对象 - 4(初始化列表,Static成员,友元,内部类,匿名对象)
33 0
|
C++
C++中的const成员变量和成员函数
在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量和成员函数。 const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字。初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击《C++初始化列表》回顾。 const成员函数(常成员函数) const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。 我们通常将 get 函数设置为常成员函数。
57 1
类与对象中const修饰成员函数
类与对象中const修饰成员函数
48 0
|
安全 编译器 C++
C++ 引用,友元,运算符重载
C++ 引用,友元,运算符重载