C++静态成员变量和静态成员函数

合集下载

c++的static关键字用法

c++的static关键字用法

c++的static关键字用法C++中的`static`关键字有多种用法,在不同的场景下都有着不同的含义和作用。

本文将详细介绍C++中`static`关键字的用法及其相关特性,希望能对读者更好地理解和运用这个关键字。

一、`static`关键字概述`static`是C++中的一个关键字,它常用于指定函数、变量、类成员等的作用域和生命周期。

它的主要作用如下:1. 限定变量的作用域。

使用`static`关键字声明的变量具有静态的生存期和块作用域,即在整个程序运行期间都存在,并且只能在声明变量的源文件中访问。

2. 限定函数的作用域。

使用`static`关键字声明的函数具有静态的作用域,即只能在声明它的源文件中调用。

3. 限定类成员的作用域。

使用`static`关键字声明的类成员为静态成员,它不属于类的任何一个对象,而是属于整个类,可以通过类名或类对象来访问。

4. 防止符号重定义。

当在多个源文件中定义同名的全局变量或函数时,使用`static`关键字可以防止它们之间的符号重定义错误。

二、静态变量1. 全局静态变量使用`static`关键字声明的全局变量具有静态生存期和文件作用域,即它在程序运行期间一直存在,而且只能在声明它的源文件中访问。

例如:```cpp//file1.cpp#include <iostream>static int count = 10; //声明全局静态变量countvoid func() {static int i = 5; //局部静态变量i,生命周期为整个程序运行期间std::cout << "i is " << i ;std::cout << " and count is " << count << std::endl;i++;count++;}```在另一个源文件中引用这个全局静态变量,编译器会报错:```cpp//file2.cpp#include <iostream>extern int count; //声明全局变量countvoid func2() {std::cout << "count is " << count << std::endl;}```编译器会报错:undefined reference to `count'。

static int在c语言中的用法

static int在c语言中的用法

static int在c语言中的用法一、概述在C语言中,static关键字是一个非常有用的修饰符,它可以用于声明不同类型的数据和函数,包括静态局部变量、静态全局变量、静态函数以及静态类成员等。

其中,static int用于声明一个静态整型变量,它的用法和普通变量略有不同,具有一些独特的性质和用途。

二、静态局部变量静态局部变量是指在函数内部声明的static变量。

这些变量在函数被调用时才会分配内存,函数调用结束时,静态局部变量将一直保留其值,直到下一次调用该函数时才会被销毁。

静态局部变量的作用范围仅限于函数内部,无法在外部访问。

例如:```cvoid function() {static int var = 0;// ...}```在上述代码中,var是一个静态局部变量,每次调用function()时,它的值都会被重置为0。

这对于计数、记录状态等用途非常有用。

三、静态全局变量static还可以用于声明全局变量。

静态全局变量只在程序编译时分配内存,并且在程序运行过程中一直存在,不会因为函数调用而销毁。

静态全局变量的作用范围是整个程序,可以在其他文件和函数中访问。

例如:```cstatic int globalVar = 0; // 静态全局变量```上述代码中,globalVar是一个静态全局变量,它只会在程序编译时分配一次内存,并且在程序运行过程中一直存在。

这对于需要在多个函数之间共享数据的情况非常有用。

四、静态函数static还可以用于声明函数。

静态函数是一种特殊类型的函数,它在程序编译时就已经存在,并且不会因为函数的调用而重新分配内存。

这意味着静态函数的作用范围仅限于当前文件,无法在其他文件中直接调用。

通常用于实现只在该文件中使用的功能。

例如:```cstatic void function() {// ...}```上述代码中,function()是一个静态函数,它只能在当前文件中使用,不能在其他文件中直接调用。

C++类静态成员与类静态成员函数详解

C++类静态成员与类静态成员函数详解

C++类静态成员与类静态成员函数详解当将类的某个数据成员声明为static时,该静态数据成员只能被定义⼀次,⽽且要被同类的所有对象共享。

各个对象都拥有类中每⼀个普通数据成员的副本,但静态数据成员只有⼀个实例存在,与定义了多少类对象⽆关。

静态⽅法就是与该类相关的,是类的⼀种⾏为,⽽不是与该类的实例对象相关。

静态数据成员的⽤途之⼀是统计有多少个对象实际存在。

静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。

也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建⼀个类的对象则静态数据成员都要被重新初始化。

静态成员不可在类体内进⾏赋值,因为它是被所有该类的对象所共享的。

你在⼀个对象⾥给它赋值,其他对象⾥的该成员也会发⽣变化。

为了避免混乱,所以不可在类体内进⾏赋值。

数据类型类名::静态数据成员名=初值不能⽤参数初始化表对静态成员初始化。

⼀般系统缺省初始为0。

静态成员是类所有的对象的共享的成员,⽽不是某个对象的成员。

它在对象中不占⽤存储空间,这个属性为整个类所共有,不属于任何⼀个具体对象。

所以静态成员不能在类的内部初始化,⽐如声明⼀个学⽣类,其中⼀个成员为学⽣总数,则这个变量就应当声明为静态变量,应该根据实际需求来设置成员变量。

复制代码代码如下:#include "iostream"using namespace std;class test{private:int x;int y;public:static int num;static int Getnum(){x+=5; // 这⾏代码是错误的,静态成员函数不能调⽤⾮静态数据成员,要通过类的对象来调⽤。

num+=15;return num;}};int test::num = 10;int main(void){test a;cout<<test::num<<endl; //10test::num = 20;cout<<test::num<<endl; //20cout<<test::Getnum()<<endl; //35cout<<a.Getnum()<<endl; //50system("pause");return 0;}通过上例可知: x+=5; // 这⾏代码是错误的静态函数成员必须通过对象名来访问⾮静态数据成员。

C++类中的静态成员变量和静态成员函数的作用

C++类中的静态成员变量和静态成员函数的作用

数据成员可以分静态变量、非静态变量两种.静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中..一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数..分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。

一、在面向过程设计中的static关键字1、静态全局变量定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。

特点:A、该变量在全局数据区分配内存。

B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。

C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。

例〔摘于C++程序设计教程---钱能主编P103〕://file1.cpp//Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){n=20;cout < <n < <endl;fn();}void fn(){n++;cout < <n < <endl;}D、文件作用域下声明的const的常量默认为static存储类型。

静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。

对于一个完整的程序,在内存中的分布情况如以下图:代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。

静态函数 静态数据成员与静态成员函数 为什么虚函数必须是非静态成员函数 构造函数能为static吗

静态函数 静态数据成员与静态成员函数 为什么虚函数必须是非静态成员函数 构造函数能为static吗

静态函数静态数据成员与静态成员函数为什么虚函数必须是非静态成员函数构造函数能为static吗?2009-07-05 14:27静态函数用static声明的函数是静态函数。

静态函数可以分为全局静态函数和类的静态成员函数。

Static关键字在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份。

用static声明的方法是静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。

静态方法不再是针对于某个对象调用,所以不能访问非静态成员。

可以通过对象引用或类名(不需要实例化)访问静态成员C++类静态数据成员与类静态成员函数函数调用的结果不会访问或者修改任何对象(非static)数据成员,这样的成员声明为静态成员函数比较好。

且如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于static的限制,它只能在文件所在的编译单位内使用,不能在其它编译单位内使用。

静态成员函数的声明除了在类体的函数声明前加上关键字static,以及不能声明为const或者volatile之外,与非静态成员函数相同。

出现在类体之外的函数定义不能制定关键字static。

静态成员函数没有this指针。

在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢?这个问题便是本章的重点:声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数。

下面我们用几个实例来说明这个问题,类的成员需要保护,通常情况下为了不违背类的封装特性,我们是把类成员设置为protected(保护状态)的,但是我们为了简化代码,使要说明的问题更为直观,更容易理解,我们在此处都设置为public。

static的三种用法

static的三种用法

static的三种用法`static` 是C、C++、Java、C# 等编程语言中的关键字,在不同的语境中具有不同的用法。

以下是`static` 的三种主要用法:1. 静态变量(Static Variables):-在函数内部或在类中,使用`static` 关键字声明的变量称为静态变量。

静态变量的生命周期贯穿整个程序运行期间,而不仅仅是在声明它的作用域内。

-在C 语言中,静态变量在函数内的示例:```cvoid myFunction() {static int counter = 0; // 静态变量counter++;printf("Counter: %d\n", counter);}```-在C++ 类中,静态成员变量属于类而不是类的实例:```cppclass MyClass {public:static int staticVariable; // 静态成员变量};int MyClass::staticVariable = 0; // 静态成员变量的初始化int main() {MyClass::staticVariable++;return 0;}```2. 静态函数(Static Functions):-在C 和C++ 中,使用`static` 关键字声明的函数成为静态函数。

静态函数只能在声明它的文件中访问,不能被其他文件调用。

-在C 中:```c// 在同一文件中声明和定义静态函数static void myStaticFunction() {printf("This is a static function.\n");}```-在C++ 中:```cpp// 在类中声明静态函数class MyClass {public:static void staticFunction() {printf("This is a static function.\n");}};int main() {MyClass::staticFunction();return 0;}```3. 静态类成员(Static Class Members):-在C# 和Java 中,使用`static` 关键字声明的成员属于类而不是类的实例。

静态成员变量

静态成员变量

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

不管这个类创建了多少个对象,静态成员只有⼀个拷贝,这个拷贝被所有属于这个类的对象共享。

在⼀个类中,若将⼀个成员变量声明为static,这种成员称为静态成员变量。

与⼀般的数据成员不同,⽆论建⽴了多少个对象,都只有⼀个静态数据的拷贝。

静态成员变量,属于某个类,所有对象共享。

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

静态成员变量必须在类中声明,在类外定义。

静态数据成员不属于某个对象,在为对象分配空间中不包括静态成员所占空间。

静态数据成员可以通过类名或者对象名来引⽤。

例:#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;class Person{public:Person(){}static int m_Age; //加⼊static就是静态成员变量,会共享数据//静态成员变量,再类内声明,类外进⾏初始化};int Person::m_Age = 0; //类外初始化实现void test501(){//1.通过对象访问属性Person p1;p1.m_Age = 10;Person p2;p2.m_Age = 20;cout << "p1=" << p1.m_Age << endl;cout << "p2=" << p2.m_Age << endl;//2.通过类名访问属性cout << "通过类名访问Age" << Person::m_Age << endl;}int main(){test501();system("Pause");return0;}结果:注意:私有权限的静态成员变量再类外可以初始化,但⽆法访问静态⽅法1.静态⽅法⾥不能访问普通成员变量2.可以访问静态成员变量3.静态⽅法也是有访问权限的受public private protected限制。

c++易错知识总结

c++易错知识总结

变量的作用域(从空间角度来分析)局部变量:在函数内部或复合语句中定义的变量,称为局部变量,只在本函数或本复合语句中有效。

全局变量:在函数之外定义的变量,称为全局变量或外部变量。

全局变量的有效范围从定义变量的位置开始到本源文件结束。

变量的存储区(也叫生命期,从时间角度来分析)静态存储区:程序整个运行时间内都存在。

存放全局变量和静态变量(static声明),静态变量分为静态局部变量和静态全局变量。

静态局部变量:静态局部变量的值在函数调用后不释放而保持原值。

静态全局变量:与全局变量区别是,静态全局变量只限于被本文件引用,而不能被其他文件引用(全局变量可以通过extern声明,引用其他文件的全局变量)。

静态函数也是只能被本文件所引用。

动态存储区:在调用函数时临时分配单元,分为堆区和栈区。

堆区,由程序员分配释放栈区,由编译器自动分配释放以下这两个属于存储区,但不属于变量变量的存储区。

(程序区:存放函数体的二进制代码)(文字常量区:存放字符串常量)extern声明外部变量:在一个文件中声明,用作提前引用声明在多个文件中声明,用作声明外部变量(便会到其他文件中去找)即:要是一个变量声明为外部变量,首先在本文件中找有无此变量,若没有,便从其他文件找有无此变量inline(内联函数,内置函数):在编译时将所调用函数的代码直接嵌入到主调函数中,以提高效率。

适用于规模较小而又被频繁调用的函数。

内部函数,用static声明,只能被本文件调用函数重载:函数名相同,参数个数或参数类型不相同。

运算符重载:通过定义函数实现的,运算符重载的实质是函数的重载。

格式为:函数类型 operator 运算符名称(形参列表){对运算符的重载处理}函数模板:函数体相同,参数个数相同而类型不同。

定义一个虚拟类型,在调用函数时根据实参类型来取代模板中的虚拟类型。

template <typename/class T>T max(T a, T b, T c){***}类模板:和函数模板相似。

C语言中static和extern的区别

C语言中static和extern的区别

C语言中static和extern的区别C语言中static和extern的区别导语:由于变量的声明可以有多次,但定义只能有一次,这就不可避免地要使用extern,static关键字。

弄清楚这几个关键字之间的用法和区别,能节省很多调试项目的时间,尤其是对于一些难以定位的链接错误。

下面是C语言中static和extern的'区别,一起来学习下吧:static:一、在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。

1、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。

全局静态变量有以下特点。

a.在全局区分配内存。

b.如果没有初始化,其默认值为0.c.该变量在本文件内从定义开始到文件结束可见。

2、定义局部静态变量:在局部变量前面加上关键字static,其特点如下:a.该变量在全局数据区分配内存。

b.它始终驻留在全局数据区,直到程序运行结束。

c. 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

3、定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数,其特点如下:a.静态函数只能在本源文件中使用b.在文件作用域中声明的inline函数默认为static类型二、在C++中新增了两种作用:定义静态数据成员或静态函数成员。

定义静态数据成员。

a.内存分配:静态数据成员在程序的全局数据去分配。

b.初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中定义。

静态数据成员因为程序以开始运行就必须存在,所以其初始化的最佳位置在类的内部,public、protected、private关键字对它的限定和普通数据成员一样,因为其空间在全局数据分配,属于所有本类的对象共享。

它不属于特定的类对象,在没产生类对象时,其作用域可见,即没有产生类的实例时,就可以操作它了。

静态成员函数。

静态成员函数与类相联系,不与类的对象相联系。

C#静态类和静态类成员详解

C#静态类和静态类成员详解
答案:对
6.静态类和实例类的区别在于:静态类不需要初始化即可直接使用,实例类需要进行实例化,生成对象才可使用。
答案:对
7.使用Directory类的Move()方法可以删除文件。
答案:错
8.使用FileInfo类的Copy()方法可以复制文件。
答案:对
9.DataSet对象中的表可以和数据库中的表同名,也可以不同名。
例如,前面使用的Console.WriteLine()和Convert.ToString()方法就是静态的,根本不需要实例化Console或Convert类(如果试着进行这样的实例化,操作会失败,因为这些类的构造函数不是可公共访问的,如前所述)。
许多情况下,静态属性和方法有很好的效果。例如,可以使用静态属性跟踪给类创建了多少个实例。在UML语法中,类的静态成员用下划线表示,如图8-5所示。
使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。
静态类的主要功能如下:
1、它们仅包含静态成员。
2、它们不能被实例化。
3、它们是密封的。
4、它们不能包含实例构造函数(C#编程指南)。
因此创建静态类与创建仅包含静态成员和私有构造函数的类大致一样。私ຫໍສະໝຸດ 构造函数阻止类被实例化。36
37{
38
39return 15;
40
41}
42
43}
44
45public static void Drive() { }
46
47public static event EventType RunOutOfGas;
48//other non-static fields and properties...

关于C语言中的静态函数

关于C语言中的静态函数

关于C语⾔中的静态函数在C语⾔中⽤static声明限定外部变量与函数,可以将其后声明的对象的作⽤域限定为被编译源⽂件的剩余部分。

通过static限定外部对象,可以达到隐藏外部对象的⽬的。

如果把函数声明为static类型,则该函数名除了对该函数声明所在的⽂件可见外,其他⽂件都⽆法访问。

也就是只能被本⽂件中的函数调⽤,⽽不能被同⼀程序中的其他⽂件的函数调⽤。

C语⾔程序可以看成由⼀系列外部对象构成,这些外部对象可能是变量或函数。

⽽内部变量是指定义在函数内部的函数参数及变量。

外部变量定义在函数之外,因此可以在许多函数中使⽤。

由于C语⾔不允许在⼀个函数中定义其它函数,因此函数本⾝只能是“外部的”。

由于C语⾔代码是以⽂件为单位来组织的,在⼀个源程序所有源⽂件中,⼀个外部变量或函数只能在某个⽂件中定义⼀次,⽽其它⽂件可以通过extern声明来访问它(定义外部变量或函数的源⽂件中也可以包含对该外部变量的extern声明)。

⽽static则可以限定变量或函数为静态存储。

如果⽤static限定外部变量与函数,则可以将该对象的作⽤域限定为被编译源⽂件的剩余部分。

通过static限定外部对象,可以达到隐藏外部对象的⽬的。

因⽽,static限定的变量或函数不会和同⼀程序中其它⽂件中同名的相冲突。

如果⽤static限定内部变量,则该变量从程序⼀开始就拥有内存,不会随其所在函数的调⽤和退出⽽分配和消失。

C语⾔中使⽤静态函数的好处:1)静态函数会被⾃动分配在⼀个⼀直使⽤的存储区,直到退出应⽤程序实例,避免了调⽤函数时压栈出栈,速度快很多。

2)关键字“static”,译成中⽂就是“静态的”,所以内部函数⼜称静态函数。

但此处“static”的含义不是指存储⽅式,⽽是指对函数的作⽤域仅局限于本⽂件。

使⽤内部函数的好处是:不同的⼈编写不同的函数时,不⽤担⼼⾃⼰定义的函数,是否会与其它⽂件中的函数同名,因为同名也没有关系。

补充1:static变量C/C++中的变量根据作⽤域(知道该名字的程序⽂本区)和⽣命期(程序执⾏过程中对象存在的时间)分为全局变量、静态全局变量、局部变量和静态局部变量。

static在c++语言中的作用

static在c++语言中的作用

静态变量(static)在C++语言中是一种非常重要的概念。

它可以被用于多种情况,包括在类中的静态成员变量、函数中的静态局部变量等。

本文将对static在C++中的作用进行详细的介绍和分析。

二、静态成员变量1. 类中的静态成员变量是指所有类对象所共享的变量。

当多个对象对一个静态成员变量进行修改时,改动将会影响所有对象。

静态成员变量通常用于记录某个类对象的共同属性,例如记录某个类对象的总数、某个类对象的特定属性等。

2. 静态成员变量的声明和初始化通常在类的外部进行,如下所示:```cppclass A {public:static int count;};int A::count = 0;```3. 静态成员变量的访问方式为“类名::成员变量”,例如:A::count++;```4. 静态成员变量的使用可以减少对象之间的重复数据,提高内存利用效率,还可以通过静态成员变量实现对类的全局控制和管理。

三、静态成员函数1. 静态成员函数是指在类中用static修饰的成员函数。

静态成员函数不依赖于任何特定的类对象,因此它不具有this指针,不能直接访问非静态成员变量。

2. 静态成员函数可以通过类名直接调用,无需通过对象来调用。

静态成员函数通常用于完成与类相关的一些全局操作,例如计算工厂模式中的创建新对象、单例模式中获取唯一实例等。

3. 静态成员函数的声明和定义方式如下:```cppclass A {public:static void func();};void A::func() {// do something}```4. 静态成员函数的使用可以提高程序的运行效率,减少对对象的依赖性,并且更符合面向对象程序设计的思想。

四、静态局部变量1. 静态局部变量是指在函数中用static修饰的局部变量。

静态局部变量在程序运行过程中只会被初始化一次,它的值在函数调用结束后也会被保留,直到程序结束才会被销毁。

2. 静态局部变量通常用于保存函数调用过程中的一些状态信息,例如递归函数中的计数变量、保存上一次调用结果等。

static用法

static用法

static用法1.静态变量:使用static关键字声明的变量是静态变量,它们存储在全局数据区。

与局部变量不同,静态变量在程序的整个生命周期内存在,并且只分配一次内存。

例如:```cpp#include<iostream>using namespace std;void funccount++;cout << "count: " << count << endl;int mainfor (int i = 0; i < 5; i++)func(;return 0;```输出:```count: 1count: 2count: 3count: 4count: 5```在上面的代码中,变量count是一个静态变量,它的值在每次调用函数func时会增加。

2.静态函数:使用static关键字声明的函数是静态函数,静态函数只能在当前文件中使用,不能被其他文件调用。

例如:```cpp// file1.cppcout << "This is a static function." << endl;// file2.cppint mainreturn 0;```在上面的代码中,静态函数staticFunction只能在file1.cpp文件中使用。

在file2.cpp中调用staticFunction会导致编译错误。

3.静态类成员:使用static关键字声明的类成员是静态成员,它们属于整个类,而不是类的实例。

静态成员可以通过类名访问,无需创建类的实例。

例如:```cpp#include<iostream>using namespace std;class MyClasspublic:cout << "This is a static function." << endl;}};int MyClass::count = 0;int maincout << MyClass::count << endl; // 输出0MyClass::staticFunction(; // 输出"This is a static function."MyClass::count = 5;cout << MyClass::count << endl; // 输出5return 0;```在上面的代码中,变量count是一个静态成员变量,它属于整个类MyClass,而不是类的实例。

C++静态成员函数不能调用非静态成员变量(详解)

C++静态成员函数不能调用非静态成员变量(详解)

C++静态成员函数不能调⽤⾮静态成员变量(详解)其实我们从直观上可以很好的理解静态成员函数不能调⽤⾮静态成员变量这句话因为⽆论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在类的整个⽣存周期⾥始终只能存在⼀份。

然⽽⾮静态成员变量和⾮静态成员函数是针对类的对象⽽⾔。

然⽽从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能调⽤具体实例对象的成员。

下⾯我们来测试⼀下:先在静态成员函数中调⽤静态成员变量:#include <iostream>using namespace std;class vpoet{public:static int a;int b;public:vpoet(int data){b=data;}static void statictestfun1(){cout<<"static a="<<a<<endl;}};int vpoet::a=10;int main(){vpoet *V;V=new vpoet(5);vpoet::statictestfun1();return 0;}调⽤成功,截图如下现在我们再静态成员函数中调⽤⾮静态成员变量#include <iostream>using namespace std;class vpoet{public:static int a;int b;public:vpoet(int data){b=data;}static void statictestfun1(){cout<<"static b="<<b<<endl;}};int vpoet::a=10;int main(){vpoet *V;V=new vpoet(5);vpoet::statictestfun1();return 0;}编译下提⽰了错误:⼤意是在静态成员函数中引⽤了类的⾮静态成员变量b。

c语言static用法

c语言static用法

c语言static用法C语言中的static关键字用法在C语言中,static是一个非常重要的关键字。

它可以应用于不同的上下文,具有不同的功能。

下面将逐一介绍几种常见的static用法。

1. 静态变量:在函数内部,使用static关键字声明的变量被称为静态变量。

与普通的局部变量不同,静态变量在程序运行期间只分配一次内存,即使函数执行结束后仍然保留其值。

静态变量存储在全局数据区,具有全局生存周期和局部作用域。

这使得静态变量在多次调用函数时能够保留之前的值。

2. 静态函数:使用static关键字声明的函数被称为静态函数。

静态函数只能在声明它的源文件中访问,无法被其他源文件调用。

静态函数的作用是限制函数的作用域,防止与其他文件中的同名函数冲突,也增加了代码的安全性。

3. 静态全局变量:在函数外部、全局作用域中使用static关键字声明的变量被称为静态全局变量。

与普通全局变量相比,静态全局变量只能在声明它的源文件中访问,其他源文件无法使用extern关键字引用它。

因此,静态全局变量的作用域仅限于当前源文件,避免了不必要的全局命名冲突。

4. 静态成员变量:在面向对象的程序设计中,使用static关键字声明的类成员变量被称为静态成员变量。

与普通的成员变量不同,静态成员变量属于整个类,而不是类的实例。

这意味着即使创建多个类的实例,静态成员变量的内存空间也只分配一次。

静态成员变量可以通过类名直接访问,无需通过对象来引用。

总结:通过以上介绍,我们可以看到static关键字在C语言中具有多种用法。

它可用于声明静态变量、静态函数、静态全局变量以及静态成员变量。

static的使用能够有效地控制变量和函数的作用域,增加程序的安全性和可读性。

熟练掌握static的用法对于写出高效、可靠的C语言程序非常重要。

static函数的用法

static函数的用法

static函数的用法
static函数是一个类的特殊成员函数,与类的实例化对象无关,有以下用法:
1. 不需要实例化对象:static函数可以直接通过类名调用,不需要通过类的实例化对象来调用。

这样可以避免创建对象的开销,提高效率。

2. 访问静态成员:static函数只能访问类的静态成员变量和静态成员函数,无法访问非静态成员变量和非静态成员函数。

因为非静态成员依赖于对象的实例化。

3. 共享数据和方法:静态函数和静态成员变量在内存中只有一份拷贝,所有实例化对象共享这些数据和方法。

可以使用静态函数来操作和修改静态成员变量,实现数据共享。

4. 不能访问非静态变量和函数:静态函数无法访问非静态成员变量和成员函数,因为非静态成员依赖于对象的实例化。

如果要在静态函数中访问非静态成员,可以通过传递对象作为参数的方式来实现。

5. 静态函数没有this指针:由于静态函数不依赖于对象实例,所以没有this指针,无法访问当前对象的成员。

不能在静态函数中使用this指针。

总的来说,static函数主要用于操作和修改静态成员变量,实现数据共享,提高效率。

但需要注意,在使用时要谨慎,因为静态函数不能直接访问非静态成员,
可能会导致一些编程问题。

C++类的成员

C++类的成员

C++类的成员1、成员变量成员变量可以是任何类型,如基本数据类型、引⽤、另⼀个类的对象或指针、⾃⾝类的引⽤或指针,但不能是⾃⾝类的对象;成员变量不能指定为auto、register、extern 存储类型。

1.1、普通成员变量普通成员变量是属于对象的,其⽣命周期就是对象的⽣命周期,只能通过构造函数的初始化列表进⾏初始化,也可以在构造函数中赋值。

如果是成员变量是⼀个类的对象,那么只能并且必须使⽤初始化列表。

1.2、常成员变量(const)常成员变量是属于对象的,其⽣命周期就是对象的⽣命周期,在这个⽣命周期中其值是不可改变的。

常成员变量不能在类的内部初始化,在类的内部只是声明,只能通过构造函数的初始化列表进⾏初始化,并且必须进⾏初始化。

常变量只能初始化不能赋值,所以在构造函数中赋值,或者使⽤⾃定义的成员函数赋值都是错误的。

#include <iostream>using namespace std;class Example{public:Example(double pi):PI(pi){} //必须有使⽤初始化列表的构造函数double GetPi(void){return PI;}private:const double PI; //不能在类内初始化};int main(void){Example ex(3.1415);cout << ex.GetPi() <<endl;return0;}1.3、静态成员变量(static)静态成员变量是属于整个类的,整个类(所有类的对象中)只有⼀份拷贝,相当于类的全局变量(这是对于同⼀进程内⽽⾔, 多进程间⽆效)。

静态成员变量不能在类的内部初始化,在类的内部只是声明,定义必须在类外,定义时不能加上static关键字,定义时可以指定初始值,也可以不指定,不指定时系统默认其初始值为0.静态成员变量同样遵守public\private\protected限定,当静态成员变量是公有成员时可以使⽤下⾯2种⽅式访问,推荐使⽤第⼀种.// Method One类名::静态成员变量名//Method Two对象名.静态成员变量名例⼦:#include <iostream>using namespace std;class Example{public:static char chval; //声明static int GetInt(void){return ival;}private:static int ival; //声明};char Example::chval = 'A'; //定义(指定初始值)int Example::ival; //定义(未指定初始值) 相当于 int Example::ival = 0;int main(void){Example ex;cout << ex.GetInt() << endl; //未初始化时,静态变量被默认初始化为0;cout << ex.chval << endl; //通过对象访问Example::chval = 'B';cout << Example::chval << endl; //通过类名访问return0;}1.4、静态常量成员变量(const static)通过前⾯介绍的常成员变量和静态成员变量 ,我们知道常成员变量在对象的⽣命周期中恒不变,静态成员变量在整个类中全局可变。

在MFC下如何定义全局变量和全局函数

在MFC下如何定义全局变量和全局函数

在MFC下如何定义全局变量和全局函数在MFC(Microsoft Foundation Class)下,可以通过以下几种方式来定义全局变量和全局函数。

1.静态成员变量和静态成员函数:在MFC类中,可以使用静态成员变量和静态成员函数来实现全局变量和全局函数的效果。

静态成员变量和静态成员函数是与类相关联的,不是与具体对象相关联的,在程序的任何位置都可以访问。

定义静态成员变量和静态成员函数的步骤如下:-在MFC类的头文件(.h文件)中声明静态成员变量和静态成员函数,并添加一个静态关键字。

```cppclass CMyClasspublic:static int s_globalVar;static int StaticGlobalFunction(;};```- 在MFC类的源文件(.cpp文件)中定义静态成员变量和静态成员函数,并将其前面加上类名和作用域解析操作符。

```cppint CMyClass::s_globalVar = 10;int CMyClass::StaticGlobalFunctionreturn s_globalVar;}```-可以在程序的任何位置通过类名和作用域解析操作符来访问静态成员变量和静态成员函数。

```cppint result = CMyClass::s_globalVar;int result = CMyClass::StaticGlobalFunction(;```2.全局变量和全局函数:在MFC中,可以通过在源文件(.cpp文件)的顶部定义全局变量和全局函数的方式来实现全局变量和全局函数的效果。

全局变量和全局函数的定义是在MFC类之外的,可以在程序的任何位置进行访问和使用。

全局变量和全局函数的定义如下:- 在源文件的顶部定义全局变量,并使用extern关键字。

```cpp//在源文件的顶部定义全局变量extern int g_globalVar = 10;```-在源文件的顶部定义全局函数。

c语言static用法

c语言static用法

c语言static用法C语言中,static关键字被广泛应用于变量、函数和类中,以实现代码的组织和优化。

下面我们将详细介绍static关键字在C语言中的用法、应用场景以及注意事项。

一、static关键字的基本概念在C语言中,static关键字有以下三种作用域:1.静态变量:在函数内部定义的静态变量,只在函数调用期间存在,且不会因为函数调用次数的增加而增加。

2.静态函数:在类外部定义的静态函数,可以直接通过类名调用,不属于类的成员函数。

3.静态成员:在类内部定义的静态成员,只能被类内的函数访问,不能被类外部的函数访问。

二、static关键字在变量、函数和类中的用法1.静态变量:在定义静态变量时,需要在变量名前加上static关键字。

例如:```cstatic int num;```2.静态函数:在定义静态函数时,需要在函数声明前加上static关键字。

例如:```cstatic void print_num();```3.静态成员:在定义静态成员时,需要在成员名前加上static关键字。

例如:```cclass Person {public:static void print_info();};```三、static关键字的应用场景和优势1.应用场景:静态变量适用于需要在整个程序运行期间保持数据不变的场景;静态函数适用于需要在类外部调用,但又不希望与其他对象共享的函数;静态成员适用于需要在类内部调用,但不需要与其他对象共享的成员。

2.优势:静态关键字有助于实现代码的模块化,提高代码的可维护性和可读性。

同时,它还可以避免全局变量带来的内存泄漏等问题。

四、总结static关键字的使用注意事项1.静态变量和静态函数只能在定义它们的模块内访问,不能跨模块访问。

2.静态成员只能在定义它的类内访问,不能在类外部访问。

3.静态关键字不能用于类的构造函数和析构函数。

4.静态变量需要在定义时进行初始化,否则会导致编译错误。

C++static、const和staticconst类型成员变量声明以及初始化菜鸟教程

C++static、const和staticconst类型成员变量声明以及初始化菜鸟教程

C++static、const和staticconst类型成员变量声明以及初始化菜鸟教程const 定义的常量在超出其作用域之后其空间会被释放,而 static 定义的静态常量在函数执行后不会释放其存储空间。

static 表示的是静态的。

类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。

即使没有具体对象,也能调用类的静态成员函数和成员变量。

一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。

在 C++ 中,static 静态成员变量不能在类的内部初始化。

在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,如:double Account::Rate = 2.25;static 关键字只能用于类定义体内部的声明中,定义时不能标示为static。

在 C++ 中,const 成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。

const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。

因为类可以创建多个对象,不同的对象其const 数据成员的值可以不同。

所以不能在类的声明中初始化const 数据成员,因为类的对象没被创建时,编译器不知道const 数据成员的值是什么。

const 数据成员的初始化只能在类的构造函数的初始化列表中进行。

要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt。

class Test{ public: Test():a(0){} enum {size1=100,size2=200}; private: const int a;//只能在构造函数初始化列表中初始化 static int b;//在类的实现文件中定义并初始化conststatic int c;//与static const int c;相同。

}; int Test::b=0;//static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例(摘于C++程序设计教程---钱能主编P103)://file1.cpp
//Example 1
#include <iostream.h>
void fn();
static int n; //定义静态全局变量
void main()
{
n=20;
cout < <n < <endl;
fn();
}
void fn()
#include <iostream.h>
static void fn();//声明静态函数
void main()
{
fn();
}
void fn()//定义静态函数
{
int n=10;
cout < <n < <endl;
}定义静态函数的好处:静态函数不能被其它文件所用;
其它文件中可以定义相同名字的函数,不会发生冲突;
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
this->a=a;
this->b=b;
this->c=c;
Sum+=a+b+c; //非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum() //静态成员函数的实现
static int n; //定义静态全局变量
改为:
int n; //定义全局变量程序照样正常运行。的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:
静态全局变量不能被其它文件所用;(好像是区别extern的)
其它文件中可以定义相同名字的变量,不会发生冲突;
您可以将上述示例代码改为如下:
#include <iostream.h>
void fn();
void main()
{
fn();
fn();
fn();}voidfn(){static n=10;
cout < <n < <endl;
n++;
}
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。
一、在面向过程设计中的static关键字
1、静态全局变量
定义:在全局变量前,加上关键字static该变量就被定义成为了一个静态全局变量。
特点:
A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0(自动变量是随机的,除非显式地初始化)。
C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。
非静态成员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内存中..
一个类中也可以包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数..
分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。
同全局变量相比,使用静态数据成员有两个优势:
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;
2、静态成员函数
与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。下面举个静态成员函数的例子。
//Example 6
#include <iostream.h>
class Myclass
{
public:
Myclass(int a,int b,int c);
static void GetSum();/声明静态成员函数
private:
int a,b,c;
static int Sum;//声明静态数据成员
调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,
当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。静态成员变量只能被静态成员函数调用。静态成员函数也是由同一类中的所有对象共用。只能调用静态成员变量和静态成员函数。
静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;
//Example 2
//File1
#include <iostream.h>
void fn();
static int n; //定义静态全局变量(只能在本文件中使用)
void main()
{
n=20;
cout < <n < <endl;
fn();
}
//File2
#include <iostream.h>
静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名>或<类类型名>::<静态数据成员名>
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员;
void GetSum();
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员
Myclass::Myclass(int a,int b,int c)
{
this->a=a;
this->b=b;
this->c=c;
但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。
特点:
A、该变量在全局数据区分配内存。
extern int n;(可在别的文件中引用这个变量)
void fn()
{
n++;
cout < <n < <endl;
}编译并运行Example 2,您就会发现上述代码可以分别通过编译,但link时出现错误。试着将static int n; //定义静态全局变量
改为
int n; //定义全局变量
再次编译运行程序,细心体会全局变量和静态全局变量的区别。2、静态局部变量定义:在局部变量前加上static关键字时,就定义了静态局部变量。我们先举一个静态局部变量的例子,如下://Example 3
{
// cout < <a < <endl; //错误代码,a是非静态数据成员
cout < <"Sum=" < <Sum < <endl;
}
void main()
{
Myclass M(1,2,3);
M.GetSum();
Myclass N(4,5,6);
N.GetSum();
Myclass::GetSum();
数据成员可以分静态变量、非静态变量两种.
静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.
二、面向对象的static关键字(类中的static关键字)
1、静态数据成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。先举一个静态数据成员的例子。
//Example 5
#include <iostream.h>
class Myclass
{
public:
Myclass(int a,int b,int c);
}
关于静态成员函数,可以总结为以下几点:
出现在类体外的函数定义不能指定关键字static;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;
相关文档
最新文档