28.静态成员

本文详细介绍了C++中静态成员的概念及其使用方法。包括静态成员变量的声明与初始化,以及如何通过类名或对象访问静态成员变量。同时,探讨了静态成员函数的特点,即它们如何仅能访问静态成员变量,并不能访问普通成员变量。

        在类定义中,它的成员(包括成员变量和成员函数),这些成员可以用关键字static声明为静态的,称为静态成员。

        不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享静态成员变量不属于任何一个对象,而是属于一个类,被所有对象共享!

1.  静态成员变量

        在一个类中,若将一个成员变量声明为static,这种成员称为静态成员变量。与一般的数据成员不同,无论建立了多少个对象,都只有一个静态数据的拷贝。静态成员变量,属于某个类,所有对象共享。

        静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。

  1. 静态成员变量必须在类中声明,在类外初始化
  2. 静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间
  3. 静态数据成员可以通过类名或者对象名来引用 
class Person{
public:
	//类的静态成员属性
	static int sNum;

    //静态成员变量也是有权限的
private:
    //私有权限  在类外不能访问  但是可以在类外进行初始化
	static int sOther;
};

//类外初始化,初始化时不加static
int Person::sNum = 0;
int Person::sOther = 0;
int main(){


	//1. 通过类名直接访问
	Person::sNum = 100;
	cout << "Person::sNum:" << Person::sNum << endl;

	//2. 通过对象访问
	Person p1, p2;
	p1.sNum = 200;

	cout << "p1.sNum:" << p1.sNum << endl;
	cout << "p2.sNum:" << p2.sNum << endl;

	//3. 静态成员也有访问权限,类外不能访问私有成员
	//cout << "Person::sOther:" << Person::sOther << endl;
	Person p3;
	//cout << "p3.sOther:" << p3.sOther << endl;

	system("pause");
	return EXIT_SUCCESS;
}

如何修改静态成员变量?

可以通过对对象的访问修改,如下:

class Person{
public:
	//类的静态成员属性
	static int sNum;
private:
	static int sOther;
};

//类外初始化,初始化时不加static
int Person::sNum = 0;

void test(){
    Person p1;
    p1.sNum = 10;

    Person p2;
    p2.sNUM = 20; //此时Person类的sNum成员变量的值全部被修改为20,p1.sNum = 20
}

1.1 const静态成员属性

        如果一个类的成员,既要实现共享,又要实现不可改变,那就用 static const 修饰。

        定义静态const数据成员时,最好在类内部初始化

class Person{
public:
	//static const int mShare = 10;
	const static int mShare = 10; //只读区,不可修改
};
int main(){

	cout << Person::mShare << endl;
	//Person::mShare = 20;

	return EXIT_SUCCESS;
}

2. 静态成员函数    

        在类定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数使用方式和静态变量一样,同样在对象没有创建前,即可通过类名调用。静态成员函数主要为了访问静态变量,但是,不能访问普通成员变量

        静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。

  1. 静态成员函数只能访问静态变量,不能访问普通成员变量
  2. 静态成员函数的使用和静态成员变量一样
  3. 静态成员函数也有访问权限
  4. 普通成员函数可访问静态成员变量、也可以访问非静态成员变量
class Person{
public:
	//普通成员函数可以访问static和non-static成员属性
	void changeParam1(int param){
		mParam = param;
		sNum = param;
	}
	//静态成员函数只能访问static成员属性
	static void changeParam2(int param){
		//mParam = param; //无法访问
		sNum = param;
	}
private:
	static void changeParam3(int param){
		//mParam = param; //无法访问
		sNum = param;
	}
public:
	int mParam;
	static int sNum;
};

//静态成员属性类外初始化
int Person::sNum = 0;

int main(){

	//1. 类名直接调用
	Person::changeParam2(100);

	//2. 通过对象调用
	Person p;
	p.changeParam2(200);

	//3. 静态成员函数也有访问权限
	//Person::changeParam3(100); //类外无法访问私有静态成员函数
	//Person p1;
	//p1.changeParam3(200);
	return EXIT_SUCCESS;
}

我们来逐项分析这道题。 --- ## ✅ 题干: 关于**静态成员函数**,描述正确的是? --- ## ✅ 选项分析: ### A.静态成员函数在类外定义时,要用 `static` 前缀 ❌ **错误** - 在类**内部声明**静态成员函数时需要使用 `static` 关键字。 - 但在类**外部定义**时,**不需要**再加 `static`。 - 否则会导致编译错误。 ✅ 正确写法示例: ```cpp class MyClass { public: static void func(); // 声明 }; void MyClass::func() { // 定义时不加 static std::cout << "Static function" << std::endl; } ``` --- ### B.在建立对象前,就可以为静态数据成员赋值 ✅ **正确** - 静态数据成员属于整个类,而不是类的某个对象。 - 它在类加载时就已经存在,可以在**没有创建对象之前**访问和赋值。 ✅ 示例: ```cpp class MyClass { public: static int count; }; int MyClass::count = 0; // 静态成员定义 int main() { MyClass::count = 10; // 未创建对象,赋值成功 std::cout << MyClass::count << std::endl; return 0; } ``` --- ### C.在静态成员函数中可以使用 `this` 指针 ❌ **错误** - `this` 指针指向当前对象。 - **静态成员函数没有 `this` 指针**,因为它不属于任何一个对象。 - 它只能访问静态成员,不能访问非静态成员。 ✅ 示例说明: ```cpp class MyClass { int a; static int b; public: static void func() { // a = 10; // 错误:不能访问非静态成员 b = 20; // 正确:可以访问静态成员 // std::cout << this; // 错误:不能使用 this 指针 } }; ``` --- ### D.静态成员函数只能在类外定义 ❌ **错误** - 静态成员函数可以在类内**定义为 inline 函数**。 - 如果函数体在类内实现,编译器会自动将其视为 inline。 ✅ 示例: ```cpp class MyClass { public: static void func() { // 类内定义 std::cout << "Inline static function" << std::endl; } }; ``` --- ## ✅ 正确答案是: ✅ **B.在建立对象前,就可以为静态数据成员赋值** --- ## ✅ 静态成员函数总结: | 特点 | 是否正确 | |------|----------| | 类外定义需加 `static` | ❌ | | 可在无对象时访问静态成员 | ✅ | | 可以使用 `this` 指针 | ❌ | | 只能在类外定义 | ❌ | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S1lent9o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值