听说室友静态成员变量不知道它的作用,也听说室友const也不咋会。我反手写了这篇学习笔记。类中的数据成员不仅有int和char,而且要描述很多复杂情况,类中的数据成员可能需要在多个对象共享,也可能在对象中只进行读取不能修改。那么本博文就是讲解两种:1、用来共享数据类型的static,2、用来进行读取却不能修改的const
1、用static修饰数据成员
如果制定特定的数据在内存中,而且能够被一个类的所有成员所共享,比如设计学生类时,可以定一个属性用于统计学生的总人数。使用静态数据成员可以实现类中多个对象的数据共享和交互,静态数据成员的值对每个对象都一样,并且可以更新。只要对静态数据成员的值进行更新,所有对象都会取到更新后的值。 C++中将使用static修饰的数据成员称为静态成员,具体定义形式如下所示:
static 类型标识符 静态数据成员名称;
对于静态数据成员来说,若其被声明具有public属性,则与普通的public数据成员类似,可以通过对象在类外完成访问,访问形式如下所示:
对象.公有静态数据成员 = xx;
然而由于静态数据成员不属于任何对象,访问静态数据成员有其独特的方式,可以通过类名直接对它进行访问,而无需通过类对象,并且通常采用这种方式,访问形式如下:
类名::静态数据成员名
若想对静态数据成员进行初始化,需要在类外通过“类名::静态数据成员=初值”的方法提供初值,初始化形式如下所示:
类名::静态数据成员=初值;
1.1 案例–创建学生类计人数
#include<iostream>
#include<cstring>
using namespace std;
class Date{
public:
Date(int y,int m,int d);
Date(Date &con_date);
private:
int m_nYear,m_nMonth,m_nDay;
};
Date::Date(int y,int m,int d):m_nYear(y),m_nMonth(m),m_nDay(d) {
cout << "Date constructor!" << endl;
}
Date::Date(Date &con_date) {
m_nYear = con_date.m_nYear;
m_nMonth = con_date.m_nMonth;
m_nDay = con_date.m_nDay;
}
class Student {
public:
static int s_nTotalNum;
Student(char *con_name,int con_id,Date&con_birthday);
~Student();
private:
char m_gName[20];
int m_nID;
Date m_iBirthday;
};
Student::Student(char *con_name,int con_id, Date &con_birthday): m_iBirthday(con_birthday) {
int namelen = strlen(con_name) + 1;
strcpy_s(m_gName,namelen,con_name);
m_nID = con_id;
s_nTotalNum++;
}
Student::~Student()
{
s_nTotalNum--;
cout << "destructor,totalnum = " << s_nTotalNum << endl;
if(s_nTotalNum == 0)
system("pause");
}
int Student::s_nTotalNum = 0;
int main()
{
Date tombirthday(1998, 5, 20);
Student std_tom("Tom",1,tombirthday);
cout << "Tom,the totalnum = " << std_tom.s_nTotalNum << endl;
Date paulbirthday(1998, 4, 12);
Student std_paul("paul",2,tombirthday);
cout << "Paul, the totalnum = " << std_paul.s_nTotalNum << endl;
return 0;
main函数创建两个对象,运行结果显示每创建一个对象s_nTotalNum增加1,若有一个对象的生命结束则静态数据成员减1.
2、 用const修饰数据成员
有时候希望类中的数据成员在对象使用中不被改变,可以把这样的成员定义为常数据成员,比如定义一个表示圆形的类,类中会用到圆周率的PI值,常见形式如下:
class 类名
{
const 数据类型 数据成员;
};
常数据成员必须进行初始化并且不能被更新呢,普通数据成员可以在构造函数中通过初始化表或函数内的赋值语句给出初值,若想对常数据成员进行初始化只能通过初始化表完成,不能在构造函数内部进行赋值。常数据成员的初始化方法如下所示:
类名:: 类名(形参列表):常数据成员1(值),常数据成员2(值){
构造函数体
}
2,1 利用const计算圆的面积
#include<iostream>
using namespace std;
class Circle {
public:
Circle(double con_radius);
double circumference();
private:
double m_fRadius;
const double PI;
};
Circle::Circle(double con_radius):PI(3.14){
m_fRadius = con_radius;
}
double Circle::circumference() {
return 2 * PI * m_fRadius;
}
int main()
{
Circle c1(2);
cout << "circumference:" << c1.circumference() << endl;
system("pause");
return 0;
}
代码比较常规,在初始化表中进行常量的初始化,然后按照常规的思路进行计算,最后打印得出结果。
3、总结
本博文以描述不同复杂情况,提出static和const。static一般是多个对象共享同一个内存,多用于构造函数进行初始化,析构函数进行析构,而const必须进行初始化,初始化不能在函数内部赋值,基本上在定义表赋值。例子比较通俗。有需要的当然可以收藏。
|