[分享]C++基础十一-类的特殊成员

Posted 足球中国

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[分享]C++基础十一-类的特殊成员相关的知识,希望对你有一定的参考价值。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

#include <iostream>

using namespace std;

class CStudent

{

public:

    CStudent(int nID, char* szName, double nScore);

    ~CStudent();

    int GetID() const;

    static int GetTotal();

    void ShowStudent();

private:

    const int m_nID = 0;

    char m_szName[128= 0 };

    double m_nScore = 0;

    static int m_nTotal;

};

int CStudent::m_nTotal = 0;

CStudent::CStudent(int nID = 0, char* szName = (char*)"unknow", double nScore = 0) :m_nID(nID), m_nScore(nScore)

{

    strcpy_s(m_szName, szName);

    m_nTotal++;

}

CStudent::~CStudent()

{

    m_nTotal--;

}

int CStudent::GetID() const

{

    return m_nID;

}

int CStudent::GetTotal()

{

    return m_nTotal;

}

void CStudent::ShowStudent()

{

    cout << "ID=" << m_nID << endl;

    cout << "Name=" << m_szName << endl;

    cout << "Score=" << m_nScore << endl;

    cout << "Total=:" << m_nTotal << endl;

}

int main()

{

    CStudent Student;

    Student.ShowStudent();

    const CStudent StudentA(1, (char*)"xiaobai"90);

    // StudentA->ShowStudent(); 不行

    cout << "ID=" << StudentA.GetID() << endl;

    CStudent* pStudent = new CStudent(2, (char*)"xiaoxin"90);

    pStudent->ShowStudent();

    cout << "GetTotal=" << StudentA.GetTotal() << endl;

    delete pStudent;

    cout << "GetTotal=" << StudentA.GetTotal() << endl;

    return 0;

}

this 指针

this 是C++中的一个关键字,是一个const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。只有当对象被创建后this 才有意义,因此不能在static 成员函数中使用。
this 实际上是成员函数的一个形参,类的对象调用成员函数时,默认传入this 指针,指向调用函数的对象的首地址。不过this 这个形参是隐式的,this 指针会通过ecx寄存器传入,这种调用约定叫做thiscall 调用约定。

静态成员变量

1、静态成员变量是一种特殊的成员变量,它被关键字static 修饰。使用静态成员变量可以实现多个对象共享同一数据。
2、静态成员变量属于类,不属于某个具体的对象,即使创建多个对象,也只为静态成员变量分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了它的值,也会影响到其他对象。
3、静态成员变量必须初始化,而且只能在类体外进行。
4、静态成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在类外初始化时分配。同时,静态成员变量不占用对象的内存,而是在内存分区中的全局数据区分配内存,因此即使不创建对象也可以访问。
5、静态成员变量和普通静态变量一样,在内存分区中的全局数据区分配内存,生命周期到程序结束时才释放。

静态成员函数

静态成员函数的主要目的是访问静态成员。编译器在编译一个普通成员函数时,会隐式地增加一个形参this,并把当前对象的地址赋值给this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数,编译器不会为它增加形参this,不需要当前对象的地址也可以通过类来直接调用。

  • 普通成员函数有this 指针,可以访问类中的任意成员。
  • 静态成员函数没有this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。

const 成员变量

在类中,如果你不希望某些变量被修改,可以使用const 关键字加以限定。初始化const 成员变量只有一种方法,就是通过构造函数的初始化列表。

const 成员函数

1、const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,主要是为了保护数据。
2、const 成员函数也称为常成员函数,常成员函数需要在声明和定义的时候在函数头部的结尾加上const 关键字。
3、通常将get 函数设置为常成员函数。读取成员变量的函数的名字通常以get 开头,后跟成员变量的名字,所以通常将它们称为get 函数。

const 对象

const 也可以用来修饰对象,称为常对象。一旦将对象定义为常对象之后,就只能调用类的const 成员(包括const 成员变量和const 成员函数)。

以上是关于[分享]C++基础十一-类的特殊成员的主要内容,如果未能解决你的问题,请参考以下文章

[分享]C++基础十一-类的特殊成员

[分享]C++基础十一-类的特殊成员

《C#零基础入门之百识百例》(四十一)类的定义和使用 -- 鸡兔同笼

C++知识分享:C++类特殊成员函数

C++知识分享:静态成员变量,你弄懂了吗?

C++ Primer 5th笔记(chap 19 特殊工具与技术)类成员指针