静态数据成员&&友元函数

静态数据成员
1. static成员必须在类外定义并初始化
2. static数据成员和函数成员可以通过对象
名引用也可以通过类名引用{Clock c1,c2;
c1.count;
Clock::count
3. static成员函数只能访问static数据成员,
不能访问非static成员
4. 普通成员函数可以访问static数据成员.

class Point {//类定义
public: //外部接口
Point(int x=0,int y=0):x(x),y(y){
count++; //所有对象共同维护同一个count
}
Point(Point &p) { //复制构造函数
x = p.x;
y = p.y;
count++;
}
~Point() { count--; }
int getX() { return x; }
int getY() { return y; }
void showCount() { //输出静态数据成员
cout << " Object count = " << count << endl;
}
private: //私有数据成员
int x, y;
static int count;//静态数据成员声明,用于记录点的个数
};
int Point::count = 0;//必须定义和初始化
int main() { //主函数
Point a(4, 5); //定义对象a,其构造函数回使count增1
cout << "Point A: " << a.getX() << ", " << a.getY();
a.showCount(); //输出对象个数
Point b(a); //定义对象b,其构造函数回使count增1
cout << "Point B: " << b.getX() << ", " << b.getY();
b.showCount(); //输出对象个数
return 0;
}

静态成员函数
1.类外代码可以使用类名和作用域操作符来调用静态成员函数。
2.静态成员函数只能引用属于该类的静态数据成员或静态成员函数。

class Point {
public:
Point(int x=0,int y=0):x(x),y(y){
//所有对象共同维护同一个count
count++;
}
Point(Point &p) {
x = p.x;
y = p.y;
count++;
}
~Point() { count--; }
int getX() { return x; }
int getY() { return y; }
static void showCount() {//静态函数成员
   cout<<count<<endl;
   }
   private: //私有数据成员
int x, y;
static int count; //静态数据成员声明
};
int Point::count = 0;//定义和初始化
int main() {
Point a(4, 5); //构造函数使count增1
cout<<"Point A:"<<a.getX()<<","<<a.getY();
Point::showCount();//静态成员函数的调用
Point b(a); //构造函数使count增1
cout<<"Point B:"<<b.getX()<<","<<b.getY();
Point::showCount();
return 0;
}

友元函数
//一种破坏数据封装和数据隐藏的机制。
**不带有this指针
类中声明,类外或类内定义
不具有交换性
不具有传递性
不具有继承性
不是成员函数

#include <iostream>
#include <cmath>
class Point { //Point类声明
public: //外部接口
Point(int x=0,int y=0):x(x),y(y){ }
int getX() { return x; }
int getY() { return y; }
friend float dist(Point &a, Point &b);
private: //私有数据成员
int x, y;
};
float dist( Point& a, Point& b) {
double x=a.x-b.x;
double y=a.y-b.y;
return sqrt(x*x+y*y);
}i
nt main() {
Point p1(1,1), p2(4,5);
cout<<"The distance is:";
cout<<dist(p1,p2)<<endl;
return 0;
}


pta
1.对于以下关于友元的说法 (2分)

如果函数fun被声明为类A的友元函数,则该函数成为A的成员函数//不是成员函数
如果函数fun被声明为类A的友元函数,则该函数能访问A的保护成员,但不能访问私有成员
如果函数fun被声明为类A的友元函数,则fun的形参类型不能是A。
以上答案都不对
2.下面对静态数据成员的描述中,正确的是 (2分)

静态数据成员是类的所有对象共享的数据
类的每个对象都有自己的静态数据成员
类的不同对象有不同的静态数据成员
静态数据成员不能通过类的对象调用,只能通过“类名::标识符”调用
解析: 静态数据成员是被类的所有对象共享,它不属于类的任何一个对象,它的作用域是类范围。静态数据成员在每个类对象中并不占有存储空间,它只是每个类中分配有存储空间,供所有对象公用。静态数据成员的值对每个对象都一样,但它的值可以被任何一个对象更新,从而实现了同一类的不同对象之间的数据共享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值