一 静态成员变量
大家先来看一段代码:
#include<iostream>
using namespace std;
class Circle {
public:
static int num;//圆的数量
Circle(int x1, int y1, double r1):x(x1), y(y1), r(r1){}
static void setNum(int num1) {
num = num1;
}
private:
int x, y;//圆的坐标
double r;//圆的半径
};
int Circle::num = 0;//静态变量必须在类外部赋值
int main() {
Circle x(0, 0, 2);
x.setNum(1);
cout << &x.num << endl;
cout << &Circle::num << endl;
}
在定义变量时,在最前面加一个static关键字,则该成员变量就被声明为静态变量。那么静态变量有什么特殊之处呢,大家可以看一下上述代码的运行结果:
不难发现,我们通过对象访问该静态成员变量与我们直接通过类访问的变量其地址是一模一样的,这就说明二者实际上是同一个,大家再看一段代码:
#include<iostream>
using namespace std;
class Circle {
public:
static int num;//圆的数量
Circle(int x1, int y1, double r1):x(x1), y(y1), r(r1){}
static void setNum(int num1) {
num = num1;
}
private:
int x, y;//圆的坐标
double r;//圆的半径
};
int Circle::num = 0;
int main() {
Circle x(0, 0, 2);
x.setNum(1);
cout << "第一次设置静态成员变量:" << endl;
cout << x.num << " " << &x.num << endl;
Circle x1(1, 1, 2);
x1.setNum(2);
cout << "第二次设置静态成员变量:" << endl;
cout << x.num << " " << &x.num << endl;
cout << x1.num << " " << &x1.num << endl;
}
运行结果如下:
我们发现,两个不同的对象二者的静态变量地址也是一样的,改变一个对象的值的同时另一个对象的值也发生了改变。所以静态变量是被所有对象共享的。
二 静态成员函数
大家可以再仔细观察上面代码中的setNum()函数。没错我们定义函数时在最前面加一个static关键字,那么该函数就是静态函数了。使用静态函数时大家要注意:
静态函数中只能访问设置静态变量,静态变量只能被静态函数所访问。这也不能理解,因为静态函数也是被所以成员共享的,如果在其中访问了非静态变量,那么静态函数这么知道只是哪个对象的成员变量呢?只有静态的才是共享的,公共的。
三 常函数
在类中我们通常不直接通过对象访问成员变量,而是通过调用成员函数来获取成员变量的值,因为成员变量通常是被封装起来的不能直接访问,这样用户就不能随意修改成员变量的值保障了安全。那难道用户调用函数就不能修改成员变量的值了吗?这时我们就可以将该函数设置为常函数这样用户就不能修改了。具体的语法时在定义函数时在后面加一个const关键字:
#include<iostream>
using namespace std;
class Circle {
public:
static int num;//圆的数量
Circle(int x1, int y1, double r1):x(x1), y(y1), r(r1){}
static void setNum(int num1) {
num = num1;
}
int getRadius() const {
r += 1;
return r;
}
private:
int x, y;//圆的坐标
double r;//圆的半径
};
int Circle::num = 0;
int main() {
Circle x(0, 0, 2);
cout << x.getRadius() << endl;
}
这里我们定义了一个常函数来获取圆的半径。
四 mutable关键字
相信大家对const都有了充分的了解,而mutable则是const的对立面,意为可变的,它有什么用呢,还记得常函数吗?在常函数中我们不能修改成员变量,可是一旦我们将一个成员变量设置为mutable,那么它就可以在常函数中被修改。
#include<iostream>
using namespace std;
class Circle {
public:
static int num;//圆的数量
Circle(int x1, int y1, double r1):x(x1), y(y1), r(r1){}
static void setNum(int num1) {
num = num1;
}
int getRadius() const {
r += 1;
return r;
}
private:
int x, y;//圆的坐标
mutable double r;//圆的半径
};
int Circle::num = 0;
int main() {
Circle x(0, 0, 2);
cout << x.getRadius() << endl;
}
运行代码,结果输出为3;
至此今天的内容就到这里,之后还会更新C++面向对象后续内容,希望能帮助到大家,希望大家多多支持!