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;
}
效果展示:

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


相关文章
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
280 0
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
963 6
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
439 5
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
544 12
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
455 0
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
282 16
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。