fu
1、静态数据成员
//用关键字static声明
//为该类的所有对象共享,具有静态生存期
//必须在类的外面定义和初始化,用“::”(作用域操作符)来指明所属的类
#include <iostream>
using namespace std;
class Point {
private:
int x, y;
public:
Point(int x = 0, int y = 0) : x(x), y(y) {} //构造函数
~Point() {} //析构函数
int getX() {return x;}
int getY() {return y;}
};
//假设需要统计点的总个数,考虑添加一个数据成员count
class Point {
private:
int x, y;
int count;
public:
Point(int x = 0, int y = 0) : x(x), y(y) {} //构造函数
~Point() {} //析构函数
int getX() {return x;}
int getY() {return y;}
void addCoutn() {count++;}
void showCount() {
cout << "count = " << cout << endl;
}
};
//同时创建了多个对象,要保证增加一个对象count就加一,还要保证所有对象同步count值。因此制定count为一个静态数据成员
class Point {
private:
int x, y;
static int count; //静态数据成员声明
public:
Point(int x = 0, int y = 0) : x(x), y(y) {} //构造函数
~Point() {} //析构函数
int getX() {return x;}
int getY() {return y;}
void addCoutn() {count++;}
void showCount() {
cout << "count = " << cout << endl;
}
};
int Point :: count = 0; //静态数据成员必须在类的外面声明并初始化,并用作用域操作符来指明所属的类。
//局部静态变量的生存期域程序的运行时间相同
//count仍然是局部变量,可以看成是所有Point对象共享的一般变量。
//所以局部变量用于统计对象个数等类似的功能。
//举例
#include <iostream>
using namespace std;
class Point {
private:
int x, y;
static int count; //静态数据成员声明
public:
Point(int x = 0, int y = 0) : x(x), y(y) {
count++; //每次创建对象都会自动调用构造函数,总数加一
} //构造函数
~Point() {
count--; //对象消退的时候会自动调用析构函数,总数减一
} //析构函数
int getX() {return x;}
int getY() {return y;}
void addCoutn() {count++;}
void showCount() {
cout << "count = " << cout << endl;
}
};
int Point :: count = 0; //在类的外面进行定义和初始化
int main() {
Point a(4, 5); //定义对象a,自动调用构造函数,count+1
cout << "Point a:" << a.getX() << "," << a.getY();
a.showCount();
Point b;
cout << "Point b:" << b.getX << "," << b.getY();
b.showCount();
return 0;
}
2、静态成员函数
#include <iostream>
using namespace std;
class Point {
private:
int x, y;
static int count;
public:
Point(int x = 0, int y = 0) : x(x), y(y) {
count++;
}
Point(Point &p) {
x = p.x;
y = p.y;
count++; //复制构造函数里面本来没有的,但是我们最好自己加上,因为调用这个函数时,系统会创建一个临时对象,所以要个数加一。当撤销时,又会调用析构函数把临时内存撤销掉,所以析构函数需要有一个个数减一
}
//这是一个复制构造函数。
static void showCount() {
cout << "Count:" << count << endl;
}
};
调用时:Point :: showCount();
//静态函数中只能包含静态变量(存储在静态存储区),因为静态变量会在main函数之前就分配内存,此时对象还没有。而私有属性只在对象建立时分配内存。也就是说这个静态函数中不能有x或y
//复制构造函数
//1、定义一个对象时,以本类另一个对象作为初始值
Point a(10, 20)
Point b = a; //当这种语句出现时,会自动调用复制构造函数,用a来初始化b,比粗在创建b的同时赋值,不能分开写。
//2、传参
void fun1(Point p) {
cout << p.getX() << endl;
}
//调用语句: fun1(b);
//3、函数值返回
Point fun2() {
return Point(1, 2);
}
//调用语句: b = fun2();