//复制粘贴警告

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函数还没写就直接给我来了一串错误信息,看图

image-20211029204949002

接着又想了一想,在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;

}

image-20211029211030999

大家可以看到,在代码中,获取static数据采用的是静态函数成员,原因来于书中的一句话由于count是为整个类所共有的,不属于任何对象,因此我们自然会希望对count的访问也不要通过对象


以上就是本文的全部内容,如果有错误和不足的地方,还请各位在评论区留言,如果有更好的解决方案还请留下。

ps:我先来指出我代码中的不足,把价格改成浮点数。

posted @ 2021-10-29 21:16  Jezer  阅读(214)  评论(0)    收藏  举报