C++静态函数成员的打开方式
一切的一切都来自C++实验作业的一道题目,话不多说,直接上题
设计一个书本销售类BookSale,包括no(编号)、name(书名)和price(价格)数据成员外,还有个静态变量num,存放卖出的书本数量,另有普通成员函数disp(),用于输出数据成员的值,另有一个静态成员函数sum(),它用于计算已卖出总金额。
乍一看,有手就行,二话不说直接敲代码
#include <iostream>
using namespace std;
class BookSale {
private:
int no;
string name;
int price;
static int num;
public:
BookSale(int no, string name, int price) :no(no), name(name), price(price){
num += 1;
}
void disp() {
cout << "编号:" << no << endl;
cout << "书名:" << name << endl;
cout << "价格:" << price << endl;
}
static int sum() {
return num * price;
}
};
int BookSale::num = 0;
好家伙main函数还没写就直接给我来了一串错误信息,看图

接着又想了一想,在price前加个this会咋样,又报错
“this”只能用于非静态成员函数内部
既然如此,索性就将价格直接传进去,不调用自身数据成员
#include <iostream>
using namespace std;
class BookSale {
private:
int no;
string name;
int price;
static int num;
public:
BookSale(int no, string name, int price) :no(no), name(name), price(price) {
num += 1;
}
void disp() {
cout << "编号:" << no << endl;
cout << "书名:" << name << endl;
cout << "价格:" << price << endl;
}
static int sum(int price) {
return num * price;
}
};
int BookSale::num = 0;
int main() {
BookSale a(1, "C++语言程序设计", 50);
BookSale b(2, "C++语言程序设计", 50);
a.disp();
b.disp();
cout << BookSale::sum(50);
return 0;
}
但是,这里我们可以看到,如果第二本书的价格换成90,那么这些代码是不是有些“智障”呢,兄弟萌,绷不住了,如果这是一个应用程序,该举报了!
int main() {
BookSale a(1, "C++语言程序设计", 50);
BookSale b(2, "C++语言程序设计", 90);
a.disp();
b.disp();
cout << BookSale::sum(50);
return 0;
}
考虑到这点,我打开教材,重点来了
静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态成员,必须通过对象名
看完这里,感觉豁然开朗,但还没完
静态函数成员可以直接通过类名调用函数输出
也就是说,静态数据和静态函数会一直存在于这个类中,随着对象的新建,这些数据会被“复制”(不知用词是否准确)那个对象中,对象使用结束后,对象本身会被回收,但类中的静态数据并不会消失,会一直保存和更新,其存储形式让我想到了堆栈。这不去复习一波堆栈!
接着对代码进行了调整,可能有点偏离了题目,但是这是我能想到的最佳解决方案。
#include <iostream>
using namespace std;
class BookSale {
private:
int no;
string name;
int price;
static int num;
static int sum;
public:
BookSale(int no, string name, int price) :no(no), name(name), price(price) {
num += 1;
sum += price;
}
void disp() {
cout << "编号:" << no << endl;
cout << "书名:" << name << endl;
cout << "价格:" << price << endl;
}
static int getSum(){
return sum;
}
static int getNum(){
return num;
}
};
int BookSale::num = 0;
int BookSale::sum = 0;
int main() {
BookSale a(1, "C++语言程序设计", 50);
BookSale b(2, "C++语言程序设计", 90);
a.disp();
b.disp();
cout <<"已卖出总金额:" << BookSale::getSum() << endl;
cout <<"已卖出总数:" << BookSale::getNum() << endl;
return 0;
}

大家可以看到,在代码中,获取static数据采用的是静态函数成员,原因来于书中的一句话由于count是为整个类所共有的,不属于任何对象,因此我们自然会希望对count的访问也不要通过对象
以上就是本文的全部内容,如果有错误和不足的地方,还请各位在评论区留言,如果有更好的解决方案还请留下。
ps:我先来指出我代码中的不足,把价格改成浮点数。

浙公网安备 33010602011771号