C++静态成员函数小结

合集下载

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函数在c语言中的用法

static函数在c语言中的用法

static函数在c语言中的用法在C语言中,静态函数(static function)是指在函数声明前加上static关键字的函数。

静态函数与非静态函数的主要区别在于,静态函数只能在声明所在的源文件中访问,不能被其他源文件调用。

以下是静态函数的用法和一些适当的拓展:1.限制函数的作用域:将函数声明为静态可以限制其只在当前文件中使用。

这样可以避免函数被其他文件中的函数或变量误用,提高代码安全性和可维护性。

2.可以避免与其他文件中相同名称的函数产生冲突:当不同文件中定义了相同名称的函数时,编译器会报错。

使用静态函数可以避免这种冲突,因为它们只在当前文件中可见。

3.减小程序的内存占用:静态函数只在声明所在的源文件中可见,其他文件无法调用。

因此,编译器在编译其他文件时不会为静态函数分配内存空间,从而减小了程序的内存占用。

4.提高函数的执行效率:由于静态函数只在当前文件中使用,编译器可以对其进行优化。

在调用静态函数时,编译器可以直接生成机器码,而不需要通过函数指针等操作,从而提高函数的执行效率。

5.提供私有函数接口:静态函数只能在当前文件中使用,对其他文件隐藏了函数的具体实现。

这样可以实现一些私有函数接口,仅供当前文件中的函数调用,增加了代码的封装性。

需要注意的是,静态函数仍然需要通过函数原型进行声明和定义,以便编译器正确解析函数调用和参数传递。

静态函数的定义可以在函数声明前或后,但必须在调用之前。

总结:静态函数在C语言中主要用于限制函数的作用域、避免函数冲突、减小内存占用、提高执行效率和提供私有函数接口等方面。

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静态函数

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++中静态成员函数与非静态成员函数的区别

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函数声明和定义

c语言static函数声明和定义1. 静态函数是一种在C语言中用于限制函数的作用域的修饰符。

通过将函数声明为静态,我们可以将其限定在当前文件内部,使其对外部文件不可见。

这在大型项目中非常有用,可以避免命名冲突和函数被错误调用的情况。

2. 在C语言中,我们可以将函数声明为静态函数,方法是在函数定义之前加上关键字"static"。

这样的声明将告诉编译器该函数只能在当前文件中使用,无法被其他文件调用。

静态函数的声明通常放在源文件的头部,以便在需要时进行调用。

3. 静态函数的定义与普通函数类似,只是在函数名前添加了关键字"static"。

静态函数可以实现与普通函数相同的功能,但其作用范围仅限于当前文件。

这意味着其他文件无法通过函数名来调用静态函数,从而确保了函数的独立性和安全性。

4. 静态函数的另一个特点是它们的生命周期与程序的整个运行周期相同,即它们在程序启动时创建,直到程序终止才销毁。

这与普通函数不同,普通函数只在被调用时才会被创建,并在调用结束后自动销毁。

5. 静态函数的另一个特性是它们无法被其他文件所访问。

这是由于静态函数的作用域仅限于当前文件。

通过将函数声明为静态,可以有效地隐藏实现细节,提高了程序的安全性和可维护性。

6. 静态函数还可以用于实现私有函数。

私有函数是指只在当前文件内部使用的函数,不需要对外公开。

通过将私有函数声明为静态,可以防止其他文件误调用该函数,从而减少了程序错误的可能性。

总结:静态函数是一种用于限制函数作用范围的修饰符,通过将函数声明为静态,可以将其限定在当前文件内部,使其对外部文件不可见。

静态函数的声明和定义方式与普通函数类似,只是在函数名前添加了关键字"static"。

静态函数的作用范围仅限于当前文件,且无法被其他文件所访问,从而提高了程序的安全性和可维护性。

静态函数还可以用于实现私有函数,以减少程序错误的可能性。

c++里的pthread_create函数小结

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。

C#静态变量总结

C#静态变量总结

C#静态变量总结在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作⽤。

但有些时候,这样做却不是个明智的选择。

假设我们要定义⼀个图书类,要求该类能保存图书的数量,即每增加⼀本图书(定义⼀个实例),图书的数量应该加1。

如果没有静态变量,我们需要将图书的数量保存在每本图书(实例)⾥,然⽽,这样的变量要在不同图书(实例)⾥重复存储,图书(实例)数量少的话,我们还能接受,如果图书(实例)数量较多的话,⽐如成千上万,我们⽆法想象这要造成多少资源(如内存、磁盘空间)的浪费,更让⼈⽆法忍受的是:因为图书(实例)的数量要保存在每本图书(实例)⾥,该值肯定是不同的。

要使这些图书(实例)中保存的图书(实例)数量⼀致,我们必须在每增加⼀本新书(⽣成⼀个新实例)时,修改其他所有图书(实例)中保存的该值。

Oh,My God!你会重新向往⾯向过程的程序设计⽅法,向往拥有全局变量的时代。

但,这种局⾯不会出现,因为C#中为你准备好了另外⼀种变量类型:静态变量。

它在类中类似全局变量,保存类的公共信息,所有该类的实例(对象)共享该值。

声明静态变量的语法如下:<访问修饰符>static 数据类型变量名;这⾥的访问修饰符跟类的其它成员⼀样,可以是public,protected,private或internal等。

在普通的成员变量前加static关键字,就变成了静态变量。

静态变量和实例变量存储⽅式不同,静态变量在声明开始,就⼀直存储在内存中,直到整个程序终⽌。

⽽实例成员在创建对象时分配内存,并存储⼀个数据副本。

所以静态成员变量认为是属于类的,⽽不是对象。

静态变量与实例变量的区别如下:1.内存分配静态变量在应⽤程序初始化时,就存在于内存当中,直到它所在的类的程序运⾏结束时才消亡;⽽实例变量需要被实例化后才会分配内存。

2.⽣存周期静态变量⽣存周期为应⽤程序的存在周期;实例变量的存在周期取决于实例化的类的存在周期。

c语言 static 函数

c语言 static 函数

c语言 static 函数C语言中的static函数static函数是一种用来在C语言中定义局部函数的特殊函数,它的作用是提供一种方法来实现函数的封装,使其变得不可见,只能在本文件或模块中使用。

它一般是由程序员自己定义的,而不是编译器自动产生的,它可以用来提高程序的可维护性和可靠性,节省内存空间。

static函数同样也是一种普通函数,它同样也有返回值,参数和函数体,但它的存储类别位static,主要有如下两点特点:1、定义的static函数只能在当前模块或文件中使用,不允许外部访问;2、static函数对外不可见,就像它被隐藏了一样,编译的时候它不会生成对外的调用入口,即该函数不能被其它函数调用。

static函数也称为私有函数,因为它只能在它所在的文件或模块中访问,其他外部文件中无法访问,这样就相当于一种封装,只有本文件中的函数才能调用static函数,这样可以让该函数仅仅被本文件内部使用。

static函数通常被用在一个文件的多个函数之间建立交互,但是不让外界访问的情况下,它的优点是可以保护程序的设计细节,而且可以提高程序的运行效率,因为编译器不会为它产生函数调用开销。

写一个例子:#include<stdio.h>int mul();int add(){int a = 10;int b = 20;int result = a+b;return result;}int mul(){int result = static_add(); result = result * 10;return result;}static int static_add(){int a = 5;int b = 10;int result = a+b;return result;}{int result = add();printf('add result = %d', result);int mul_result = mul();printf('mul result = %d', mul_result);return 0;}以上就是关于C语言中的static函数的介绍,它可以让函数保护起来不被外界访问,同时也不会产生调用开销,使程序变得更加可靠可维护,尤其是在复杂大型程序中,更是非常不可或缺。

c语言实验报告函数总结心得

c语言实验报告函数总结心得

c语言实验报告函数总结心得本次实验是关于C语言函数的学习和实践,通过对各种函数的手动实现和调用掌握了函数的概念、定义、声明、调用以及传参等知识点。

在实验过程中,我遇到了许多问题,但是通过自己的努力以及与同学和老师的交流,最终解决了这些问题,获得了许多收获和体会。

首先,函数的概念是我们学习的第一个重要知识点。

函数是一段可重用的代码,可以通过函数名进行调用,可以在程序的不同位置多次使用,提高了代码的可读性和维护性。

在函数的定义中,需要指定返回值类型、函数名、参数数量和类型等信息。

在调用函数时,需要按照函数定义中规定的参数类型和顺序传递实参,并根据需要保存函数返回值。

其次,函数的参数传递方式是我们需要掌握的难点之一。

C语言中有多种参数传递方式,包括传值、传址(指针)和传数组等。

函数参数的传递方式会对函数的运行效率和代码结构产生影响。

在实验中,我们通过手动实现字串反转、矩阵转置和选择排序等算法,深入理解了参数传递方式的运用和区别。

另外,在实验中我们还需要学习函数的声明和调用方法。

函数的声明是在不同文件中搭建合理的程序框架所必需的,在函数声明中需要指定参数类型与返回值类型。

函数的调用是在程序具体实现过程中使用的,调用函数时需输入实参,确保函数的正确调用。

在函数的声明和调用中,需要注意参数与返回值的匹配问题,以保证程序的正确性。

最后,在函数实现的过程中,可以使用循环、条件语句、指针和递归等方法,实现各种复杂的算法和操作。

循环语句可以对数据进行重复操作,条件语句可以根据不同条件选择不同的分支,指针可以提高数据的操作效率和灵活性,而递归则可以实现更复杂的算法和数据结构。

在实验过程中,我们通过实现不同的算法,对这些方法的使用和优缺点进行了深入探讨。

总之,通过这次实验,我对C语言函数有了更加深入的理解和掌握。

掌握了函数的定义、声明、调用和传参等核心知识点,同时还进一步学习了诸如指针、递归、数组、链表等数据结构和算法。

深入理解C#静态类与非静态类、静态成员的区别

深入理解C#静态类与非静态类、静态成员的区别

深⼊理解C#静态类与⾮静态类、静态成员的区别静态类静态类与⾮静态类的重要区别在于静态类不能实例化,也就是说,不能使⽤ new 关键字创建静态类类型的变量。

在声明⼀个类时使⽤static 关键字,具有两个⽅⾯的意义:⾸先,它防⽌程序员写代码来实例化该静态类;其次,它防⽌在类的内部声明任何实例字段或⽅法。

静态类是⾃C# 2.0才引⼊的,C# 1.0不⽀持静态类声明。

程序员必须声明⼀个私有构造器。

私有构造器禁⽌开发者在类的范围之外实例化类的实例。

使⽤私有构造器的效果与使⽤静态类的效果⾮常相似。

两者的区别:私有构造器⽅式仍然可以从类的内部对类进⾏实例化,⽽静态类禁⽌从任何地⽅实例化类,其中包括从类⾃⾝内部。

静态类和使⽤私有构造器的另⼀个区别在于,在使⽤私有构造器的类中,是允许有实例成员的,⽽C# 2.0和更⾼版本的编译器不允许静态类有任何实例成员。

使⽤静态类的优点在于,编译器能够执⾏检查以确保不致偶然地添加实例成员,编译器将保证不会创建此类的实例。

静态类的另⼀个特征在于,C#编译器会⾃动把它标记为sealed。

这个关键字将类指定为不可扩展;换⾔之,不能从它派⽣出其他类。

静态类的主要特性:1:仅包含静态成员。

2:⽆法实例化。

3:是密封的。

4:不能包含实例构造函数。

静态成员1:⾮静态类可以包含静态的⽅法、字段、属性或事件;2:⽆论对⼀个类创建多少个实例,它的静态成员都只有⼀个副本;3:静态⽅法和属性不能访问其包含类型中的⾮静态字段和事件,并且不能访问任何对象的实例变量;4:静态⽅法只能被重载,⽽不能被重写,因为静态⽅法不属于类的实例成员;5:虽然字段不能声明为 static const,但 const 字段的⾏为在本质上是静态的。

这样的字段属于类,不属于类的实例。

因此,可以同对待静态字段⼀样使⽤ ClassName.MemberName 表⽰法来访问 const 字段;6:C# 不⽀持静态局部变量(在⽅法内部定义静态变量)。

C++实验报告之静态成员、运算符重载

C++实验报告之静态成员、运算符重载

题目1:定义一个复数类,通过重载运算符:*,/,直接实现二个复数之间的乘除运算。

编写一个完整的程序,测试重载运算符的正确性。

要求乘法“*”用友元函数实现重载,除法“/”用成员函数实现重载。

源程序1/*******************第1题*******************//******************单森汉*****************//******************2012-5-1*****************/#include<iostream>using std::cout;using std::endl;class Complex{float Real, Image;public:Complex(float r=0,float i=0) { Real=r;Image=i;}void Show(){cout <<"Real="<<Real<<'\t'<<"Image="<<Image<<'\n';}friend Complex operator *(Complex &, Complex &);Complex operator /(Complex &); //重载运算符+Complex operator +( Complex &);friend Complex operator -(Complex &, Complex &);};Complex operator *( Complex &c1,Complex &c2){Complex t;t.Real=c1.Real * c2.Real - c1.Image * c2.Image;t.Image = c1.Image*c2.Real +c1.Real* c2.Image;return t;}Complex Complex::operator /(Complex &c){Complex t;t.Real =(Real *c.Real+ Image * c.Image)/(c.Real*c.Real+ c.Image * c.Image);t.Image = (Image *c.Real - Real * c.Image)/(c.Real*c.Real+ c.Image * c.Image);return t;}Complex Complex::operator + ( Complex &c){Complex t;t.Real = Real + c.Real;t.Image = Image + c.Image;return t;}Complex operator -(Complex &c1, Complex &c2){Complex t;t.Real=c1.Real-c2.Real;t.Image=c1.Image-c2.Image;return t;}void main(){Complex c1(1,2),c2(3,4),c3;c3=c1*c2;cout<<"两个复数的乘法c3=c1*c2:";c3.Show();c3=c1/c2;cout<<"两个复数的除法c3=c1/c2:";c3.Show();Complex c4(1,2),c5(3,4),c6,c7(1,2),c8(3,0),c9; c6=c4+c5;cout<<"两个复数的加法c6=c4+c5:";c6.Show();c6=c4-c5;cout<<"两个复数的减法c6=c4-c5:";c6.Show();c9=c7+c8;cout<<"一个复数与一个实数的加法c9=c7+c8:"; c9.Show();c9=c7-c8;cout<<"一个复数与一个实数的减法c9=c7-c8:"; c9.Show();}运行结果截图题目2:定义一个向量(一维数组)类,通过重载运算符实现向量之间的加法和减法。

关于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++中的变量根据作⽤域(知道该名字的程序⽂本区)和⽣命期(程序执⾏过程中对象存在的时间)分为全局变量、静态全局变量、局部变量和静态局部变量。

c语言中static 用法总结

c语言中static 用法总结
void count();
int main()
{
int i;
for (i = 1; i <= 3; i++)
count();
return 0;
}
void count()
{
static num = 0;
num++;
printf(" I have been called %d",num,"times\n");
存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。
auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
c
1.全局静态变量
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
}
static void staticdis()
{
printf("staticDis() has been called\n");

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语言的静态和动态函数

c语言的静态和动态函数

c语言的静态和动态函数C语言中的静态函数和动态函数是两种不同的函数类型,用于描述函数的链接属性。

在概念上,它们有一些区别和特点,本文将详细介绍它们的定义、使用和应用。

1. 静态函数(Static Function):静态函数也称为内部函数,只在声明它的文件中可见,无法被其他文件调用。

静态函数的定义使用关键字static,例如:```cstatic int add(int a, int b)return a + b;```这里的add函数是一个静态函数,只能在声明函数的源文件内部使用。

静态函数与全局函数相比,其作用域更小,不会污染其他文件的命名空间。

静态函数的特点:-静态函数只能在声明它的文件内部调用,其他文件无法访问。

-静态函数的生命周期与程序的整个运行周期保持一致,只会被初始化一次。

-静态函数不会占用外部链接符号表的空间,更不会导致符号冲突。

静态函数的适用场景:-辅助函数:用于辅助实现其他函数的功能,可以隐藏具体的实现细节。

-提高代码模块的独立性:静态函数只能在声明它的文件内使用,可以有效隔离不同模块间的依赖。

2. 动态函数(Dynamic Function):动态函数也称为外部函数,可以在其他文件中使用和调用。

动态函数没有使用static关键字进行定义,例如:```cint multiply(int a, int b)return a * b;```这里的multiply函数是一个动态函数,可以被其他文件调用。

动态函数与静态函数相比,具有更广泛的作用域。

动态函数的特点:-动态函数可以在其他文件中使用和调用。

-动态函数会占用外部链接符号表的空间,可能导致符号冲突。

-动态函数的生命周期与程序运行周期相对独立,可以多次实例化。

动态函数的适用场景:-公共接口:用于实现公共功能,可以供其他模块调用。

-动态链接库(DLL)和共享对象(SO):动态函数的特性使其成为实现动态链接库和共享对象的基础。

静态函数和动态函数的选择:-如果函数仅在当前文件中使用,可以定义为静态函数,避免全局命名冲突。

静态成员及其函数

静态成员及其函数

静态成员及其函数静态成员静态数据成员静态数据成员的基本介绍:在C++中,静态数据成员是属于类的,一旦声明某个数据成员为静态数据成员,则该类的每个对象都可以访问它。

声明格式:static数据类型数据成员名;为什么使用静态数据成员而不使用全局变量呢?原因是全局变量会带来不安全性,并且破坏了面向对象程序设计的信息隐蔽技术和封装型特点。

在一个类中,无论建立多少个对象,都只有一个静态数据成员的拷贝,从而实现了一个类的不同对象之间数据的共享。

关于静态数据成员的几点说明:1.定义格式:static数据类型数据成员名;2.其初始化与普通数据成员不同,须在类外单独进行初始化,而且初始化要在定义对象之前进行;格式:数据类型类名::静态数据成员名=初始值;3.静态数据成员属于类,而不属于某个对象,可以通过类来访问:类名::静态数据成员名4.对象访问静态数据成员格式:对象名.静态数据成员名;对象指针->静态数据成员名;静态成员函数静态成员函数的引入:静态成员函数属于类,不属于该类的某个对象,为该类的所有对象共享。

定义格式:static 返回类型静态成员函数名(实参表);调用格式:类名::静态成员函数名(实参表)对象.静态成员函数名(实参表)对象指针->静态成员函数名(实参表)关于静态成员函数的几点说明:1.静态成员函数主要用来静态数据成员;2.私有静态成员函数不能被类外部的的函数和对象访问;3.使用静态成员函数的原因是可以用它在建立任何对象之前调用静态成员函数对静态数据成员进行处理,而这一功能是普通成员函数不能做到的。

4.编译系统将静态成员函数限定为内部链接,与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这就是使用静态成员函数的另一个原因。

5.同静态数据成员一样,公有静态成员函数在类外可以使用如下格式进行调用:类名::静态成员函数名()6.静态成员函数与非静态成员函数的区别是:静态成员函数属于类,没有this指针,而非静态成员函数属于该类的某一对象,有指向该对象的this指针。

c语言函数static静态函数

c语言函数static静态函数

C语言中的静态函数在程序设计中扮演着重要的角色。

静态函数在C语言中是一种特殊类型的函数,它们具有独特的作用和特性。

在本文中,我们将详细讨论C语言中静态函数的定义、特点以及使用方法,以便读者更好地理解和掌握C语言中静态函数的知识。

一、静态函数的定义在C语言中,静态函数指的是只在定义它的源文件中可见的函数,不能被其他源文件中的函数调用。

静态函数使用关键字static进行声明,使得该函数只能在当前源文件中被调用,其他源文件无法访问该函数。

静态函数的声明方式如下:```static int add(int a, int b) {return a + b;}```上述代码中,add函数被声明为静态函数,只能在当前源文件中使用,无法被其他源文件调用。

二、静态函数的特点静态函数具有以下几点特点:1. 作用域仅限于当前源文件:静态函数只能在定义它的源文件中被调用,其他源文件无法使用该函数。

这样可以有效地控制函数的使用范围,提高程序的安全性和可维护性。

2. 避免函数名冲突:由于静态函数的作用域仅限于当前源文件,因此可以避免函数名冲突问题。

即使其他源文件中定义了相同名字的函数,也不会导致冲突。

3. 静态函数默认为内部信息:静态函数具有内部信息特性,即只能在当前源文件中引用,无法被其他源文件引用。

三、静态函数的使用方法静态函数通常用于以下几种情况:1. 辅助函数的定义:在程序设计中,有些函数只需要在特定的源文件中使用,不需要暴露给其他源文件,这时可以使用静态函数进行定义。

这样可以将辅助函数和主要函数分离,提高程序的模块化和可维护性。

2. 内部实现细节的隐藏:有些函数是一些内部实现细节的封装,不希望被其他源文件调用,这时可以使用静态函数进行定义。

这样可以隐藏内部实现细节,提高程序的安全性和可维护性。

3. 函数的重载:在C语言中没有函数的重载特性,但可以使用静态函数来模拟函数的重载。

通过为不同的函数定义静态函数,可以实现不同参数类型的函数重载效果。

C语言中static的作用及C语言中使用静态函数有何好处

C语言中static的作用及C语言中使用静态函数有何好处

C语⾔中static的作⽤及C语⾔中使⽤静态函数有何好处转⾃:在C语⾔中,static的作⽤有三条:⼀是隐藏功能,⼆是保持持久性功能,三是默认初始化为0。

在C语⾔中,static的字⾯意思很容易把我们导⼊歧途,其实它的作⽤有三条,分别是:⼀是隐藏功能,对于static修饰的函数和全局变量⽽⾔⼆是保持持久性功能,对于static修饰的局部变量⽽⾔。

三是因为存放在静态区,全局和局部的static修饰的变量,都默认初始化为0下⾯我逐⼀给⼤家介绍:(1)先来介绍它的第⼀条也是最重要的⼀条:隐藏。

当我们同时编译多个⽂件时,所有未加static前缀的全局变量和函数都具有全局可见性。

为理解这句话,我举例来说明。

我们要同时编译两个源⽂件,⼀个是a.c,另⼀个是main.c。

下⾯是a.c的内容1 2 3 4 5char a = 'A'; // global variable void msg(){printf("Hello\n");}下⾯是main.c的内容1 2 3 4 5 6 7int main(void){extern char a; // extern variable must be declared before use printf("%c ", a);(void)msg();return0;}程序的运⾏结果是:A Hello你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使⽤?前⾯说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源⽂件也能访问。

此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源⽂件main.c是可见的。

如果加了static,就会对其它源⽂件隐藏。

例如在a和msg的定义前加上static,main.c就看不到它们了。

利⽤这⼀特性可以在不同的⽂件中定义同名函数和同名变量,⽽不必担⼼命名冲突。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;//错误
};。

相关文档
最新文档