美文网首页
C++静态成员与友元

C++静态成员与友元

作者: 帅碧 | 来源:发表于2016-11-14 20:48 被阅读0次

静态成员

静态变量的初始化(如何定义)

#include<iostream>
using namespace std;
class Student
{
    static int num;
public:
    Student()
    {
        num++;
    }
    ~Student()
    {
        num--;
    }
    int getnum()
    {
        return num;
    }
};
int Student::num=0;
int main()
{
    Student t1;
    Student t2;
    Student *t3=new Student;
    cout<<"Student num1 = "<<t2.getnum()<<endl;
    delete t3;
    cout<<"Student num2 = "<<t2.getnum()<<endl;
}
//结果为:
//Student num1=3;
//Student num2=2;

  • static int getnum()//静态成员函数
#include<iostream>
using namespace std;
class Student
{
    static int num;
public:
    Student()
    {
        num++;
    }
    ~Student()
    {
        num--;
    }
    static int getnum()
    {
        return num;
    }
};
int Student::num=0;
int main()
{
    cout<<"Student num0 = "<<Student::getnum()<<endl;
    Student t1;
    Student t2;
    Student *t3=new Student;
    cout<<"Student num1 = "<<Student::getnum()<<endl;
    delete t3;
    cout<<"Student num2 = "<<Student::getnum()<<endl;
}
//结果为:
//num0=0;
//num1=3;
//num2=2;

  • 静态成员函数只能操作静态成员变量
  1. 第一种
#include<iostream>
using namespace std;
class Student
{
    static int num;
    int id;
public:
    Student()
    {
        num++;
    }
    ~Student()
    {
        num--;
    }
    int getnum()
    {
        int id=0;
        return num;
    }
};
int Student::num=0;
int main()
{
//  cout<<"Student num0 = "<<Student::getnum()<<endl;
    Student t1;
    Student t2;
    Student *t3=new Student;
    cout<<"Student num1 = "<<t2.getnum()<<endl;
    delete t3;
    cout<<"Student num2 = "<<t2.getnum()<<endl;
}

  1. 第二种( 静态成员函数只能操作静态成员变量)(推荐此用法)
#include<iostream>
using namespace std;
class Student
{
    static int num;
    int id;
public:
    Student()
    {
        num++;
    }
    ~Student()
    {
        num--;
    }
    int getid()
    {
        id=0;
        return id;
    }
    static int getnum()
    {
        return num;
    }
};
int Student::num=0;//静态成员变量的初始化,一定要写在外面
int main()
{
//  cout<<"Student num0 = "<<Student::getnum()<<endl;
    Student t1;
    Student t2;
    Student *t3=new Student;
    cout<<"Student num1 = "<<Student::getnum()<<endl;
    delete t3;
    cout<<"Student num2 = "<<Student::getnum()<<endl;
}

总结

  • 静态数据成员用得比较多的地方
  • 一个静态成员函数不能访问非静态成员变量

友元

#include<iostream>
using namespace std;
class Student
{
    int m_id;
public:
    Student(int id)
    {
        m_id=id;
    }
    friend void test(Student t);//所以要加声明;
};
void test(Student t)
{
    cout<<"id = "<<t.m_id<<endl;//是错误的,m_id是私有的,不能再外部访问
}
int main()
{
    Student t1(10);
    test(t1);
}
//结果为:id=10;

友类

#include<iostream>
using namespace std;
class Student
{
    int m_id;
public:
    Student(int id)
    {
        m_id=id;
    }
    friend class A;
};
class A
{
public:
    void test(Student t)
    {
        cout<<"id = "<<t.m_id<<endl;
    }
};

int main()
{
    Student t1(10);
    A a;
    a.test(t1);
}
//结果为:id = 10;

  • 友元不能传递
#include<iostream>
using namespace std;
class Student
{
    int m_id;
public:
    Student(int id)
    {
        m_id=id;
    }
    friend class B;
    friend class A;
};
class B
{
    friend class A;
}
class A
{
public:
    void test(Student t)
    {
        cout<<"id = "<<t.m_id<<endl;
    }
};

int main()
{
    Student t1(10);
    A a;
    a.test(t1);
}

//结果为:
//id=10;

  • 诡异的程序
#include<iostream>
using namespace std;
class Student;
class A
{
public:
    void test(Student t);
};
class Student
{
    int m_id;
public:
    Student(int id)
    {
        m_id=id;
    }
    friend void A::test(Student t);
};

void A::test(Student t)
{
    cout<<"id = "<<t.m_id<<endl;
}
int main()
{
    Student t1(10);
    A a;
    a.test(t1);
}

//结果为:
//id=10

友元函数

需要友元的原因

  1. 有时候,普通函数需要直接访问一个类的保护或私有数据成员。
  2. 需要友元的另一个原因是为了方便重载操作符的使用。
  3. 友元函数不是成员函数,它是类的朋友,因而能够访问类的全部成员。
  4. 在类的内部,只能声明它的函数原型,加上friend关键字.

友元的使用

  1. 在类里声明一个普通函数,标上关键字friend,就成了该类的友元,可以访问该类的一切成员。
  2. 一个类的成员函数可以是另一个类的友元。

相关文章

  • c++语法2

    接上篇我们继续学习静态成员、友元函数、继承、多重继承,继承访问权限等 静态成员与友元函数:c++中静态成员与jav...

  • C++基础-(静态成员和友元)

    C++基础 静态成员和友元 static:标志静态成员 friend:标志友元 静态数据成员用得比较多的场合一般为...

  • C++静态成员与友元

    静态成员 静态变量的初始化(如何定义) static int getnum()//静态成员函数 静态成员函数只能操...

  • 10-C++远征之模板篇-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • 慕课网-C++远征之模板篇(上)-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • C++第六弹---静态成员与友元

    静态成员 静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。 ...

  • C++总结之静态成员与友元函数

    为什么要有静态成员?全局变量可以实现数据共享,但是处处不可见,不安全---->静态成员可以实现一个类的所有对象的数...

  • C++笔记2

    1.Josephus数小孩 2.静态成员 友元1(friend) 友元2

  • 深入理解C++对象模型

    1. C++对象模型 所有的非静态数据成员存储在对象本身中。所有的静态数据成员、成员函数(包括静态与非静态)都置于...

  • 第三章 类与对象应用

    学习目的 掌握静态数据成员及静态成员函数的使用; 掌握友元函数的使用; 掌握常成员函数的应用; 掌握对象成员的使用...

网友评论

      本文标题:C++静态成员与友元

      本文链接:https://www.haomeiwen.com/subject/mfckpttx.html