首页 > 编程语言 >c++ 静态私有成员

c++ 静态私有成员

时间:2024-09-25 15:48:07浏览次数:8  
标签:初始化 变量 访问 私有 成员 c++ 静态

1.概要

1.问题提出

价值:关于静态和私有的问题,静态的且是私有的,有什么价值呢,就是只有在类的函数中可以使用和赋值,这有一个隔离的价值。

矛盾:静态成员必须在类的外部初始化,初始化那就要赋值,赋值就要访问,这和上面视乎矛盾?

2.调查结果

结论:静态私有成员可以在类的外部初始化;

3.相关知识

c++ 常量(const)和静态(static)_c++ static const-CSDN博客

qt 用宏控制静态接口的统一 单件应用_qt宏控制-CSDN博客 

2.内容与试验

1.试验1

1.代码

1.工程结构

2.A头文件
#pragma once
class A
{
public:
	A();
private:
	static int a;
};

3.A源文件
#include "A.h"
#include <iostream>
int A::a = 5;

A::A() {
	std::cout << a;
}
4.入口函数
#include <iostream>
#include "A.h"

int main()
{
    A a;
    
    std::cout << "Hello World!\n";
}

2.运行结果

就是试验这个事,能不能成,结果成功了,证明静态的私有成员可以在类的外部初始化。

3.调查过程

1.c++ 可以创建静态的成员变量吗 

是的,C++ 可以创建静态的成员变量。静态成员变量属于类本身,而不是类的某个具体对象,这意味着所有对象共享同一个静态成员变量。

静态成员变量有以下特性:

  1. 存储位置:静态成员变量存储在类的静态存储区,而不是对象的存储区。
  2. 初始化:静态成员变量必须在类定义外进行初始化,不能在类内直接赋初值(除了inline static C++17及之后的标准中部分情况)。
  3. 访问方式:静态成员变量可以通过类名直接访问,也可以通过对象访问。

以下是一个简单的例子:

#include <iostream>  
  
class MyClass {  
public:  
    static int staticVar;  
  
    void display() {  
        std::cout << "Static Variable: " << staticVar << std::endl;  
    }  
};  
  
// 静态成员变量的初始化  
int MyClass::staticVar = 10;  
  
int main() {  
    MyClass obj1, obj2;  
  
    // 通过对象访问静态成员变量  
    obj1.display();  
  
    // 修改静态成员变量  
    MyClass::staticVar = 20;  
  
    // 通过另一个对象访问静态成员变量  
    obj2.display();  
  
    // 直接通过类名访问静态成员变量  
    std::cout << "Static Variable: " << MyClass::staticVar << std::endl;  
  
    return 0;  
}

输出:

Static Variable: 10  
Static Variable: 20  
Static Variable: 20

在这个例子中,staticVar 是一个静态成员变量,通过 MyClass::staticVar 或对象 obj1 和 obj2 都可以访问和修改它。修改任何一个对象中的静态成员变量,都会影响到所有其他对象以及类本身对该变量的访问。

2. c++ 可以创建静态的私有成员变量吗

是的,C++ 可以创建静态的私有成员变量。静态私有成员变量与静态公有成员变量或静态保护成员变量在存储和初始化方面的特性相同,但它们的访问权限受限于类的内部,即只能被类的成员函数、友元函数或者同一个类的其他静态成员函数访问。

以下是一个包含静态私有成员变量的类的例子:


#include <iostream>  
  
class MyClass {  
private:  
    static int staticPrivateVar;  
  
public:  
    static void initializeStaticPrivateVar(int value) {  
        staticPrivateVar = value;  
    }  
  
    void displayStaticPrivateVar() const {  
        std::cout << "Static Private Variable: " << staticPrivateVar << std::endl;  
    }  
};  
  
// 静态私有成员变量的初始化  
int MyClass::staticPrivateVar = 0;  
  
int main() {  
    MyClass obj1, obj2;  
  
    // 通过类的静态成员函数初始化静态私有成员变量  
    MyClass::initializeStaticPrivateVar(42);  
  
    // 通过对象访问静态私有成员变量(通过类的成员函数)  
    obj1.displayStaticPrivateVar();  
    obj2.displayStaticPrivateVar();  
  
    // 注意:不能直接从类外部访问静态私有成员变量  
    // 下面的代码会导致编译错误  
    // std::cout << MyClass::staticPrivateVar << std::endl;  
  
    return 0;  
}

在这个例子中,staticPrivateVar 是一个静态私有成员变量,它只能通过类的静态成员函数 initializeStaticPrivateVar 或类的非静态成员函数 displayStaticPrivateVar 来访问。在 main 函数中,我们试图直接从类外部访问 staticPrivateVar,这会导致编译错误,因为静态私有成员变量不能被类外部的代码直接访问。

3.静态的私有成员变量可以在类外初始化,但不能在类外访问,那是否意味着,初始化是不受任何限制的,即共有私有的这些属性只控制访问,不控制初始化 

在C++中,静态私有成员变量的初始化确实是在类外进行的,但这并不意味着初始化不受任何限制。初始化本身是一种特殊的操作,它通常在程序启动时或首次使用某个静态变量之前进行。在C++中,静态成员变量的初始化需要遵循一定的规则:

  1. 初始化位置:静态成员变量必须在类定义之外的某个地方进行初始化。这通常是在一个源文件中,以确保它只被初始化一次。

  2. 访问权限:虽然初始化发生在类外,但初始化本身并不受访问权限(如public、protected、private)的限制。然而,初始化表达式本身必须能够访问到静态成员变量,这通常意味着它需要在能够访问该变量的作用域内。在实际代码中,这通常意味着初始化表达式位于实现该类的源文件中。

  3. 初始化时机:静态成员变量的初始化是在程序启动时进行的,具体时机取决于静态变量的构造顺序和依赖关系。在C++11及更高版本中,可以通过使用初始化器(initializer)来控制静态变量的初始化顺序。

  4. 限制:尽管初始化不受访问权限的直接限制,但初始化表达式必须遵守语言的语法和语义规则。例如,你不能在初始化表达式中使用未定义或不可访问的变量或函数。

  5. 作用域:初始化后的静态成员变量在其整个生命周期内都存在,并且可以被类的成员函数(包括静态成员函数和非静态成员函数)访问。但是,只有类内部或友元函数可以访问私有静态成员变量。

因此,虽然静态私有成员变量的初始化在类外进行,但这并不意味着初始化是不受限制的。初始化必须遵守C++的语法和语义规则,并且必须在能够访问到静态成员变量的作用域内进行。同时,初始化后的静态成员变量的访问仍然受到访问权限的控制。

 

标签:初始化,变量,访问,私有,成员,c++,静态
From: https://blog.csdn.net/xie__jin__cheng/article/details/142525420

相关文章

  • C++开发项目
    1.项目系统需求文章目录1.项目系统需求功能如下:2.创建项目:3.创建管理类3.1创建文件3.2头文件实现3.3源文件实现4.菜单功能4.1添加成员函数4.2菜单功能实现4.3测试菜单功能5.退出功能5.1提供功能接口5.2实现退出功能5.3测试功能运行效果图:6.创建职工类6.1创建职工抽象类6.2创建普......
  • 【每周例题】蓝桥杯 C++ 数树数
    数树数题目数树数题目分析通过图片的二叉树,我们可以发现每一个·分支的L=2a-1R=2a代码#include<iostream>#include<string>usingnamespacestd;chars[50];inta;intmain(){intn,q;cin>>n>>q;for(inti=0;i<q;i++){......
  • 【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
    文章目录C++`vector`容器详解:从入门到精通前言第一章:C++`vector`容器简介1.1C++STL容器概述1.2为什么使用`vector`1.3`vector`的优缺点第二章:`vector`的构造方法2.1常见构造函数2.1.1示例:不同构造方法2.1.2相关文档第三章:`vector`容量与大小操作3.1......
  • 广州C++信奥赛老师解一本通题 1389:亲戚
    ​ 【题目描述】若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的某个人所在家族的人数。规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。【输入】第一行:三个整数n,(n......
  • private私有化,this,构造方法
    关键字private*java提供一个关键字给我们使用:private私有的可以修饰成员变量,成员方法,构造方法在同一个类中,private关键字不起作用,相当于透明的,同一个类中被private关键字修饰的成员可以随意访问标准写法标准写法1.0成员变量:使用private关键字修......
  • C++考试题-9道编程题运算符重载带部分答案
    【1】写出下列程序的运行结果。#include<iostream>   usingnamespacestd;classA{public:   A(inti):x(i)   { }   A(){x=0;}   friendAoperator++(Aa);   friendAoperator--(A&a);   voidprint();private:   i......
  • C++考试题带部分答案函数模板
    【1】写出下面程序的运行结果。#include<iostream>   usingnamespacestd;template<classType1,classType2>classmyclass{public:myclass(Type1a,Type2b){i=a;j=b;}voidshow(){cout<<i<<′′<<j<<′\n′;}private:Type1i;T......
  • C++模拟真人鼠标轨迹
    一.API跨语言平台支持`鼠标轨迹API`[https://winsdk.cn/]()底层实现采用C/C++语言,利用其高性能和系统级访问能力,开发出高效的鼠标轨迹模拟算法。通过将算法封装为DLL(动态链接库),可以方便地在不同的编程环境中调用,实现跨语言的兼容性。通过DLL封装,开发者可以在C++、Pytho......
  • QT C++ 自学积累 『非技术文』
    QTC++自学积累『非技术文』最近一段时间参与了一个QT项目的开发,使用的是C++语法,很遗憾的是我之前从来没有接触过C++,大学没有开过这堂课,也没用自己学习过,所有说上手贼慢,到现在为止其实也不是很清楚具体的开发技巧,毕竟是参与,东一复制西一粘贴的,就拉倒了。里面用到了很多......
  • 【C++】vector-1
    文章目录1.vector的介绍及使用1.1vector的介绍1.2vector的使用1.2.1vector的定义1.2.2vectoriterator的使用1.2.3vector空间增长问题1.2.4vector增删查改1.vector的介绍及使用1.1vector的介绍1.vector是表示可变大小数组的序列容器。2.就像数组一样,vec......