类的静态成员&友元函数

    科技2023-09-17  117

    类的静态成员

    静态数据成员(有作用域的全局变量,编译时确定段和相对地址在哪(在目标文件中,section,程序运行时加载到内存中,根据编译时确定的段和相对地址分配内存,变成segment),即使不定义对象,也为static数据成员分配空间)

    静态成员可以是私有或者公有多个对象之间的数据共享,它与类相关联,而不是与类的对象相关联。静态数据成员只有一个,供所有对象共用。必须在类定义体外部定义,且在定义时必须初始化。 #include <iostream> using namespace std; class Student{ public: static int number;//声明,不占空间 }; int Student::number = 500;//类外初始化定义,在全局区,全局变量,只是在Student作用域下 int main(){ //类作用域访问 cout << Student::number << endl; //类对象访问 Student stu1; cout << stu1.number << endl; return 0; }

    静态成员函数(有作用域的全局函数,没有隐含的this指针) 作用:处理私有静态数据成员

    #include <iostream> using namespace std; class Student{ private: static int number;//声明,不占空间 public: static int setNumber(int num){ number = num; } static int getNumber(){ return number; } }; int Student::number = 500;//类外初始化定义,在全局区,全局变量,只是在Student作用域下 int main(){ //作用域静态成员函数访问 Student::setNumber(1); cout << Student::getNumber() << endl; return 0; }

    友元函数

    友元机制允许一个类将对其非公有成员的访问权授予指定的函数和类。 友元的声明以关键字friend开始,它只能出现在类的内部

    将一个类B声明为另一个类A的友元类,则B类中的成员函数可以访问A类的私有数据。

    友元关系为单向,B类是A类的友元类,则B的成员可以访问A类的私有成员,但A的成员函数不能访问B类的私有成员。

    友元关系不能传递, B类是A类的友元类,C类是B类的友元类,C类并不是A类的友元类。(我朋友的朋友不是我朋友)

    /* 定义一个类A,其有一个私有的数据成员,通过四种方式在主函数里获取类A对象的数据成员的值。 1.类A本身的成员函数。 2.定义一个普通函数,声明其为类A的友元函数。 3.定义一个类B,其中有一个成员函数,声明其为类A的友元函数。 4.定义一个类C,声明其为类A的友元类。 */ #include <iostream> using namespace std; class A; class B{ public: int BgetAdata(const A &a)const; }; class A{ private: int m_data; public: A(){} A(int m_data):m_data(m_data){} //类A本身的成员函数。 int getData() const{ return m_data; } //声明其为类A的友元函数。 friend int friendgetData(const A& a); // 类B,其中有一个成员函数,声明其为类A的友元函数。 friend int B::BgetAdata(const A &a)const; // 类C,声明其为类A的友元类 friend class C; }; int friendgetData(const A &a){ return a.m_data; } int B::BgetAdata(const A &a)const{ return a.m_data; } class C{ public: int CgetAdata(const A& a)const{ return a.m_data; } }; int main(){ A a(1); //类A本身的成员函数,获取类A对象的私有数据成员的值。 cout << a.getData() << endl; // 类A的友元函数----普通函数,获取类A对象的私有数据成员的值。 cout << friendgetData(a) << endl; // 类A的友元函数----类B成员函数,获取类A对象的私有数据成员的值。 B b; cout << b.BgetAdata(a) << endl; //类A的友元类----类C--类c的成员函数,获取类A对象的私有数据成员的值。 C c; cout << c.CgetAdata(a) << endl; return 0; }
    Processed: 0.028, SQL: 8