06_c++静态成员和友元

来源:互联网 发布:用c语言控制九九乘法表 编辑:程序博客网 时间:2024/06/09 20:12

静态成员和友元

1、static成员

1.1、static数据成员

a,static数据成员的声明

static在类中进行声明,注意:此时并没有给该static数据成员分配空间,只是做了一个声明。

class Person {private:    static int cnt; /* 只是进行了声明,并没有分配空间 */...}

b,static数据成员的定义和初始化
在函数中使用格式 : <类名>::<静态数据成员名> 对static数据成员进行定义和初始化,注意定义的时候不加static。

int Person::cnt = 0;/* 定义和初始化,为类中的数据成员cnt分配空间,不加static */

c,含static成员的类大小

class Person  {  public:      int id;      static int cnt;  };  int main()  {      cout << sizeof(Person) << endl;      return 0;  }  

输出结果为:4.

为什么不是8?因为类中的static成员变量是放在全局数据存储区的,其不与普通类成员变量放在一块。

1.2、static成员函数

由于类的static成员和类的对象无关,则static成员函数不含this指针,即静态成员函数不能访问非静态(包括成员函数和数据成员),但是非静态可以访问静态。因为静态是属于类的,它是不知道你创建了10个还是100个对象,所以它对你对象的函数或者数据是一无所知的,所以它没办法调用。

#include <iostream>#include <string.h>#include <unistd.h>using namespace std;class Person {private:    static int cnt;public:    static int getCount(void);     Person() {        cnt++;    }};int Person::cnt = 0; /* 定义和初始化,为类中的数据成员cnt分配空间,不加static */int Person::getCount(void) {     return cnt; }int main(int argc, char **argv){    Person p[100];    cout << "person number = "<<Person::getCount()<<endl;/* Person::getCount()类直接调用静态成员函数。 */    cout << "person number = "<<p[0].getCount()<<endl;    cout << "person number = "<<p[1].getCount()<<endl;    return 0;}

2、友元函数

2.1、友元函数作用

在实现类之间数据共享时,减少系统开销,提高效率。友元函数是可以直接访问类的私有成员的非成员函数

2.2、友元函数使用

在类外实现函数,它不属于任何类,在类中加上关键字 friend 进行声明。

#include <iostream>#include <string.h>#include <unistd.h>using namespace std;class Point{private:    int x;    int y;public:    Point() {}    Point(int x, int y) : x(x),y(y){}    int getX(){ return x; }    int getY(){ return y; }    void setX(int x){ this->x = x; }    void setY(int y){ this->y = y; }    void printInfo()    {        cout<<"("<<x<<", "<<y<<")"<<endl;    }    friend Point add(Point &p1, Point &p2);/* 声明友元函数 */};Point add(Point &p1, Point &p2)/* 实现函数 */{    Point n;    n.x = p1.x + p2.x;/* x,y属于类的私有成员,友元函数可以访问 */    n.y = p1.y + p2.y;    return n;}int main(int argc, char **argv){    Point p1(1, 2);    Point p2(2, 3);    Point sum = add(p1, p2);    sum.printInfo();    return 0;}