37.【C/C++ 静态数据成员和静态成员函数 (超详解)】

简介: 37.【C/C++ 静态数据成员和静态成员函数 (超详解)】

(一)、什么是静态函数?

c语言中static的语义

1.static变量

static变量:1).

局部a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。

b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。

static变量:2).

全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它

2.static函数(也叫内部函数)

只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含堆,不要弄混。

(二)、静态数据成员

1.空间分配和释放

(2)静态数据成员不随对象的建立而分配空间,也不随对象的撤销而释放(一般数据成员是在对象建立时分配空间,在对象撤销时释放)。静态数据成员是在程序编译时被分配空间的,至程序结束时才释放空间

2.静态数据成员初始化

(3)静态数据成员可以初始化,但只能在类体外进行初始化

注意:静态数据成员不能用参数初始化表对其初始化

在类内初始化必须前面加一个const static int

在类内,只有常量静态数据才能在类内初始化

#include <iostream>
using namespace std;
class Student
{
public:
  const static int score=3;
  int age;
  int number;
  Student(int a, int nu) :age(a), number(nu) {}
  Student() {}
  void set()
  {
    cout << "请输入学生的年龄和学号" << endl;
    cin >> age >> number;
  }
  static void show()
  {
    cout << score<< endl;
  }
};
int main()
{
  Student::show();
  return 0;
}
效果展示:

如在定义Box类中这样定义构造函数是错误的:Box(inth,int w,int len):height(h){}

【初始化列表案列】

【静态数据成员不能再类内初始化案列】

【静态数据成员在类外初始化】

#include <iostream>
using namespace std;
class A
{
private:
 static int number;
public:
 A() {}
 A(int n)
 {
  number = n;
 }
 void show()
 {
  cout << "number的值为:" << number << endl;
 }
};
int A::number = 3;
int main()
{
 A a;
 a.show();
}

3.静态数据成员的访问

(4)静态数据成员可以通过对象名引用,也可以通过类名引用。

代码展示:
#include <iostream>
using namespace std;
class Student
{
public:
  const static int score = 3;
  int age;
  int number;
  Student(int a, int nu) :age(a), number(nu) {}
  Student() {}
  void set()
  {
    cout << "请输入学生的年龄和学号" << endl;
    cin >> age >> number;
  }
  static void show()
  {
    cout << score << endl;
  }
};
int main()
{
  Student s;
  cout << Student::score << endl;    //类名
  cout << s.score << endl;          //类对象
  Student::show();
  return 0;
}
效果展示:

(四)、静态成员函数的初始化

1.注意事项

(1)类的静态成员函数只能访问类的静态数据成员,而不能访问类中的普通函数成员(非静态数据成 员),因为普通数据成员只有类的对象存在时才有意义。(2)静态成员函数与类相联系,而不与类的对象相联系,所以,在类的外部调用类中的公有静态成员 函数,必须在其左面加上“类名::”,而不是通过对象名调用公有静态成员函数。在类的外 部不能调用类中的私有静态成员函数。

2.访问格式:

类名::静态成员函数

代码展示:
#include <iostream>
using namespace std;
class Student
{
public:
  int age;
 int number;
 Student(int a, int nu) :age(a), number(nu) {}
 Student() {}
  void set()
 {
  cout << "请输入学生的年龄和学号" << endl;
  cin >> age >> number;
 }
 static void show()
 {
  cout << "学生的年龄为:" << " " << "学号为:" << endl;
 }
};
int main()
{
 Student::show();
 return 0;
}
效果展示:

如有未解问题,可联系博主。


相关文章
|
5天前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
5天前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
5天前
|
编译器 C++
【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)
📚 C++ 知识点概览:探索类的`static`成员、友元及应用🔍。
|
5天前
|
算法 C++ 容器
|
5天前
|
存储 编译器 程序员
|
2天前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
36 9
|
5天前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
5天前
|
C++
C++】string类的使用③(修改器Modifiers)
这篇博客探讨了C++ STL中`string`类的修改器和非成员函数重载。文章介绍了`operator+=`用于在字符串末尾追加内容,并展示了不同重载形式。`append`函数提供了更多追加选项,包括子串、字符数组、单个字符等。`push_back`和`pop_back`分别用于在末尾添加和移除一个字符。`assign`用于替换字符串内容,而`insert`允许在任意位置插入字符串或字符。最后,`erase`函数用于删除字符串中的部分内容。每个函数都配以代码示例和说明。