C++从入门到精通——static成员

这篇具有很好参考价值的文章主要介绍了C++从入门到精通——static成员。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言


一、static成员

概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

静态成员是指属于类而不属于类的任何对象的成员。静态成员在类的所有对象之间共享,并且可以在不创建对象的情况下被访问。静态成员包括静态变量和静态方法。

静态变量是类的所有对象之间共享的变量。它们在内存中只有一份拷贝,并且可以直接通过类名访问。静态变量在类的任何对象被创建之前就被初始化,它们的值在所有对象之间是一致的。

静态方法是属于类而不属于任何对象的方法。它们可以直接通过类名调用,而不需要创建类的对象。静态方法通常用于执行与类相关的操作,而不涉及特定对象的状态。

静态成员在类的定义中使用static关键字进行声明。例如,以下是一个使用静态变量和静态方法的示例:

class MyClass {
public:
    static int staticVar; // 静态变量声明
    static void staticMethod(); // 静态方法声明
};

int MyClass::staticVar = 0; // 静态变量定义和初始化

void MyClass::staticMethod() {
    // 静态方法的实现
    cout << "This is a static method." << endl;
}

int main() {
    MyClass::staticVar = 10; // 静态变量的访问
    MyClass::staticMethod(); // 静态方法的调用
    return 0;
}

在上述示例中,静态变量staticVar和静态方法staticMethod属于类MyClass,可以直接通过类名进行访问和调用。

例题

实现一个类,计算程序中创建出了多少个类对象。

class A
{
public:
	A() { ++_scount; }
	A(const A& t) { ++_scount; }
	~A() { --_scount; }
	static int GetACount() { return _scount; }
private:
	static int _scount;
};

int A::_scount = 0;

void TestA()
{
	cout << A::GetACount() << endl;
	A a1, a2;
	A a3(a1);
	cout << A::GetACount() << endl;
}

以上代码定义了一个名为A的类,该类包含一个私有的静态成员变量_scount,一个默认构造函数,一个拷贝构造函数和一个析构函数。在main函数中,调用TestA函数。

TestA函数中,首先调用A::GetACount()函数获取当前A类的对象数量,然后创建了两个A类的对象a1a2,并将a1传递给a3的拷贝构造函数。再次调用A::GetACount()函数获取当前A类的对象数量。

_scount是一个静态成员变量,它在类定义外进行初始化,并在类定义中被声明为私有。该变量用于记录A类的对象数量。默认构造函数和拷贝构造函数都会在对象创建时将_scount自增1,析构函数会在对象销毁时将_scount自减1。

因此,输出结果将显示A类对象的数量。首先是0,因为还没有创建任何A类的对象。然后是3,因为在TestA函数中创建了两个对象(a1a2),并进行了一次拷贝构造(a3)。最后,在TestA函数结束后,对象被销毁,_scount减少到0。

二、 static成员的特性

特性

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受publicprotectedprivate 访问限定符的限制

例题

静态成员函数可以调用非静态成员函数吗

静态成员函数可以调用非静态成员函数,但需要通过对象或者指针来调用。因为非静态成员函数是依赖于具体的对象或者实例的,而静态成员函数是独立于对象或者实例的,所以在静态成员函数中不能直接访问非静态成员变量和非静态成员函数。但可以通过将对象作为参数传递进来或者通过对象指针来调用非静态成员函数。

非静态成员函数可以调用类的静态成员函数吗

非静态成员函数可以调用类的静态成员函数。在非静态成员函数中,可以使用类名和作用域解析操作符(::)来调用静态成员函数。

三、static成员的注意事项

static不能给缺省值

C++从入门到精通——static成员,C++从入门到精通,c++,开发语言,学习方法,github,考研,leetcode,蓝桥杯
在C++中,static关键字用于声明静态成员变量或静态函数。在声明静态成员变量时,不能直接为其设置缺省值。

其中一个原因是缺省值是要走初始化列表的,而static是不会走初始化列表。

除此之外,因为静态成员变量在编译阶段就已经被分配了内存空间(即在静态区),并没有被放置在对象的内存空间中。静态成员变量是属于整个类而不是某个具体对象的,它的生命周期独立于任何对象的创建和销毁。

如果允许为静态成员变量设置缺省值,那么在编译阶段就需要为所有的静态成员变量分配空间并为其赋值。这将引入额外的开销和复杂性,因为静态成员变量的初始值可能会依赖于其他静态成员变量或静态函数的结果。

为了避免这种复杂性和性能开销,C++规定了静态成员变量不能直接设置缺省值。可以在类外部定义静态成员变量,并在类外部进行初始化赋值:

class MyClass {
    static int myStaticVariable;
};

int MyClass::myStaticVariable = 0; // 在类外部进行初始化赋值

需要注意的是,如果不在类外部进行初始化赋值,静态成员变量的初始值将是未定义的。因此,为了保证静态成员变量的可靠性,最好在类外部进行初始化赋值。

static修饰变量和修饰函数的区别

C++中,static关键字可以用于修饰变量和函数,并且在两者之间有一些区别。

静态变量(static variable):

  • 静态变量被存储在静态存储区,其生命周期延长至整个程序的运行期间。
  • 静态变量只在声明它的作用域内可见,不能被其他文件访问。
  • 静态变量的初始化只会在程序第一次进入声明它的作用域时执行一次,并且只能在声明时给定初值。
  • 静态变量的作用域限制在声明它的函数或类中,但它的值在函数调用之间保持保持不变。

静态函数(static function):

  • 静态函数属于类而不是对象,它可以直接通过类名调用,无需创建对象实例。
  • 静态函数没有this指针,因此无法访问非静态成员变量或成员函数。
  • 静态函数只能直接访问静态成员变量或调用其他静态函数。

示例

当我们在C++中定义了一个静态函数后,可以通过以下方式进行调用:

#include <iostream>

class MyClass {
public:
    static void staticFunction() {
        std::cout << "This is a static function." << std::endl;
    }
};

int main() {
    // 通过类名直接调用静态函数
    MyClass::staticFunction();

    return 0;
}

在上面的例子中,我们定义了一个名为MyClass的类,并在该类中声明了一个静态函数staticFunction。在main函数中,我们通过类名MyClass::staticFunction()的方式直接进行调用。

输出结果将会是"This is a static function."

需要注意的是,因为静态函数不依赖于对象实例,所以可以通过类名直接访问。而不需要先创建对象实例。

总结

  • 静态变量的生命周期长,作用域限制在声明它的作用域内,值在函数调用之间保持不变。
  • 静态函数属于类而不是对象,无需创建对象实例,只能访问静态成员变量和调用其他静态函数。

四、练习题

提示:使用本文所提到的静态函数和静态变量来解决

JZ64 求1+2+3+…+n文章来源地址https://www.toymoban.com/news/detail-857774.html


到了这里,关于C++从入门到精通——static成员的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++静态成员(static)

    由static修饰类体中成员,称为类静态成员(static class member)。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公共内存中。静态数据成员被当作该类类型的全局对象。 在类设计中,用static修饰的数据成员为静态数据成员。由该类型实

    2023年04月09日
    浏览(42)
  • C++“static“成员使用

      1.static 成员概念 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。 1.2 static特性 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静

    2024年02月04日
    浏览(49)
  • 【C++入门到精通】C++类型的转换 | static_cast | reinterpret_cast | const_cast | dynamic_cast [ C++入门 ]

    当我们在进行C++编程时,类型转换是一个非常常见的操作。而在C++中,我们有多种类型转换的方式可供选择。其中包括** static_cast 、 reinterpret_cast 、 const_cast 和 dynamic_cast **。这些类型转换操作符能够在不同的场景下帮助我们实现所需的类型转换。本文将详细介绍这些类型转换

    2024年02月22日
    浏览(38)
  • 网络安全|渗透测试入门学习,从零基础入门到精通—渗透中的开发语言

    目录 前面的话 开发语言 1、html 解析 2、JavaScript 用法 3、JAVA   特性 4、PHP 作用 PHP 能做什么? 5、C/C++ 使用 如何学习 关于在渗透中需要学习的语言第一点个人认为就是可以打一下HTML,JS那些基础知识,磨刀不误砍柴工。其次,了解基本的代码后,就可以去学习相关的漏洞知

    2024年02月09日
    浏览(52)
  • C++ | 说说类中的static成员

    【概念】:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为 静态成员变量 ;用static修饰的成员函数,称之为 静态成员函数 。静态成员变量一定要在类外进行初始化 💬 面试题:实现一个类,计算程序中创建出了多少个类对象 上面这个是曾经一家公

    2023年04月24日
    浏览(39)
  • C++:初始化列表,static成员,友元,内部类

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++:初始化列表,static成员,友元,内部类的知识总结。 初始化列表:以冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。 初始化

    2024年02月07日
    浏览(56)
  • 17. C++ static、const 和 static const 类型成员变量声明以及初始化

    1. C++ static、const 和 static const 类型成员变量声明以及初始化 const 定义的常量在超出其作用域之后其空间会被释放; static 定义的静态常量在函数执行后不会释放其存储空间; 1.2 static static 表示的是静态的 类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对

    2024年01月18日
    浏览(60)
  • C++——初始化列表 | explicit关键字 | static成员

    🌸作者简介: 花想云 ,在读本科生一枚,致力于 C/C++、Linux 学习。 🌸 本文收录于 C++系列 ,本专栏主要内容为 C++ 初阶、C++ 进阶、STL 详解等,专为大学生打造全套 C++ 学习教程,持续更新! 🌸 相关专栏推荐: C语言初阶系列 、 C语言进阶系列 、 数据结构与算法 本章我们

    2023年04月11日
    浏览(50)
  • [开发语言][c++]:Static关键字和全局变量

    写在前面: 如果您只是想回顾或了解一下static和全局变量的异同点,那么下面的总结将满足您的需求。 如果您是一位初学者或对二者的使用模棱两可,建议您读完该篇文章,相信这一篇将解答完您对于static以及全局变量的所有疑惑。 如有问题或建议欢迎评论 or 私信

    2024年01月20日
    浏览(58)
  • c++中static静态成员变量和静态成员函数、explcit和隐式类型转换、友元函数()详解

    声明为 static 的类成员 称为 类的静态成员 ,用 static 修饰的 成员变量 ,称之为 静态成员变量 ;用 static 修饰 的 成员函数 ,称之为 静态成员函数 。 静态成员变量一定要在类外进行初始化   静态成员 为 所有类对象所共享 ,不属于某个具体的对象,存放在静态区   静态成

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包