类的静态方法与静态数据成员
什么是类的静态方法?
C++中,若类的方法前加了static关键字,则该方法称为静态方法,反之为实例方法.静态方法为类所有,可以通过对象来使用,也可以通过类来使用.但一般提倡通过类名来使用,因为静态方法只要定义了类,不必建立类的实例就可使用.静态方法只能调用静态变量(静态成员).
要深入理解请看以下代码:
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;
class Car {
public:
Car() {
carCount++;
}
static int getCarCount(){
return carCount;
}
private:
static int carCount;//类的静态数据成员
};
int Car::carCount = 1;
int main(void) {
cout << "汽车总数量为:" << Car::getCarCount() << endl;
Car car1, car2;
cout << "汽车总数量为:" << car1.getCarCount() << endl;
system("pause");
return 0;
}
定义了一个Car类,类内有一个构造函数,一个静态方法getCarCount()和一个静态成员carCount.
class Car {
public:
Car() {
carCount++;
}
static int getCarCount(){
return carCount;
}
private:
static int carCount;//类的静态数据成员
};
静态方法可以通过对象来使用,也可以通过类名来使用.静态方法只能调用静态成员,否则会报错,这是因为普通成员是依托于对象存在的,而静态方法可能通过类名调用.
通过类名调用时使用类名+域操作符(::)+静态方法名
的格式.
int main(void) {
cout << "汽车总数量为:" << Car::getCarCount() << endl;//通过类名使用类的静态方法
Car car1, car2;
cout << "汽车总数量为:" << car1.getCarCount() << endl;//通过对象使用类的静态方法
system("pause");
return 0;
}
同样的,静态数据成员可以通过对象来使用,也可以通过类名来使用.
特点:
1.即使该类没有被实例化(创建对象),该类的静态数据成员也存在.
2.虽然静态数据成员不属于类的某个对象,但是我们仍然可以使用类的对象、引用或指针来访问静态数据成员.
3.无论有多少个对象,这些对象共用这一个静态数据成员.
关于第三点我又写了一段代码让大家理解,请看代码及运行效果:
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;
class Car {
public:
Car() {}
static int getCarCount(){
return carCount;
}
void addCarCount() {
carCount++;
}
private:
static int carCount;//类的静态数据成员
};
int Car::carCount = 0;
int main(void) {
Car car1, car2;
cout << "car1的静态数据成员carCount的值为:" << car1.getCarCount() << endl;
cout << "car2的静态数据成员carCount的值为:" << car2.getCarCount() << endl;
car1.addCarCount();
cout << "car1的静态数据成员carCount的值为:" << car1.getCarCount() << endl;
cout << "car2的静态数据成员carCount的值为:" << car2.getCarCount() << endl;
system("pause");
return 0;
}
文章开始的代码其实还展示了静态数据成员的其中一个作用:统计一个类实例化了多少个对象.
大家都知道创建对象会调用构造函数,那么我们就可以在构造函数里将静态数据成员+1,然后在类外将静态数据成员初始化为0,这样当其他的地方创建了对象,就会调用构造函数,这个静态数据成员就会加一.最后在打印这个成员的值就可以知道到底使用这个类实例化了多少个对象了.
vector容器的坑(push_back)
先说结论:使用push_back向vector容器里添加元素,实际上是值的拷贝
在下面的代码中,我将一个变量用push_back添加进容器,然后改变这个变量的值,看看容器中的值会不会改变.
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;
int main(void) {
int people1=160, people2=180;
vector<int> tall;
tall.push_back(people1);
tall.push_back(people2);
for (int i = 0; i < tall.size(); i++) {
printf("vector容器内第%d个数据为:%d\n", i + 1, tall[i]);
}
cout << "people1的身高为:" << people1 << endl;
cout << "people2的身高为:" << people2 << endl;
people1 += 10;
cout << "people1的身高增加了10" << endl;
for (int i = 0; i < tall.size(); i++) {
printf("vector容器内第%d个数据为:%d\n", i + 1, tall[i]);
}
cout << "people1的身高为:" << people1 << endl;
cout << "people2的身高为:" << people2 << endl;
for (int i = 0; i < tall.size(); i++) {
printf("vector容器内第%d个数据的地址为:%p\n", i+1, &tall[i]);
}
cout << endl;
cout << "people1的地址为:" << &people1 << endl;
cout << "people2的地址为:" << &people2 << endl;
system("pause");
return 0;
}
通过代码以及运行效果可以看出,push_back的实质是拷贝一个变量的值,存入vector容器中,变量值的改变并不会导致容器中的值改变.
最后我打印了两者的地址,可以看出两者的地址确实不一样,并且vector容器逻辑上相邻的数据,在内存上也是相邻的,在这里为sizeof(int),即四个字节.