C++学习笔记4:静态成员和常成员

静态成员

  静态成员变量/属性
        用关键字 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指针)

说明:

  1. 常成员函数可以访问常数据成员,也可以访问普通数据成员。
  2. 常对象只能调用它的常成员对象,而不能调用普通成员函数。常成员函数是常对象唯一的对外接口。
  3. 常对象函数不能更新对象的数据成员,也不能调用该类的普通成员函数,这就保证了在常成员函数中绝不会更新数据成员的值。
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值