首页 > 编程语言 >C++类的静态成员

C++类的静态成员

时间:2023-12-13 16:00:50浏览次数:32  
标签:初始化 静态 成员 C++ int static Print

C++类的静态成员

声明并使用静态成员

使用static关键字将其与类关联在一块,同样,static声明的对象也可以声明访问权限public,private

注意,类的静态成员存在于任何对象之外,对象中不包含任何与静态数据有关的数据,就是说类中声明的静态成员是独立于类而存在的,只是和类相关联(这里的独立并不是完全的独立,静态成员还是类中的成员),只存在唯一的该静态成员对象,但其可被所有的类对象共享。

所以声明的静态成员函数是可以直接通过类来直接调用的,无需创建一个类对象来调用。
还有一点,static声明的静态成员是不包含this指针的(包括隐式的this指针),所以静态成员函数是无法调用类中的非静态成员或函数的

接下来举一个例子

#include<iostream>

class Print {
private:
	int a = 10;
	static constexpr int b = 20; //这里的constexpr接下来将要说明它的作用,这里是用于静态成员的类内初始化
public:
	static void show() {
    //std::cout << a << std::endl; //这里将导致错误,因为对于静态成员函数无法调用类中的非静态成员
		std::cout << b << std::endl;
	}
};

int main(void) {
	Print::show(); //可以直接通过类来调用一个静态成员函数,而无需通过一个类对象来完成
	return 0;
}

定义静态成员及其初始化

同样,我们也可以在类的外部定义一个静态成员变量,但当我们在外部定义时,不可以重复static关键字,其只能出现在类内的静态成员函数声明中

void Print::show() {
	std::cout << b << std::endl;
}//类外定义静态成员函数时省略了static关键字
因为静态数据成员不属于类的任何一个对象,所以它们并不是由类的构造函数进行初始化的,
一般来说,我们不能在类的内部初始化静态成员,且一个静态成员不可重定义

所以我们一般在类外初始化一个静态成员,如下例:

#include<iostream>

class Print {
private:
	int a = 10;
	static  int b;
public:
	static void show();
};
int Print::b = 20;

void Print::show() {
	std::cout << b << std::endl;
}

int main(void) {
	Print::show();
	return 0;
}

注意,这里虽然b是属于类中的一个私有成员,但依然可以使用它,并对其进行初始化,这里的引用方法与之前的静态成员函数相同,可以直接通过类来进行访问

静态成员的类内初始化

我们可以为静态成员提供const整数类型的类内初始值,这里要求静态成员必须是字面值常量类型(constexpr)

#include<iostream>

class Print {
private:
	int a = 10;
	static constexpr int b = 20; //这里的constexpr声明了b是一个字面值常量类型,从而可以被一个const值进行类内初始化
public:
	static void show() {
    //std::cout << a << std::endl; //这里将导致错误,因为对于静态成员函数无法调用类中的非静态成员
		std::cout << b << std::endl;
	}
};

一般建议对类中的静态成员进行类外初始化,而不是进行类内初始化

适用于静态成员的情况

静态成员可以是一个不完全类型

静态变量可以是一个不完全类型,所谓不完全类型,就是指在声明时可以不提供其完整定义而只是提供一个声明,一般用于创建指向该类型的指针或引用,或者用于声明函数的参数或返回类型,但只有当其拥有完整定义时,才可以进行实例化操作

#include<iostream>

class Print {
public:
	//
private:
	static Print exam1; //static修饰的静态成员可以是一个不完全类型
	Print* exam2; //指针类型也可以是一个不完全类型
	//Print exam3; //普通的数据成员不可以是不完全类型
};

静态成员可以作为默认实参

默认实参,其具体值在编译时就已经确定,而非静态数据成员是在声明编译完成后调用构造函数进行初始化,所以非静态数据成员无法用于默认实参

class Print {

private:
	static int a;
	int b = 20;
public:
	int show(int value = a) { //正确,a为静态数据成员,可以用于默认实参的构造
		return a;
	}
	int err_show(int value = b) { //错误,因为b是非静态数据成员,而非静态数据成员无法用于默认实参的构造
		return b;
	}
};

int Print::a = 10;

标签:初始化,静态,成员,C++,int,static,Print
From: https://blog.51cto.com/u_16271511/8803832

相关文章

  • C++堆——heap与二叉树和python
    数据结构栈-->stack队列-->queue树-->tree堆-->heap散列-->hash图-->graph图结构一般包括顶点和边邻接矩阵DAG,DirectedAcyclicGraph即「有向无环图」树树(Tree)是一种非线性的数据结构,由n个节点组成,其中每个节点都有零个或多个子节点。......
  • C++ Templates 第2版 电子书 pdf
    关注公众号:红宸笑。回复:电子书即可  本书是同名经典畅销图书的全新升级版本,针对C++11、C++14、C++17标准进行了全面更新,并对所有的新语言特性(包括可变参数模板、通用lambda、类模板参数推导等)进行了解释。全书共28章。首先全面介绍了本书的内容结构和相关情况。第1部分(......
  • C++基础 -5- 动态内存分配
    ———————动态内存分配——————— ......
  • C++ Qt开发:RadioButton单选框分组组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QRadioButton单选框组件以及与之交互的QButtonGroup类的常用方法及灵活运用。QRadioButton是Qt框......
  • Java第八课_构造和静态
    2.面向对象的编程构造publicclassPractice{publicstaticvoidmain(String[]args){Personperson1=newPerson();Personperson2=newPerson("lisi");Personperson3=newPerson("哪吒",3);}}publicclass......
  • C++类中的友元
    声明关键字template<classT>friendTT_Name//这里的T表示声明的类型,T_Name表示类型名称友元声明的作用在一个类中,如果某个成员被private修饰而封装起来,对于外部的函数是无法访问到该成员信息的但如果对外部访问函数进行友元修饰,函数就可以对类中的封装成员进行访问#include<ios......
  • c++ 多线程
    https://blog.csdn.net/sjc_0910/article/details/118861539unique_lock和lock_guard多线程是一种实现并发处理的有效方式,C++11开始引入了<thread>库,使得多线程编程更加容易和高效。以下是C++中多线程编程的一些主要内容:线程的创建:在C++中,可以使用std::thread类来创建一......
  • 使用C++和QT实现Log自定义日志系统
    MyLog说明使用QT的qInstallMessageHandler函数结合qDebug,qInfo实现自定义的日志系统输出日志到文件和控制台自动检测日志文件大小自动更新日志文件修改日期自动备份自动删除一个月前的日志文件支持多线程程序支持扩展,可输出日志到数据库,网络,或服务器支持扩展,可使用co......
  • 关于c++序列化
    对于一个复杂数据对象的存储和装载有很多方式,比如自定义的文本或者2进制格式,以及对应的读取和写入程序。也有一些适应力较强比较通用的方式,文本的有xml和json。尤其是xml文件查看起来比较方便。但是xml的最大问题就是装载和保存都比较慢。装载1个大文件足以把头发等白:)在c++里......
  • C++学习笔记八:极限和数学运算<limits><cmath>
    1)<limits>库:1.1源文档:https://en.cppreference.com/w/cpp/types/numeric_limits#include<limits> 1.2库函数:函数解释:对于一个浮点数,lowest表示最小的可表示的负数,min表示最小的可表示的接近0的数,max表示最大的可表示的正数对于一个有符号整数,min表示可以表示的最小的......