首页 > 编程语言 >c++ static const

c++ static const

时间:2024-05-29 18:13:44浏览次数:15  
标签:静态数据 初始化 const 函数 静态 成员 c++ 对象 static

 

 

=============

==================

首先得知道为什么要使用静态数据成员:


在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。

使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。

静态数据成员的使用方法和注意事项如下:

1、静态数据成员在定义或说明时前面加关键字static。

2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:
<数据类型><类名>::<静态数据成员名>=<值>

这表明:
(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。

(2) 初始化时不加该成员的访问权限控制符private,public等。

(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。

3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。

4、引用静态数据成员时,采用如下格式:

<类名>::<静态成员名>

 

为什么不能在静态成员函数中使用非静态变量:

程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。

因为静态是针对类的,而成员变量为对象所有。

静态成员函数不属于任何一个类对象,没有this指针,而非静态成员必须随类对象的产生而产生,所以静态成员函数”看不见”非静态成员,自然也就不能访问了

类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。

C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数不接受隐含的this自变量。所以,它就无法访问自己类的非静态成员。

 

静态成员函数

静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。

在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。下面通过例子来说明这一点。

#include <iostream>
using namespace std;
class M{
public:
M(int a){
this->A=a;
this->B=this->B+a;
}
static void f1(M m);
private:
int A;
static int B;
};
int M::B=0;//静态数据成员初始化的格式<数据类型><类名>::<静态数据成员名>=<值>,z初始化在外部实现
void M::f1(M m){
cout<<"A="<<m.A<<endl;静态成员函数中通过对象来引用非静态成员
cout<<"B="<<B<<endl;
}
int main()
{
M P(5);
M Q(10);
M::f1(P);静态成员函数调用时不用对象名
return 0;
}
从中可看出,调用静态成员函数使用如下格式:

<类名>::<静态成员函数名>(<参数表>);

运行结果:

A=5

B=15


————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_42145502/article/details/106963659

===================

 

参考:

 

标签:静态数据,初始化,const,函数,静态,成员,c++,对象,static
From: https://www.cnblogs.com/rebrobot/p/18220838

相关文章

  • C++ 跨线程 传递指针
    目录在C++中跨线程传递指针时,需要注意线程安全和生命周期管理的问题。以下是一些常见的方法,用于在C++中安全地跨线程传递指针:使用智能指针和线程安全队列结合使用std::shared_ptr和线程安全的队列(如std::queue配合互斥锁)是一种常见的方法。#include<iostream>#include<t......
  • C++:虚表指针、虚表、虚函数和动态多态
    classBase{public:virtualvoidshow(){std::cout<<"Baseshow"<<std::endl;}};classDerived_1:publicBase{public:voidshow()override{std::cout<<"Derivedshow"<<std::endl;}};class......
  • C++ 线程同步condition_variable的使用
    一,condition_variable使用步骤创建一个scondition_variable对象。创建一个互斥量对象mutex。创建两个线程:等待线程和唤醒线程。在等待线程中,使用unique_lock锁定互斥量,并调用wait函数进入等待状态。在唤醒线程lock_guard锁定互斥量,并调用notify_one或notify_all函数唤醒等......
  • C++ std::function和std::bind的六种用法总结
    一,使用funciton和bind的六种方法1,使用function接收普通函数2,使用function接收lambda函数3,使用function函数来接收函数对象4,使用bind函数绑定类中的一般函数5,使用bind函数绑定类中的多态函数6,使用function来实现回调。二,代码实现直接看代码和注释:#include<iostream>#......
  • C++语言实现身份证实名认证、身份证上的文字识别接口
    实名认证是什么意思呢?一般指的是对用户资料真实性进行的验证审核,这样有利于建立完善且可靠的互联网环境。如果交易双方使用的都是虚假信息,那么在诸多环节会存在很大的风险。另外,还有游戏平台对玩家进行实名认证,防止未成年人注册。翔云身份证实名认证接口,通过核验身份证二......
  • C++语言实现发票查验功能、医疗票据查验、财政票据识别
    封账结算是个苦活、累活,在账务干过的人都知道,就连发票都要一张一张的录,一张一张的审,结一次账、扒一层皮,就累得人仰马翻。除此之外,在临近春节的这个时期,账务部门的小伙伴们,只能眼巴巴地看着别人抢票,在财务报告初稿没有正式提交给审计师前,没人敢提前预定回家的票,甚至都不确定是......
  • Ubuntu下的onnxruntime(c++)编译 转载文章 非原创
    仓库下载gitclone--depth=1--branchv1.12.1https://github.com.cnpmjs.org/microsoft/onnxruntime.git注意:需要更换国内镜像源编译GPU./build.sh--skip_tests--use_cuda--configRelease--build_shared_lib--parallel--cuda_home/usr/local/cuda-11.3--cudnn_home/u......
  • C++中以类的成员函数作为Windows callback函数需要设置成static函数
    在看代码时,发现很多CALLBACK函数,所以仔细研究了一下C++中的CALLBACK函数首先,我们来理解一下,什么是C++中的CALLBACK函数 =>凡是由你设计,但是由Windows操作系统调用的函数,我们把它统称为CALLBACK函数,这些函数都有一定的类型,以方便配合Windows的调用动作某些WindowsAPI函数会要......
  • c++ 构造函数
     =================1.简介子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递。如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数。classBase{public: Base(intv):_value(v),_c(‘0’){} Base(cha......
  • QT C++实现表头添加组件
    QTableWidget在表头添加组件QTableWidget的表头有一个类QHeaderView是专门处理表头的类,要在表头添加一个类似QCheckBox的组件需要重写一个类并继承QHeaderView。QTableWidget中添加复选框并实现全选居中:自定义类MyHeaderView并继承QHeaderView自定义类MyTableWidget并继承QTa......