【C++】类和对象的知识点--2

简介: 【C++】类和对象的知识点--2

【C++】类和对象的知识点--1 https://developer.aliyun.com/article/1424620

二,static静态成员

概念:


       声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数。


注意:


       1,静态成员也是类的成员,受public、protected、private访问限定符的限制。


       2,静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区,可用sizeof关键字进行查看。


class Date1 //占12个字节
{
    int _year;
    int _month;
    int _day;
    static int _a;
};
class Date2 //占16个字节
{
    int _year;
    int _month;
    int _day;
    int _a;
};


       3,静态成员变量必须在类外进行初始化和定义,定义时不添加static关键字,类中只是声明。因为静态成员没有存储在类中,存储在静态区中,不能对其进行类中的操作。

class Date1
{
public:
    Date1(int year = 2023, int month = 10, int day = 16)
        : _year(year)
        , _month(month)
        , _day(day)
        //, _a(2)错误,因为静态成员变量没有存储在类中
    {     }
    int _year;
    int _month;
    int _day;
    static int _a;
};
int Date1::_a = 5;//对静态成员变量进行初始化

       4,类静态成员即可用类名::静态成员或者对象.静态成员来访问,但这两种方法访问的权限必须为公有。用类的成员函数也可间接访问,这种方法可间接的在类外访问私有权限的成员。


#include <iostream>
using namespace std;
class Date1
{
public:
  Date1(int year = 2023, int month = 10, int day = 16)
  : _year(year)
  , _month(month)
  , _day(day)
  {       }
  int GetData() {
  return _a;
  }
  int _year;
  int _month;
  int _day;
  static int _a;
};
int Date1::_a = 5;
int main()
{
  Date1 d1;
  cout << d1._a << endl;//权限必须公有
  cout << Date1::_a << endl;//权限必须公有
  cout << d1.GetData() << endl;//即使权限私有也可访问
  return 0;
}

       5,静态成员函数没有隐藏的this指针,不能访问任何非静态成员,但可以访问静态成员,因为访问类中非静态成员需要this指针来 “指引” ,而静态成员存储在静态区中,可以随时访问。


class Date1
{
public:
    Date1(int year = 2023, int month = 10, int day = 16)
        : _year(year)
        , _month(month)
        , _day(day)
    {       }
    static int GetData()
    {
        //return _year;//没有this指针,找不到此对象
        return _a;//_a为静态成员,不在类中,可以访问
    }
    int _year;
    int _month;
    int _day;
    static int _a;
};

       这里要说明的是静态成员函数不可以调用非静态成员函数,但非静态成员函数可以调用类的静态成员函数。静态成员函数由于没有this指针,不能访问类中成员,静态成员函数跟静态成员变量一样,都存储在静态区中,所以可以任意访问。


【C++】类和对象的知识点--3https://developer.aliyun.com/article/1424627?spm=a2c6h.13148508.setting.24.214f4f0eqBSn46

相关文章
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1