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++类中的静态成员变量和静态成员函数的作用

数据成员可以分静态变量、非静态变量两种.静态成员:静态类中的成员加入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函数在c语言中的用法

static函数在c语言中的用法在C语言中,静态函数(static function)是指在函数声明前加上static关键字的函数。
静态函数与非静态函数的主要区别在于,静态函数只能在声明所在的源文件中访问,不能被其他源文件调用。
以下是静态函数的用法和一些适当的拓展:1.限制函数的作用域:将函数声明为静态可以限制其只在当前文件中使用。
这样可以避免函数被其他文件中的函数或变量误用,提高代码安全性和可维护性。
2.可以避免与其他文件中相同名称的函数产生冲突:当不同文件中定义了相同名称的函数时,编译器会报错。
使用静态函数可以避免这种冲突,因为它们只在当前文件中可见。
3.减小程序的内存占用:静态函数只在声明所在的源文件中可见,其他文件无法调用。
因此,编译器在编译其他文件时不会为静态函数分配内存空间,从而减小了程序的内存占用。
4.提高函数的执行效率:由于静态函数只在当前文件中使用,编译器可以对其进行优化。
在调用静态函数时,编译器可以直接生成机器码,而不需要通过函数指针等操作,从而提高函数的执行效率。
5.提供私有函数接口:静态函数只能在当前文件中使用,对其他文件隐藏了函数的具体实现。
这样可以实现一些私有函数接口,仅供当前文件中的函数调用,增加了代码的封装性。
需要注意的是,静态函数仍然需要通过函数原型进行声明和定义,以便编译器正确解析函数调用和参数传递。
静态函数的定义可以在函数声明前或后,但必须在调用之前。
总结:静态函数在C语言中主要用于限制函数的作用域、避免函数冲突、减小内存占用、提高执行效率和提供私有函数接口等方面。
c语言 静态函数 调用

c语言静态函数调用C语言中的静态函数调用在C语言中,静态函数是一种特殊类型的函数,其作用域限制在声明它的源文件之内。
它与全局函数和局部函数的不同之处在于,静态函数只能在声明它的源文件中被调用,而无法被其他源文件所访问。
静态函数在程序设计中起到了一定的作用,这篇文章将逐步解答如何使用静态函数以及它们的优缺点。
1. 静态函数的定义与声明静态函数与普通函数的定义方式相同,只不过在函数名前面加上关键字"static"。
例如:cstatic int add(int a, int b) {return a + b;}需要注意的是,静态函数的定义必须在主函数main()之前,这是因为静态函数的作用域只限于当前源文件中。
2. 静态函数的调用在同一源文件中的任何地方,都可以直接调用静态函数。
不需要进行额外的声明或者导入其他文件。
例如:cint main() {int result = add(3, 4);printf("The result is: d\n", result);return 0;}在上述例子中,通过直接调用add()函数来求得3和4相加的结果。
3. 静态函数的优点静态函数相对于普通函数有以下几个优点:- 封装性:静态函数仅在当前源文件中可见,对其他源文件是隐藏的。
这种封装的特性可以帮助我们控制函数的使用范围,提高代码的安全性和可维护性。
- 隔离性:由于静态函数具有独立的作用域,其他源文件的函数无法直接使用、访问静态函数的内部实现细节。
这种隔离性有助于减少代码之间的耦合度,提高代码的重用性。
- 提高编译器优化能力:静态函数的作用域仅限于当前源文件,编译器可以更好地了解整个程序的结构和函数调用关系,从而进行更有效的优化。
4. 静态函数的缺点虽然静态函数有许多优点,但也存在一些缺点:- 可维护性较差:由于静态函数的作用域仅限于当前源文件,当需求变化需要对函数进行修改时,需要直接修改源文件的代码。
static静态函数

static静态函数在C++中,一个类中可以定义多个函数,其中有一种函数是静态函数static,静态函数相比于普通函数有一些特殊的属性和应用,下面我们将结合示例为大家详细介绍。
一、静态函数的基本概念静态函数是一种不依赖于对象和实例化的函数,由类名和作用域解析符(::)调用。
静态函数可以被所有对象共享,无需创建具体的对象实例就可以直接调用。
因此,它不属于任何对象而是某个特定类所属,它的内部无法访问类的非静态成员,只能访问其他静态成员或全局变量。
二、静态函数的声明与定义在类中声明静态函数需要加上static关键字,同时还要在类外部进行定义。
如下法制:```c++class MyClass{public:static int staticFunction(); //声明静态函数static int count; //声明静态成员int normalFunction(); //声明普通成员函数int value; //普通数据成员};int MyClass::staticFunction() //定义静态函数{//函数体}```静态函数的定义同普通函数一样,只是在函数名和函数的形参列表后需要添加static关键字。
此外,如果类中还有其他成员,需要在静态函数的一组花括号之前加上类作用域运算符::,来指明它是一个与类有关的静态成员。
三、静态函数的使用1、用法一:操作静态成员静态函数最主要的作用就是对一个类相关的所有对象共享数据进行操作,如下所示:```c++class MyClass{public:static int getCount() //静态函数,获取count的值{return count;}void operator++() //前置自增运算符{count++;}private:static int count; //用于计数};int MyClass::count = 0; //定义count的初始值为0int main(){MyClass obj1, obj2; //定义两个对象//操作count的值++obj1;++obj2;++obj2;cout << "obj1.count = " << obj1.getCount() << endl;cout << "obj2.count = " << obj2.getCount() << endl;return 0;}```在上述示例中,我们定义了一个名为count的静态成员,它被两个对象共享,静态函数getCount()通过直接访问count的值进行了操作。
C++中静态成员函数与非静态成员函数的区别

C++中静态成员函数与⾮静态成员函数的区别静态成员函数与⾮静态成员函数的区别数据成员:静态数据成员是类的⼀部分,为类的所有实例共享(静态区);⾮静态数据成员,类的每个实例都有⼀份拷贝(动态区)。
静态数据成员的访问:静态数据成员是类的⼀部分,在产⽣任何实例之前已经存在,通过类名::静态成员变量名访问。
函数成员(都在代码区):静态函数成员与⾮静态函数成员都为类所有,对象并不存在函数的拷贝。
静态成员函数和⾮静态成员函数的根本区别在于⾮静态函数由对象名.或者对象指针->调⽤,调⽤时编译器会向函数传递this指针;静态成员函数则有类名::或者对象名.调⽤,编译器不向函数传递this指针,不识别对象个体,经常⽤来操作类的静态数据成员,要访问类的⾮静态成员可以通过对象来实现。
内存⾓度分析:类的静态成员(数据成员和函数成员)为类本⾝所有,在类加载的时候就会分配内存,可以通过类名直接访问;⾮静态成员(数据成员和函数成员)属于类的实例所有,所以只有在创建类的实例的时候才会分配内存,并通过实例去访问。
注意:类的静态数据成员是静态存储,它是静态⽣存周期,必须进⾏初始化。
注意:静态数据成员的初始化在类体外进⾏,前⾯不加static以免与⼀般静态变量或者对象混淆。
静态成员函数访问⾮静态成员报错:类的静态成员在类加载的时候就已经分配内存,⽽此时类的⾮静态成员尚未分配内存,访问内存中不存在的东西⾃然会出错。
例⼦:#includeusing namespace std;class Test{public:Test(int a){ A = a; ++B;}static void smf(Test tt);private:int A;static int B;};void Test::smf(Test tt){cout << "tt.A : " << tt.A << endl; //静态成员函数中通过对象来引⽤⾮静态成员cout << "Test::B : " << Test::B << endl;cout << "tt.B : " << tt.B << endl;}int Test::B = 0; //静态数据成员初始化的格式<数据类型><类名>::<静态数据成员名>=<值>int main(){Test t1(100);Test t2(200);Test::smf(t1);Test::smf(t2);//静态成员函数调⽤时不⽤对象名system("pause");return 0;}感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
c语言static函数声明和定义

c语言static函数声明和定义1. 静态函数是一种在C语言中用于限制函数的作用域的修饰符。
通过将函数声明为静态,我们可以将其限定在当前文件内部,使其对外部文件不可见。
这在大型项目中非常有用,可以避免命名冲突和函数被错误调用的情况。
2. 在C语言中,我们可以将函数声明为静态函数,方法是在函数定义之前加上关键字"static"。
这样的声明将告诉编译器该函数只能在当前文件中使用,无法被其他文件调用。
静态函数的声明通常放在源文件的头部,以便在需要时进行调用。
3. 静态函数的定义与普通函数类似,只是在函数名前添加了关键字"static"。
静态函数可以实现与普通函数相同的功能,但其作用范围仅限于当前文件。
这意味着其他文件无法通过函数名来调用静态函数,从而确保了函数的独立性和安全性。
4. 静态函数的另一个特点是它们的生命周期与程序的整个运行周期相同,即它们在程序启动时创建,直到程序终止才销毁。
这与普通函数不同,普通函数只在被调用时才会被创建,并在调用结束后自动销毁。
5. 静态函数的另一个特性是它们无法被其他文件所访问。
这是由于静态函数的作用域仅限于当前文件。
通过将函数声明为静态,可以有效地隐藏实现细节,提高了程序的安全性和可维护性。
6. 静态函数还可以用于实现私有函数。
私有函数是指只在当前文件内部使用的函数,不需要对外公开。
通过将私有函数声明为静态,可以防止其他文件误调用该函数,从而减少了程序错误的可能性。
总结:静态函数是一种用于限制函数作用范围的修饰符,通过将函数声明为静态,可以将其限定在当前文件内部,使其对外部文件不可见。
静态函数的声明和定义方式与普通函数类似,只是在函数名前添加了关键字"static"。
静态函数的作用范围仅限于当前文件,且无法被其他文件所访问,从而提高了程序的安全性和可维护性。
静态函数还可以用于实现私有函数,以减少程序错误的可能性。
c++里的pthread_create函数小结

c++⾥的pthread_create函数⼩结在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static !在C语⾔中,我们使⽤pthread_create创建线程,线程函数是⼀个全局函数,所以在C++中,创建线程时,也应该使⽤⼀个全局函数。
static定义的类的成员函数就是⼀个全局函数。
例如:------------- cut here start -------------#include <pthread.h>class Thread{private:pthread_t pid;private:static void * start_thread(void *arg); //静态成员函数public:int start();virtual void run() = 0;//基类中的虚函数要么实现,要么是纯虚函数(绝对不允许声明不实现,也不纯虚)};int Thread::start(){if(pthread_create(&pid,NULL,start_thread,(void *)this) != 0) //创建⼀个线程(必须是全局函数){return -1;}return 0;}void* Thread::start_thread(void *arg) //静态成员函数只能访问静态变量或静态函数,通过传递this指针进⾏调⽤{Thread *ptr = (Thread *)arg;ptr->run(); return 0; //线程的实体是run}------------- cut here end -------------#include <unistd.h>#include <stdio.h>#include "thread.h"#include <stdlib.h>class MyThread:public Thread{public:void run();};void MyThread::run(){printf("hello world\n");}int main(int argc,char *argv[]){MyThread test;test.start();printf("------------\n");//test.run();sleep(1);return 0;}------------- cut here end -------------./g++ thread.cpp -lpthread -o main ./main。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++静态成员函数小结
一静态数据成员 (1)
1.静态数据成员的定义 (1)
2.静态数据成员被类的所有对象所共享(包括该类派生类的对象) (2)
3.静态数据成员可以成为成员函数的可选参数(普通数据成员则不可以) (2)
4.静态数据成员的类型可以是所属类的类型(普通数据成员则不可以) (3)
5.静态数据成员的值在const成员函数中可以被合法的改变 (3)
二静态成员函数 (3)
1.静态成员函数的地址可用普通函数指针储存(普通成员函数地址需要用类成员函数
指针来储存) (4)
2.静态成员函数不可以调用类的非静态成员 (4)
3.静态成员函数不可以同时声明为virtual、const、volatile函数 (4)
类中的静态成员真是个让人爱恨交加的特性。
我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。
静态类成员包括静态数据成员和静态函数成员两部分。
一静态数据成员
类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。
和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。
同时,静态数据成员还具有以下特点:
1.静态数据成员的定义
静态数据成员实际上是类域中的全局变量。
所以,静态数据成员的定义(初始化)不应该被放在头文件中。
其定义方式与全局变量相同。
举例如下:
xxx.h文件
class base{
private:
static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
};
xxx.cpp文件
const int base::_i=10;//定义(初始化)时不受private和protected访问限制.
注:不要试图在头文件中定义(初始化)静态数据成员。
在大多数的情况下,这样做会引起重复定义这样的
错误。
即使加上#ifndef #define #endif或者#pragma once也不行。
2.静态数据成员被类的所有对象所共享(包括该类派生类的对象)
即派生类对象与基类对象共享基类的静态数据成员。
举例如下:
class base{
public :
static int _num;//声明
};
int base::_num=0;//静态数据成员的真正定义
class derived:public base{
};
main()
{
base a;
derived b;
a._num++;
cout<<"base class static data number _num is"<<a._num<<endl;
b._num++;
cout<<"derived class static data number _num is"<<b._num<<endl;
}
// 结果为1,2;可见派生类与基类共用一个静态数据成员。
3.静态数据成员可以成为成员函数的可选参数(普通数据成员则不可以)
举例如下:
class base{
public :
static int _staticVar;
int _var;
void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员
void foo2(int i=_var);//错误,_var为普通数据成员
};
4.静态数据成员的类型可以是所属类的类型(普通数据成员则不可以)
普通数据成员的只能声明为所属类类型的指针或引用。
举例如下:
class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pObject;//正确,指针
base &mObject;//正确,引用
};
5.静态数据成员的值在const成员函数中可以被合法的改变举例如下:
这个特性,我不知道是属于标准c++中的特性,还是vc6自己的特性。
class base{
public:
base(){_i=0;_val=0;}
mutable int _i;
static int _staticVal;
int _val;
void test() const{//const 成员函数
_i++;//正确,mutable数据成员
_staticVal++;//正确,static数据成员
_val++;//错误
}
};
int base::_staticVal=0;
二静态成员函数
静态成员函数没有什么太多好讲的。
1.静态成员函数的地址可用普通函数指针储存(普通成员函数地址需要用类成员函数指针来储存)
举例如下:
class base{
static int func1();
int func2();
};
int (*pf1)()=&base::func1;//普通的函数指针
int (base::*pf2)()=&base::func2;//成员函数指针
2.静态成员函数不可以调用类的非静态成员
因为静态成员函数不含this指针。
3.静态成员函数不可以同时声明为virtual、const、volatile 函数
举例如下:
class base{
virtual static void func1();//错误
static void func2() const;//错误
static void func3() volatile;//错误
};。