静态成员
静态成员变量/属性
用关键字 static 修饰的成员变量/属性,称之为静态成员变量/属性
静态成员变量属于类,而不是属于某个具体的对象,某个类创建了多个对象,这个静态成员变量也只有一份数据,
属于类,多个对象共享它
静态成员变量使用前要进行初始化操作,初始化操作只能在类外进行。
类型 类名::静态成员变量名 = 初始值;
不仅可以用对象名进行访问,还可以使用类名对其进行访问
在类定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数属于整个类,是该类所有对象共享的成员函数,而不属于类中的某个对象。静态成员函数的作用不是为了对象之间的沟通,而是为了处理静态数据成员。定义静态成员函数的格式如下:
static 返回类型 静态成员函数名(参数表);
与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:
类名::静态成员函数名(实参表);
对象.静态成员函数名(实参表);
对象指针->静态成员函数名(实参表);
下面对静态成员函数的使用再做几点说明:
1、一般情况下,静态函数成员主要用来访问静态成员函数。当它与静态数据成员一起使用时,达到了对同一个类中对象之间共享数据的目的。
2、私有静态成员函数不能被类外部的函数和对象访问。
3、使用静态成员函数的一个原因是,可以用它在建立任何对象之前调用静态成员函数,以处理静态数据成员,这是普通成员函数不能实现的功能
4、编译系统将静态成员函数限定为内部连接,也就是说,与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这是使用静态成员函数的另一个原因。
5、静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公有的静态成员函数,使用如下格式较好:类名::静态成员函数名()
#include <iostream>
using namespace std;
class Student {
public:
Student(int m_id1, int score1);
int get_count();
static void set_count(void);
private:
int m_id;
int score;
static int count;
};
int Student::count = 0;
Student::Student(int m_id1, int score1) : m_id{m_id1}, score{score1} {
count++;
}
int Student::get_count() {
return count;
}
/* 不要用static */
void Student::set_count(void) {
count = 99;
}
int main() {
Student stu1{1, 99};
Student stu2{2, 100};
stu1.set_count();
Student::set_count();
cout << stu1.get_count() << endl;
cout << stu2.get_count() << endl;
return 0;
};
1,静态成员函数没有 this指针
静态成员函数中可以访问非静态成员变量吗?
不可以,因为对非静态成员变量的访问是通过this指针实现的,而静态成员函数中没有this指针
静态成员函数中可以访问非静态成员函数吗?
不可以,因为没有this指针,而非静态成员函数需要一个this指针作为参数
只能调用静态成员函数
静态成员函数中可以访问静态成员变量吗?
可以,因为静态成员变量是属于类,不需要通过this指针去访问
2,静态成员函数可以声明为常函数吗?
不可以
const 本质修饰的是 this形参,而静态成员函数没有this
3,和静态成员变量一样,可以通过对象名和类名访问
对象名.静态函数名(参数);
类名::静态函数名(参数);
常成员
如果在说明对象时用const修饰,则被说明的对象为常对象。常对象中的数据成员为常量且必须要有初值。
类名 const 对象名[(参数表)];
const Student stu(18, 29);
类的数据成员可以是常量或常引用,使用const说明的数据成员称为常数据成员。如果在一个类中说明了常数据成员,那么构造函数就只能通过成员初始化列表对该数据成员进行初始化,而任何其他函数都不能对该成员赋值。
class Date{
private:
const int year;
int month;
int day;
public:
Date(int y, int m, int d) : year(y), month(m), day(d) {
}
};
常成员函数
类型 函数名(参数表) const;
const是函数类型的一个组成部分,因此在声明函数和定义函数时都要有关键字const。在调用时不必加const。
class Date{
private:
int year;
int month;
int day;
public:
Date(int y, int m, int d) : year(y), month(m), day(d){
}
void showDate();
void showDate() const;
};
void Date::showDate() {
//···
}
void Date::showDate() const {
//···
}
关键字const可以被用于对重载函数进行区分。(const修饰this指针)
说明:
- 常成员函数可以访问常数据成员,也可以访问普通数据成员。
- 常对象只能调用它的常成员对象,而不能调用普通成员函数。常成员函数是常对象唯一的对外接口。
- 常对象函数不能更新对象的数据成员,也不能调用该类的普通成员函数,这就保证了在常成员函数中绝不会更新数据成员的值。