static变量和static函数的各自的特点
oc static 变量
oc static 变量在C++中,静态变量又称为静态数据成员,它与普通变量的不同之处在于,静态变量在整个程序运行期间都存在,不会因为函数或对象的销毁而消失。
静态变量可以作为类的共享数据,被所有对象所共享,也可以在全局作用域下声明和使用。
接下来,我将详细介绍静态变量在C++中的特点和用法。
1. 静态变量的声明和初始化静态变量的声明和初始化通常在类的定义中完成,但不能在类的声明中直接对静态变量进行初始化,需要在类外进行初始化。
静态变量的声明一般放在类的内部(即头文件),而初始化放在类的实现文件(即源文件)中,如下所示:cpp头文件(.h)class MyClass {public:static int count; 声明静态变量};源文件(.cpp)int MyClass::count = 0; 初始化静态变量在上述代码中,声明了一个静态变量count,并在源文件中进行了初始化。
注意,静态变量的初始化只能在类的实现文件中进行一次。
2. 静态成员函数静态成员函数是指可以直接通过类名调用的函数,该函数不依赖于任何对象,只能访问类的静态成员。
静态成员函数没有this指针,不能访问非静态成员变量和非静态成员函数。
静态成员函数通常用于执行与类相关的操作,如获取静态成员变量的值、修改静态成员变量的值等。
静态成员函数的声明和定义如下:cpp头文件(.h)class MyClass {public:static void printCount(); 声明静态成员函数};源文件(.cpp)void MyClass::printCount() { 定义静态成员函数cout << "Count: " << count << endl; 访问静态成员变量count}在上述代码中,声明了一个静态成员函数printCount,并在源文件中进行了定义。
静态成员函数可以直接通过类名调用,如MyClass::printCount()。
C++中static的作用
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。
前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。
一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。
我们先举一个静态全局变量的例子,如下://Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}void fn(){ n++;cout<<n<<endl;}静态全局变量有以下特点:该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。
对于一个完整的程序,在内存中的分布情况如下图:代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。
自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。
全局数据区的数据并不会因为函数的退出而释放空间。
细心的读者可能会发现,Example 1中的代码中将static int n; //定义静态全局变量改为int n; //定义全局变量程序照样正常运行。
的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;您可以将上述示例代码改为如下://Example 2//File1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){ n=20;cout<<n<<endl;fn();}//File2#include <iostream.h>extern int n;void fn(){ n++;cout<<n<<endl;}编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。
static全局变量与普通的全局变量有什么区别
(1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。
(2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。
(3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。
Static全局变量与普通的全局变量有什么区别:1.static全局变量只初使化一次,防止在其他文件单元中被引用;2.static局部变量只被初始化一次,下一次依据上一次结果值;3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝const关键字在C语言中用于声明”只读变量”,其值不可修改,但具有确定的数据类型。
C 编译器总是为其分配相应的存储单元。
在C++中,const关键字用于声明常量,C++编译器视具体情况决定是为其分配存储单元还是仅将其作为编译期间的常量。
在C++中,还可以修饰类的成员函数,不改变类中的数据成员.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *pASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。
如果表达式不为0,则继续执行后面的语句。
这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了就终止程序以免导致严重后果,同时也便于查找错误。
例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:const作用:修饰变量、修饰函数参数、修饰函数返回值三个作用。
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1)const变量有数据类型,而宏常量没有数据类型。
《c语言程序设计》教学大纲
《C语言程序设计》教学大纲课程名称:中文名称:C语言程序设计;英文名称:C Language Programming课程编码:161002学分:4.5分总学时:72学时,其中,理论学时:52学时;上机学时:20学时。
适用专业:全校理工科各专业先修课程:计算机基础执笔人:审订人:一、课程的性质与任务《C语言程序设计》是为全校所有的理工科专业的学生开设的公共基础课,也是一门重要的必修课。
其目的是使学生掌握程序设计的基本方法,培养学生掌握利用计算机处理问题的思维方法与应用能力。
要求学生掌握程序的三种基本结构及结构化的程序设计方法,了解并掌握几种典型的算法,并且能够熟练地运用C语言编写各种应用程序,为进一步学习其它相关课程奠定基础。
二、教学内容与学时分配第一章程序设计基本概念(3学时)本章重点:一、算法及特性;二、结构化程序设计方法。
难点:算法设计及其表示。
第一节程序和程序设计一、程序;二、程序设计。
第二节算法第三节结构化程序设计方法第四节C语言程序的基本结构第二章数据类型、运算符和表达式(5学时)本章重点:一、标识符的正确使用;二、各种基本数据类型的使用;三、算术运算符的优先级和结合性;四、表达式计算中的类型转换。
难点:一、各种类型数据在计算机内存中的存储形式;二、自增自减运算。
第一节C语言的数据类型第二节常量与变量第三节整型数据第四节实型数据第五节字符型数据第六节算术运算符与算术表达式第七节赋值运算符与赋值表达式一、赋值运算符和赋值表达式;二、复合的赋值表达式;三、自加、自减运算符;四、赋值运算中的类型转换。
第八节逗号运算符与逗号表达式第三章顺序结构程序设计(4学时)本章重点:一、printf函数;二、scanf函数。
难点:输入与输出时的格式控制。
第一节C语句概述第二节赋值语句第三节数据的输入与输出一、printf函数;二、putchar函数;三、scanf函数;四、getchar函数第四节顺序结构程序举例第四章选择结构程序设计(4学时)本章重点:一、逻辑值的表示、使用及其运算;二、关系运算符的运算规则及关系表达式;三、逻辑运算符的运算规则及逻辑表达式;四、if语句;五、switch语句的形式与执行过程。
C中的auto、static、register和extern的区别
} int A=13,B=-8;
也可以在多文件的程序中声明外部变量。
extern还可声明函数,eg:extern int fun(int a, int b);声明的外部函数可供其他文件调用,在C中,定义函数时省略extern,则隐含为外部函数 另附加一个两个关键字const和volitate
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
auto变量:函数中的局部变量,如不专门声明static,一般都是动态地分配存储空间。自动变量:在调用该函数时系统会给他们分配存储空间,一旦函数调用结束这些存储空间就会自动释放。关键字“auto”可以省略,不写则隐含确定为“自动存储类别”,属于动态存储方式。
const和static的区别
const和static的区别一、const关键字如果把const放在变量类型名前,说明这个变量的值是保持不变的,该变量必须在定义时初始化,初始化后对它进行的任何赋值都是非法的。
当指针或者引用指向一个常量时,必须在类型名前使用const标识这个指针或者引用指向的“变量”为常量,没有的话就是语法错误。
如:const int x=5; const int*px=&x;const int&rx=x;这样一来,直接修改x是不可能的,通过*px或者rx修改x也是不可能的。
当然,这个指针还能指向其他的地方,因为指针本身并没有被标识为const的。
比如,px=&y;假如变量是一个非常量变量,而指针或者引用的类型名前使用了const,那么,可以直接修改变量,不能通过指针或者引用修改变量。
如果想让一个指针本身成为const的,就要在*后加const,即int*const p =&x;这个时候,p就不能再指向其他变量。
假如x是非常量的,那它可以通过指针进行修改,因为x并没有标识为const。
当然,引用天生就是const的,它必须被初始化,而且初始化后就不能再指向新的变量。
比如,int x=5;int&r =x;r=y;第二句代码不会让r指向y,而是让x的值变成了y。
如果在函数接口(参数)中使用const,和在值、指针中使用是类似的。
但是,这就更难让函数返回指向这个参数对象的指针或者引用了。
如果允许的话,客户代码就有可能通过别名修改常量。
比如,class Point{int x,y;public:Point closestPointVal(const Point&pt){if(x*x+y*y<pt.x*pt.x+pt.y*pt.y)return*this;else return pt;}Point*closestPointPtr(const Point&pt){return(x*x+y*y<pt.x*pt.x+pt.y*pt.y)?this:&pt;}Point&closestPointRef(const Point&pt){return(x*x+y*y<pt.x*pt.x+pt.y*pt.y)?*this:pt;} };第一个函数是返回值的,不管用不用const,都不会修改实参pt。
计算机专业研究生复试-C语言程序设计面试简答题
C语言程序设计1.简述C语⾔采取了哪些措施提⾔执⾔效率●使⽤指针:有些程序⽤其他语⽤也可以实现,但C能够更有效地实现;有些程序⽤法⽤其它语⽤实现,如直接访问硬件,但C却可以。
正因为指针可以拥有类似于汇编的寻址⽤式,所以可以使程序更⽤效。
●使⽤宏函数:宏函数仅仅作为预先写好的代码嵌⽤到当前程序,不会产⽤函数调⽤,所以仅仅是占⽤了空间,⽤使程序可以⽤效运⽤。
在频繁调⽤同⽤个宏函数的时候,该现象尤其突出。
函数和宏函数的区别就在于,宏函数占⽤了⽤量的空间,⽤函数占⽤了时间。
●使⽤位操作:位操作可以减少除法和取模的运算。
在计算机程序中数据的位是可以操作的最⽤数据单位,理论上可以⽤"位运算"来完成所有的运算和操作。
灵活的位操作可以有效地提⽤程序运⽤的效率。
●将汇编指令嵌⽤到C 语⽤程序中,汇编语⽤是效率最⽤的计算机语⽤,因此在C语⽤程序中嵌⽤汇编,从⽤充分利⽤⽤级语⽤和汇编语⽤各⽤的特点。
●系统调用:在C语⽤程序中可以调⽤操作系统级的API,从⽤提⽤程序的运⽤效率。
●条件编译:C语⽤源程序中加上条件编译,让编译器只对满⽤条件的代码进⽤编译,将不满⽤条件的代码舍弃,可以减少编译及执行程序代码量。
●循环嵌套中将较长循环设为内置循环,较短循环设为外置循环,以减少cpu跨切循环层的次数,提⽤程序的运⽤效率。
(操作系统页⽤置换相关,减少页⽤置换次数)●其它诸如寄存器变量、联合体、编译器优化等手段提⽤执⽤效率。
2.if…else和switch区别总结:都是条件选中语句。
但switch语句只能取代if语句的一部分功能。
●比较的范围不同:if 语句可做各种关系比较(只要是boolean 表达式都可以用if 判断)switch语句只能做等式比较,即只能对基本类型进行数值比较。
(switch只能做几个数据类型的等式比较,实现非等式效率低,)switch之后括号内的表达式只能是整型(byte、short、char和int)、枚举型或字符型表达式,不能是长整型或其他任何类型。
static变量和static函数的各自的特点
static变量和static函数的各自的特点static变量大致分为三种用法一、用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.二、用于全局变量,主要作用是限制此全局变量被其他的文件调用.三、用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象static 声明的变量在C语言中有两方面的特征:1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。
这一点是它与堆栈变量和堆变量的区别。
2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。
这一点是它与全局变量的区别。
Tips:A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static 变量(这样的函数被称为:带“内部存储器”功能的的函数)E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
函数前加static使得函数成为静态函数。
但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。
随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。
为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。
常用的16个cc++面试题
常⽤的16个cc++⾯试题1. C中static有什么作⽤ (1)隐藏。
当我们同时编译多个⽂件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使⽤static在不同的⽂件中定义同名函数和同名变量,⽽不必担⼼命名冲突。
(2)static的第⼆个作⽤是保持变量内容的持久。
存储在静态数据区的变量会在程序刚开始运⾏时就完成初始化,也是唯⼀的⼀次初始化。
共有两种变量存储在静态存储区:全局变量和static变量。
(3)static的第三个作⽤是默认初始化为0.其实全局变量也具备这⼀属性,因为全局变量也存储在静态数据区。
在静态数据区,内存中所有的字节默认值都是0×00,某些时候这⼀特点可以减少程序员的⼯作量。
2.C++中const有什么⽤? 不要⼀听到const就说是常量,这样给考官⼀种在和⼀个外⾏交谈的感觉。
应该说const修饰的内容不可改变就⾏了,定义常量只是⼀种使⽤⽅式⽽已,还有const数据成员,const参数, const返回值, const成员函数等,被const修饰的东西都受到强制保护,可以预防意外的变动,能提⾼程序的健壮性。
3. C与C++各⾃是如何定义常量的?有什么不同? C中是使⽤宏#define定义, C++使⽤更好的const来定义。
区别: 1)const是有数据类型的常量,⽽宏常量没有,编译器可以对前者进⾏静态类型安全检查,对后者仅是字符替换,没有类型安全检查,⽽且在字符替换时可能会产⽣意料不到的错误(边际效应)。
2)有些编译器可以对const常量进⾏调试,不能对宏调试。
4. 既然C++中有更好的const为什么还要使⽤宏? const⽆法代替宏作为卫哨来防⽌⽂件的重复包含。
5. C++中引⽤和指针的区别? 引⽤是对象的别名,操作引⽤就是操作这个对象,必须在创建的同时有效得初始化(引⽤⼀个有效的对象,不可为NULL),初始化完毕就再也不可改变,引⽤具有指针的效率,⼜具有变量使⽤的⽅便性和直观性,在语⾔层⾯上引⽤和对象的⽤法⼀样,在⼆进制层⾯上引⽤⼀般都是通过指针来实现的,只是编译器帮我们完成了转换。
C#中的静态常量(const)和动态常量(static和readonly)用法和区别
C#中的静态常量(const)和动态常量(static和readonly)⽤法和区别C#中有两种常量类型,分别为readonly(运⾏时常量)与const(编译时常量),本⽂将就这两种类型的不同特性进⾏⽐较并说明各⾃的适⽤场景。
⼯作原理readonly为运⾏时常量,程序运⾏时进⾏赋值,赋值完成后便⽆法更改,因此也有⼈称其为只读变量。
const为编译时常量,程序编译时将对常量值进⾏解析,并将所有常量引⽤替换为相应值。
下⾯声明两个常量:public static readonly int A = 2; //A为运⾏时常量public const int B = 3; //B为编译时常量下⾯的表达式:int C = A + B;经过编译后与下⾯的形式等价:int C = A + 3;可以看到,其中的const常量B被替换成字⾯量3,⽽readonly常量A则保持引⽤⽅式。
声明及初始化readonly常量只能声明为类字段,⽀持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进⾏初始化,初始化完成后便⽆法更改。
const常量除了可以声明为类字段之外,还可以声明为⽅法中的局部常量,默认为静态类型(⽆需⽤static修饰,否则将导致编译错误),但必须在声明的同时完成初始化。
数据类型⽀持由于const常量在编译时将被替换为字⾯量,使得其取值类型受到了⼀定限制。
const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。
下⾯的代码⽆法通过编译:public const DateTime D = DateTime.MinValue;改成readonly就可以正常编译:1public readonly DateTime D = DateTime.MinValue;可维护性readonly以引⽤⽅式进⾏⼯作,某个常量更新后,所有引⽤该常量的地⽅均能得到更新后的值。
const的情况要稍稍复杂些,特别是跨程序集调⽤:1public class Class12 {3public static readonly int A = 2; //A为运⾏时常量4public const int B = 3; //B为编译时常量5 }67public class Class28 {9public static int C = Class1.A + Class1.B; //变量C的值为A、B之和10 }1112 Console.WriteLine(Class2.C); //输出"5"假设Class1与Class2位于两个不同的程序集,现在更改Class1中的常量值:1public class Class12 {3public static readonly int A = 4; //A为运⾏时常量4public const int B = 5; //B为编译时常量5 }编译Class1并部署(注意:这时并没有重新编译Class2),再次查看变量C的值:1 Console.WriteLine(Class2.C); //输出"7"结果可能有点出乎意料,让我们来仔细观察变量C的赋值表达式:public static int C = Class1.A + Class1.B;编译后与下⾯的形式等价:public static int C = Class1.A + 3;因此不管常量B的值如何变,对最终结果都不会产⽣影响。
C++全局变量的声明和定义
C++全局变量的声明和定义C++全局变量的声明和定义(1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备⽣成exe⽂件时,编译器做了两步⼯作: 第⼀步,将每个.cpp(.c)和相应的.h⽂件编译成obj⽂件; 第⼆步,将⼯程中所有的obj⽂件进⾏LINK,⽣成最终.exe⽂件。
那么,错误可能在两个地⽅产⽣: ⼀个,编译时的错误,这个主要是语法错误; ⼀个,链接时的错误,主要是重复定义变量等。
编译单元指在编译阶段⽣成的每个obj⽂件。
⼀个obj⽂件就是⼀个编译单元。
⼀个.cpp(.c)和它相应的.h⽂件共同组成了⼀个编译单元。
⼀个⼯程由很多编译单元组成,每个obj⽂件⾥包含了变量存储的相对地址等。
(2)声明与定义函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;函数或变量在定义时,它就在内存中有了实际的物理空间。
如果你在编译单元中引⽤的外部变量没有在整个⼯程中任何⼀个地⽅定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量。
函数或变量可以声明多次,但定义只能有⼀次。
(3) extern作⽤作⽤⼀:当它与"C"⼀起连⽤时,如extern "C" void fun(int a, int b);,则编译器在编译fun这个函数名时按C的规则去翻译相应的函数名⽽不是C++的。
作⽤⼆:当它不与"C"在⼀起修饰变量或函数时,如在头⽂件中,extern int g_nNum;,它的作⽤就是声明函数或变量的作⽤范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使⽤。
即B编译单元要引⽤A编译单元中定义的全局变量或函数时,B编译单元只要包含A编译单元的头⽂件即可,在编译阶段,B编译单元虽然找不到该函数或变量,但它不会报错,它会在链接时从A编译单元⽣成的⽬标代码中找到此函数。
C语言实验报告1-9(全)
printf("Hello world!\n"); } 运行结果:
5.录入、调试、编译和运行以下C语言程序,并写出运行结果。 #include <stdio.h> main() { int a,b,sum; a=1; b=2; sum=a+b+2; printf("sum=%d",sum); } 运行结果:
5. 参考例4.2程序,从键盘任意输入一个小写英文字母,将其转换为大写英文字母 后,将转换后的大写英文字母及其十进制ASCII码值显示在屏幕上。 #include <stdio.h> main() { char ch; printf("Press a key and then press Enter:"); ch = getchar(); ch = ch + 32; printf("%c, %d\n", ch, ch); /* 分别输出变量ch中的字符及其ASCII码值 */ } 实验体会与总结: 学会C语言的运算符和表达式的正确使用 教师批阅:
XX学院 计算机课程实验报告
(2012 ~ 2013 年度第 二 学期)
专 业 计算机科学与技术 课 程 C语言程序设计 班 级 2012级 姓 名 XXX 学 号 12237025 教 师 XX
XX学院电子信息工程学院制
实验报告填写说明
1、如为纸质版,请用钢笔或圆珠笔填写,要求字 迹工整,条理清晰。如为电子版,请务必双面打 印。 2、“实验题目”可以填写章节名称或用文字表 述,“实验目的”要逐条列出。 3、“实验内容及步骤”,控制在3-4页之内,如 程序代码所占篇幅过大,则只填入程序流程图(或 关键代码),并尽可能精简。 4、“教师批阅”处由课任老师填写评语,给出实 验成绩,并作为平时成绩,参与期末成绩总评。
定义C++全局变量常量几种方法的区别
在讨论全局变量之前我们先要明白几个基本的概念:1. 编译单元(模块):在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux 或者嵌入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了两步工作,第一步,将每个.cpp(.c)和相应.h文件编译成obj文件;第二步,将工程中所有的obj文件进行LINK生成最终的.exe文件,那么错误就有可能在两个地方产生,一个是编译时的错误,这个主要是语法错误,另一个是连接错误,主要是重复定义变量等。
我们所说的编译单元就是指在编译阶段生成的每个obj文件,一个obj文件就是一个编译单元,也就是说一个cpp(.c)和它相应的.h文件共同组成了一个编译单元,一个工程由很多个编译单元组成,每个obj 文件里包含了变量存储的相对地址等。
2. 声明与定义的区别函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过,但是当函数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!你也可以这样理解,对同一个变量或函数的声明可以有多次,而定义只能有一次!3. extern的作用extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b); 则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可, 在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。
const和static的区别
const和static的区别
const和static的区别
⼀、const
1.static 局部变量将⼀个变量声明为函数的局部变量,那么这个局部变量在函数执⾏完成之后不会被释放,⽽是继续保留在内存中
2.static 全局变量表⽰⼀个变量在当前⽂件的全局内可访问
3.static 函数表⽰⼀个函数只能在当前⽂件中被访问
4.static 类成员变量表⽰这个成员为全类所共有
5.static 类成员函数表⽰这个函数为全类所共有,⽽且只能访问静态成员变量
作⽤:
(1)函数体内static变量的作⽤范围为该函数体,该变量的内存只被分配⼀次,因此其值在下次调⽤时仍维持上次的值;
(2)在模块内的static全局变量和函数可以被模块内的函数访问,但不能被模块外其它函数访问;
(3)在类中的static成员变量属于整个类所拥有,对类的所有对象只有⼀份拷贝;
(4)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因⽽只能访问类的static成员变量。
⼆、static
1.const 常量:定义时就初始化,以后不能更改。
2.const 形参:func(const int a){};该形参在函数⾥不能改变
3.const修饰类成员函数:该函数对成员变量只能进⾏只读操作
作⽤:
(1)阻⽌⼀个变量被改变
(2)声明常量指针和指针常量
(3)const修饰形参,表明它是⼀个输⼊参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是⼀个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为”左值”。
Unity面试题(二)
Unity⾯试题(⼆)1.以下哪⼀个选项不属于Unity引擎所⽀持的视频格式⽂件(D)A.后缀为mov的⽂件B.后缀为mpg的⽂件C.后缀为avi的⽂件D.后缀为swf的⽂件2.Unity引擎使⽤的是左⼿坐标系还是右⼿坐标系(A)A.左⼿坐标系B.右⼿坐标系C.可以通过ProjectSetting切换右⼿坐标系D.可以通过Reference切换左⼿坐标系3.什么是导航⽹格(NavMesh)(B)A.⼀种⽤于描述相机轨迹的⽹格B.⼀种⽤于实现⾃动寻址的⽹格C.⼀种被优化过的物体⽹格D.⼀种⽤于物理碰撞的⽹格4.下列选项中有关Animator的说法错误的是?(D)A.Animator是Unity引擎中内置的组件B.任何⼀个具有动画状态机功能的GameObject都需要⼀个Anim组件C.它主要⽤于⾓⾊⾏为的设置,包括StateMachine、混合树BlendTrees以及同通过脚本控制的事件D.Animator同Animation组件的⽤法是相同的5.Application.loadLevel命令为(A)A.加载关卡B.异步加载关卡C.加载动作D.加载动画6.下列选项中,关于Transform组件的Scale参数描述正确的是(A)A.Transform组件的Scale参数不会影响ParticleSystem产⽣粒⼦的⼤⼩B.Transform组件的Scale参数不会影响GUITexture的⼤⼩C.添加Collider组件后的GameoObject,其 Collider 组件的尺⼨不受Transform组件的Scale参数影响D.添加Rigidbody组件后的物体,⼤⼩将不再受Transform组件中 Scale 参数的影响7.在 Unity 中的场景中创建 Camera 时,默认情况下除了带有Transform、Camera、GUILayer、Flare Layer 组件之外,还带有以下哪种组件(C)A.Mouse LookB.FPS Input ControllerC.Audio ListenerD.Character Motor8.如果将⼀个声⾳剪辑⽂件从Project 视图拖动到 Inspector 视图或者 Scene 视图中的游戏对象上,该游戏对象会⾃动添加以下哪种组件(C)A.Audio ListenerB.Audio ClipC.Audio SourceD.Audio Reverb Zone9.下列叙述中有关 Prefab 说法错误的是哪⼀项(B)A.Prefab 是⼀种资源类型B.Prefab 是⼀种可以反复使⽤的游戏对象C.Prefab 可以多次在场景进⾏实例D.当⼀个 Prefab 添加到场景中时,也就是创建了它的⼀个实例10.关于 teUpdate 函数描述错误的是:(B)A.当 MonoBehaviour 类被启⽤后,每帧调⽤⼀次B.常被⽤于处理 Rigidbody 的更新C.在所有 Update 函数执⾏后才能被调⽤D.常被⽤于实现跟随相机效果,且⽬标物体的位置已经在 Update 函数中被更新11.下列哪个函数不属于碰撞事件(C)A.OnCollisionEnterB.OnCollisionExitC.OnCollisionUpdateD.OnCollisionStay12.以下关于 MonoBehaviour.OnGUI()的描述错误的是(D)A.如果 MonoBehaviour 没有被启⽤,则OnGUI函数不会被调⽤B.⽤于绘制和处理 GUI eventsC.每帧可能会被绘制多次,每次对应于⼀个 GUI eventD.每帧被调⽤⼀次13.以下哪组摄像机中 Normalized View Port Rect 的数值设置可以使摄像机显⽰的画⾯位于1280*720分辨率的屏幕画⾯右上⾓(D)A.X=640,Y=360,W=640,H=360B.X=640,Y=0,W=640,H=360C.X=0,Y=0,W=0.5,H=0.5D.X=0.5,Y=0.5,W=0.5,H=0.514.在Unity引擎中,Collider所指的是什么(D)A.collider 是Unity引擎中所⽀持的⼀种资源,可⽤作存储⽹格信息B.Collider 是Unity引擎中内置的⼀种组件,可⽤对⽹格进⾏渲染C.Collider 是Unity引擎中所⽀持的⼀种资源,可⽤作游戏对象的坐标转换D.Collider 是Unity引擎中内置的⼀种组件,可⽤作游戏对象之间的碰撞检测15.以下关于WWW.LoadFromCacheOrDownload描述正确的是(C)A.可被⽤于将 Text Assets ⾃动缓存到本地磁盘B.可被⽤于将 Resource ⾃动缓存到本地磁盘C.可被⽤于将 Asset Bundles ⾃动缓存到本地磁盘D.可被⽤于将任意格式的Unity资源⽂件⾃动缓存到本地磁盘16.如何实现加载外部视频并播放?外部视频⽂件:⽬前测试仅⽀持ogg格式(设置⽹络获取视频时,必须将MIME设置.ogg为application/octet-stream)场景设置:MainCamera上添加AudioSource脚本;播放物体上(如Plane)添加MovieTest脚本MovieTest脚本:using UnityEngine;using System.Collections;public class MovieTest : MonoBehaviour{//视频纹理protected MovieTexture movTexture;AudioClip audio;AudioSource AudioSource1;void Start(){StartCoroutine(DownLoadMovie());}void OnGUI(){if (GUILayout.Button("播放/继续")){//播放/继续播放视频if (!movTexture.isPlaying){movTexture.Play();AudioSource1.Play();}}if (GUILayout.Button("暂停播放")){//暂停播放movTexture.Pause();AudioSource1.Pause();}if (GUILayout.Button("停⽌播放")){//停⽌播放movTexture.Stop();AudioSource1.Stop();}}//获取主相机的声源AudioSource1 = Camera.main.GetComponent(typeof(AudioSource)) as AudioSource;//获取视频的声⾳设置到声源上AudioSource1.clip = movTexture.audioClip;audio = AudioSource1.clip;//设置当前对象的主纹理为电影纹理renderer.material.mainTexture = movTexture;//设置电影纹理播放模式为循环movTexture.loop = true;}}17.游戏对象B是游戏对象A的⼦物体,游戏对象A经过了旋转,请写出游戏B围绕⾃⾝的Y轴进⾏旋转的脚本语句,以及游戏对象B围绕世界坐标的Y轴旋转的脚本语句。
JAVA深刻复习带答案解析
第一章java 开发入门1.java语言的特点:简单,面向对象,安全,跨平台,支持多线程。
简单:(丢弃了C++中难于理解的运算符重载,多继承,指针等,并且提供自动垃圾回收机制)面向对象:只支持单继承,纯面向对象的语言。
安全:不支持指针,一切内存访问必须通过对象实例来实现,从而使应用更安全。
跨平台:同一段程序既可以在window运行也可以在Linux运行多线程:支持多线程。
下列选项哪个不属于java语言包含的内容?()A 具有类与对象B 一次编译处处运行C 具有多线程的能力D 具有多继承的特点下列关于java语言特点错误的是()A.java语言可以进行面向对象编程也可以面向过程编程B.java语言是面向对象的语言C.java语言支持跨平台编程D.java语言支持多线程下列特点不属于java语言的是()A.多线程B.多继承C.跨平台D.垃圾自动回收2.java程序为什么能跨平台?通过java虚拟机可以达到跨平台的特性。
3. java程序的编译过程:源文件a.java-→编译 a.class(字节码文件) →虚拟机运行下面哪种类型的文件可以在java虚拟机中运行?A . .java B. .jre C. .exe D. .class在Java中负责对字节码解释执行的是( )。
A.垃圾回收器B.虚拟机C.编译器D.多线程机制编译Java Application 源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为( )。
A. .javaB. .classC. .htmD. .exe第二章java编程基础1.java代码基本格式java语言区分大小写,程序代码必须写在一个类中Java中main()函数的返回值是()。
A、StringB、intC、charD、voidvoid的含义( )A方法没有返回值B方法体为空C没有意义 D. 定义方法时必须使用2. java标识符可以由任意顺序的大小写字母、数字、下划线_和美元符号$组成,但不能以数字开头,不能是java关键字。
Java作业习题
一、Java语言介绍(一)填空题1.Java语言使用的是字符集,每个字符在内存中占16位。
2.Java2平台的三个成员分别是:、、。
(二)简答题1.Java2平台主要有哪几个成员?各自应用于什么场合?二、Java程序设计基础(一)填空题1.在一个Java源文件中定义了2个类,每个类中都有5个方法,编译该Java源文件时产生个字节码文件,其扩展名是。
答案: 2,class 2.Java平台由两个组件构成:、,从而将程序与硬件分离实现跨平台功能。
3.Java源文件中最多只能有一个类,此类必须和源文件名同名,其他类的个数不限。
4.在命令行状态,使用对Java源程序进行编译,使用对字节代码进行解释执行。
(二)选择题1.下面main( )方法的定义哪些是正确的()。
A.public static void main(String args) {}B.public static void main(String[] ) {}C.public static void main(String[] args) {}D.public static void main(string[] args) {}2.下列方法定义中方法头不正确的是().A.public int method( ) {…}B.public static int method(double y ) {…}C.void method( ) {…}D.public static method( double a) {…}3.指出下列哪些不是与方法public void add(int a) { }重载()。
A.public int add(int a)B.public void add(long a)C.public void add(int a, int b)D.public void add(float a)4.下列关于静态方法的描述中,错误的是()A. 在类体内说明静态方法使用关键字staticB. 静态方法只能处理静态变量或调用静态方法C. 静态方法不占用对象的内存空间,非静态方法占用对象的内存空间D. 静态方法只能用类名调用5.只包含一个带public修饰的Java类Abc的Java程序的正确命名是()A. AbcB. Abc.javaC. abc.javaD. 一个任意的标识符后带后缀.java(三)补充代码题1.下面两段程序均实现打印输出“Hello World!”字符串,读懂程序并填空。
static的用法和作用
static的用法和作用
static的用法和作用如下:
在C语言中,static关键字主要定义全局静态变量、局部静态变量、静态函数。
定义全局静态变量:在全局变量前加上关键字static,该全局变量就变成了全局静态变量。
特点是在静态存储区分配内存,在整个程序运行期间一直有效。
如果未对其进行初始化,其默认值为0。
该变量在本文件内从定义开始到文件结束可见。
定义局部静态变量:在局部变量前加上关键字static,该局部变量就变成了局部静态变量。
特点是在静态存储区分配内存。
如果未对其进行初始化,其将被隐式初始化为0。
始终驻留在静态存储区,知道程序运行结束。
其作用域为局部作用域。
定义静态函数:在函数的返回类型加上static关键字,函数就变成了静态函数。
静态函数只能在本源文件中使用。
extern函数声明(转)
extern函数声明(转)转⾃:extern 函数声明 常常见extern放在函数的前⾯成为函数声明的⼀部分,那么,C语⾔的关键字extern在函数的声明中起什么作⽤? 答案与分析: 如果函数的声明中带有关键字extern,仅仅是暗⽰这个函数可能在别的源⽂件⾥定义,没有其它作⽤。
即下述两个函数声明没有明显的区别:extern int f(); 和int f(); 当然,这样的⽤处还是有的,就是在程序中取代include “*.h”来声明函数,在⼀些复杂的项⽬中,我⽐较习惯在所有的函数声明前添加extern修饰。
关于这样做的原因和利弊可见下⾯的这个例⼦:“⽤extern修饰的全局变量”(1) 在test1.h中有下列声明:#ifndef TEST1H#define TEST1Hextern char g_str[]; // 声明全局变量g_strvoid fun1();#endif(2) 在test1.cpp中#include "test1.h"char g_str[] = "123456"; // 定义全局变量g_strvoid fun1() { cout << g_str << endl; }(3) 在test1.cpp中。
以上是test1模块,它的编译和连接都可以通过,如果我们还有test2模块也想使⽤g_str,只需要在原⽂件中引⽤就可以了 #include "test1.h"void fun2() { cout << g_str << endl; }以上test1和test2可以同时编译连接通过,如果你感兴趣的话可以⽤ultraEdit打开test1.obj,你可以在⾥⾯找到"123456"这个字符串,但是你却不能在test2.obj⾥⾯找到,这是因为g_str是整个⼯程的全局变量,在内存中只存在⼀份,test2.obj这个编译单元不需要再有⼀份了,不然会在连接时报告重复定义这个错误!(4) 有些⼈喜欢把全局变量的声明和定义放在⼀起,这样可以防⽌忘记了定义,如把上⾯test1.h改为extern char g_str[] = "123456"; // 这个时候相当于没有extern然后把test1.cpp中的g_str的定义去掉,这个时候再编译连接test1和test2两个模块时,会报连接错误,这是因为你把全局变量g_str的定义放在了头⽂件之后,test1.cpp这个模块包含了test1.h所以定义了⼀次g_str,⽽test2.cpp也包含了test1.h所以再⼀次定义了g_str,这个时候连接器在连接test1和test2时发现两个g_str。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static变量和static函数的各自的特点
static变量大致分为三种用法
一、用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.
二、用于全局变量,主要作用是限制此全局变量被其他的文件调用.
三、用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象 static 声明的变量.
在C语言中有两方面的特征:
1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。
这一点是它与堆栈变量和堆变量的区别。
2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。
这一点是它与全局变量的区别。
Tips:
A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
D.如果我们需要一个可重入的函数,那么,我们一定
要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
函数前加static使得函数成为静态函数。
但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。
随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。
为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。
最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。
全局变量、静态全局变量、静态局部变量和局部变量的区别变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从
以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static函数与普通函数作用域不同。
仅在本文件。
只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。
局部变量的值不可知。