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++ 可以创建静态的成员变量。静态成员变量属于类本身,而不是类的某个具体对象,这意味着所有对象共享同一个静态成员变量。
静态成员变量有以下特性:
- 存储位置:静态成员变量存储在类的静态存储区,而不是对象的存储区。
- 初始化:静态成员变量必须在类定义外进行初始化,不能在类内直接赋初值(除了
inline static
C++17及之后的标准中部分情况)。 - 访问方式:静态成员变量可以通过类名直接访问,也可以通过对象访问。
以下是一个简单的例子:
#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++中,静态成员变量的初始化需要遵循一定的规则:
-
初始化位置:静态成员变量必须在类定义之外的某个地方进行初始化。这通常是在一个源文件中,以确保它只被初始化一次。
-
访问权限:虽然初始化发生在类外,但初始化本身并不受访问权限(如public、protected、private)的限制。然而,初始化表达式本身必须能够访问到静态成员变量,这通常意味着它需要在能够访问该变量的作用域内。在实际代码中,这通常意味着初始化表达式位于实现该类的源文件中。
-
初始化时机:静态成员变量的初始化是在程序启动时进行的,具体时机取决于静态变量的构造顺序和依赖关系。在C++11及更高版本中,可以通过使用初始化器(initializer)来控制静态变量的初始化顺序。
-
限制:尽管初始化不受访问权限的直接限制,但初始化表达式必须遵守语言的语法和语义规则。例如,你不能在初始化表达式中使用未定义或不可访问的变量或函数。
-
作用域:初始化后的静态成员变量在其整个生命周期内都存在,并且可以被类的成员函数(包括静态成员函数和非静态成员函数)访问。但是,只有类内部或友元函数可以访问私有静态成员变量。
因此,虽然静态私有成员变量的初始化在类外进行,但这并不意味着初始化是不受限制的。初始化必须遵守C++的语法和语义规则,并且必须在能够访问到静态成员变量的作用域内进行。同时,初始化后的静态成员变量的访问仍然受到访问权限的控制。
标签:初始化,变量,访问,私有,成员,c++,静态 From: https://blog.csdn.net/xie__jin__cheng/article/details/142525420