静态成员函数一般情况下只能访问静态成员变量
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'。
2024年6月GESP编程能力认证C++等级考试六级真题(含答案)
2024年6月GESP编程能力认证C++等级考试六级真题(含答案) 一、单选题(每题2分,共30分)。
1.面向对象的编程思想主要包括()原则。
A. 贪心、动态规划、回溯。
B. 并发、并行、异步。
C. 递归、循环、分治。
D. 封装、继.承、多态。
2.运行下列代码,屏幕上输出()。
A. 1 1 1B. 1 2 3C. 1 1 2D. 1 2 23.运行下列代码,屏幕上输出()。
A. rectangle area: triangle area:B. parent class area: parent class area:C. 运行时报错D. 编译时报错4.向一个栈顶为hs的链式栈中插入一个指针为s的结点时,应执行()。
A. hs->next =s;B. s->next =hs;hs =s;C. s->next =hs->next;hs->next =s;D. s->next =hs;hs =hs->next;5.在栈数据结构中,元素的添加和删除是按照什么原则进行的()。
A. 先进先出B. 先进后出C. 最小值先出D. 随机顺序6.要实现将一个输入的十进制正整数转化为二进制表示,下面横线上应填入的代码为()。
7.下面定义了一个循环队列的类,请补全判断队列是否满的函数,横向上应填写()。
A. return(rear +1)% capacity ==front;B. return rear % capacity ==front;C. return rear ==front;D. return(rear +1)==front;8.对“classmycls”使用哈夫曼(Huffman)编码,最少需要()比特。
A. 10B. 20C. 25D. 309.二叉树的()第一个访问的节点是根节点。
A. 先序遍历B. 中序遍历C. 后序遍历D. 以上都是10.一棵5层的满二叉树中节点数为()。
C++面试问答100道
C++经典⾯试题100例及答案1. ⾯向对象的程序设计思想是什么?答:把数据结构和对数据结构进⾯操作的⾯法封装形成⾯个个的对象。
2. 什么是类?答:把⾯些具有共性的对象归类后形成⾯个集合,也就是所谓的类。
3. 对象都具有的两⾯⾯特征是什么?分别是什么含义?答:对象都具有的特征是:静态特征和动态特征。
静态特征是指能描述对象的⾯些属性(成员变量),动态特征是指对象表现出来的⾯为(成员函数)4. 在头⾯件中进⾯类的声明,在对应的实现⾯件中进⾯类的定义有什么意义?答:这样可以提⾯编译效率,因为分开的话只需要编译⾯次⾯成对应的.obj⾯件后,再次应⾯该类的地⾯,这个类就不会被再次编译,从⾯⾯⾯的提⾯了编译效率。
5. 在类的内部定义成员函数的函数体,这种函数会具备那种属性?答:这种函数会⾯动为内联函数,这种函数在函数调⾯的地⾯在编译阶段都会进⾯代码替换。
6. 成员函数通过什么来区分不同对象的成员数据?为什么它能够区分?答:通过this指针指向对象的⾯地址来区分的。
7. C++编译器⾯动为类产⾯的四个缺省函数是什么?答:默认构造函数,拷贝构造函数,析构函数,赋值函数。
8. 拷贝构造函数在哪⾯种情况下会被调⾯?答:1.当类的⾯个对象去初始化该类的另⾯个对象时;2.如果函数的形参是类的对象,调⾯函数进⾯形参和实参结合时;3.如果函数的返回值是类对象,函数调⾯完成返回时。
9.构造函数与普通函数相⾯在形式上有什么不同?答:1.构造函数是类的⾯种特殊成员函数,⾯般情况下,它是专门⾯来初始化对象成员变量的。
2.构造函数的名字必须与类名相同,它不具有任何类型,不返回任何值。
10. 什么时候必须重写拷贝构造函数?答:当构造函数涉及到动态存储分配空间时,要⾯⾯写拷贝构造函数,并且要深拷贝。
11. 构造函数的调⾯顺序是什么?答:1.先调⾯基类构造函数2.按声明顺序初始化数据成员3.最后调⾯⾯⾯的构造函数。
12. 哪⾯种情况必须⾯到初始化成员列表?答:1.类的成员是常量成员初始化;2.类的成员是对象成员初始化,⾯该对象没有⾯参构造函数。
static 用法
static 用法static 用法1. static 变量•定义:在函数内部使用 static 关键字声明的变量称为静态变量。
•特点:–静态变量的生命周期在整个程序运行期间都存在,而不仅仅在函数调用时才存在。
–静态变量存储在静态存储区,不会在函数调用结束后释放内存。
•使用场景:–如果一个变量需要在多次函数调用之间保持其值不变,可以使用静态变量。
–静态变量通常用于计数器或者保存函数的返回值等场景。
•示例代码:#include <>int count() {static int counter = 0;counter++;return counter;}int main() {printf("%d\n", count()); // 输出1printf("%d\n", count()); // 输出2printf("%d\n", count()); // 输出3return 0;}2. static 函数•定义:在函数返回类型前面加上 static 关键字,使函数变为静态函数。
•特点:–静态函数只能在声明它的源文件内部调用,不能被其他源文件使用。
–静态函数不能被其他源文件中的函数调用,从而起到了隐藏的作用。
•使用场景:–当某个函数只在当前源文件内部使用时,可以将其声明为静态函数,以减少命名冲突和提高代码的模块化程度。
•示例代码:#include <>static int multiply(int a, int b) {return a * b;}int main() {int result = multiply(2, 3);printf("%d\n", result); // 输出6return 0;}3. static 类成员•定义:在类中声明的 static 成员属于类本身,而不是类的实例。
•特点:–所有的对象共享同一个静态成员,即静态成员对于所有的对象来说只有一份拷贝。
const用法介绍
const,extern,static,volatile的使用 (1)Const 深度解析 (3)const用法详解 (7)const,extern,static,volatile的使用1.const的用法:为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。
const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)用法1:常量取代了C中的宏定义,声明时必须进行初始化。
const限制了常量的使用方式,并没有描述常量应该如何分配。
如果编译器知道了某const的所有使用,它甚至可以不为该const分配空间。
最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。
―《C++ Program Language》用const声明的变量虽然增加了分配空间,但是可以保证类型安全。
C标准中,const定义的常量是全局的,C++中视声明位置而定。
用法2:指针和常量使用指针时涉及到两个对象:该指针本身和被它所指的对象。
将一个指针的声明用const“预先固定”将使那个对象而不是使这个指针成为常量。
要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const。
所以出现在 * 之前的const是作为基础类型的一部分:char *const cp; //到char的const指针char const *pc1; //到const char的指针const char *pc2; //到const char的指针(后两个声明是等同的)从右向左读的记忆方式:cp is a const pointer to char.pc2 is a pointer to const char.用法3:const修饰函数传入参数将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。
同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。
最新版C++程序设计语言(第2次)作业(含答案)
第2次作业一、单项选择题(本大题共50分,共 20 小题,每小题 2.5 分)1. 类A从类B派生而来,下面()可以在类A的构造函数中调用基类B的构造函数A.class A : public B {public: A(int i){B(i)};}B.class A : public B {public: A(int i):B(i){};}C.class A : public B {public: A(int i):B(int i){};}D.class A : public B {public: A(int i){B(int i)};}2. C++的函数有函数头和函数体两部分组成,下面所列的函数头书写格式中不正确的是()。
A. main(int a,int b)B. main(int a,int b=1)C. main(int a=0,int b)D. main(int a=2,int b=3)3. 下列存取控制符中,()能够限定类外代码不能访问被它修饰的成员。
A.privateB.publicC.protectedD.private和protected都可以4. 下列()能够正确地申明友元函数,让函数fun能够访问类A的私有成员。
A.void fun() friend class A;B.Friend class A{private: int i; void fun();};C.class A{private: int i; friend fun();};D.class A{private: int i; friend void fun();};5. 类A的定义代码如下: class A{ public: A(int i){this->i=i;}setI(int i){this->i=i;} private: int i; }; 下列代码中,()能够正确申明类A的常对象,并给i成员赋初值。
C++自测题
一. 选择(共50题,共1分)1. 下列关于类和对象的叙述中,错误的是( )A.一个类只能有一个对象B.对象是类的具体实例C.类是对某一类对象的抽象D.类和对象的关系是一种数据类型与变量的关系2. 当将一个类A或函数f()说明为另一个类B的友元后,类A或函数f()能够直接访问类B的( )。
A.只能是公有成员B.只能是保护成员C.只能是除私有成员之外的任何成员D.任何权限的成员3. 类中定义的成员默认为( )访问属性。
A.publicB.privateC.protectedD.friend4. 一个类的友元不是该类的成员,与该类的关系密切,所以它(D )。
A.有this指针,有默认操作的对象B.没有this指针,可以有默认操作的对象C.有this指针,不能执行默认操作D.没有this指针,也就没有默认操作的对象5. 假定AA为一个类,a为该类私有的数据成员,GetValue()为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为( )。
A.x.aB.x.a()C.x->GetValue()D.x.GetValue()6. 对于任一个类,用户所能定义的构造函数的个数至多为( )。
A.0B.1C.2D.任意个7. 一个类的析构函数通常被定义为该类的( )成员。
A.私有B.保护C.公用D.友元8. 有如下类声明:class Foo {int bar; };则Foo类的成员bar 是()A.公有数据成员B.公有成员函数C.私有数据成员D.私有成员函数9. 关于封装,下列说法中不正确的是( )。
A.通过封装,对象的全部属性和操作结合在一起,形成一个整体B.通过封装,一个对象的实现细节被尽可能地隐藏起来(不可见)C.通过封装,每个对象都成为相对独立的实体D.通过封装,对象的属性都是不可见的10. 假定AB为一个类,则执行“AB *s=new AB(a,5);”语句时得到的一个动态对象为( )。
Java语言程序设计(专升本)_B
Java语言程序设计(专升本)_B2010 —2011学年第二学期考试试卷考试课程: Java 语言程序设计试卷类别:A 卷□ B 卷 C 卷□ 考试形式:闭卷开卷□ 适用专业年级: 10软件工程(专升本)班级姓名学号题号一二三四总分得分一、单选题,下列试题每题只有一个正确的选项,请把正确的选项,填写到答题纸上。
总共25小题,每小题2分,共50分。
得分 1、下面哪个关键字,使类不能在被其他的类继承?A) static B) finally C) final D) instance 2、程序如下:class Test { public static void main(String[] args) { int i=1000; for(;;) { if(i>999) { _______________ } } } }装订线下面对程序的横线处填写不同语句的分析正确的是:A) 填充break 使程序能够有退出循环的可能性。
B) 填充continue 将使程序成为死循环,永远无法退出循环。
C) 填充continue 使程序能够有退出循环的可能性。
D) 填充break 将使程序成为死循环,永远无法退出循环。
3、下面关于抽象类描述错误的是:A) 抽象类的关键字是abstract,在抽象类中可以定义变量和方法。
B) 抽象类中的方法如果可以有实现体,如果没有实现体,则该方法叫做抽象方法必须加关键字abstract修饰该方法。
C) 抽象类中至少需要有一个方法被定义为抽象方法,在该方法前加abstract,把该方法定义为抽象方法。
D) 抽象类中可以没有抽象方法,即所有的方法全部都有实现体。
但是依旧不能为抽象类定义对象。
4、下面关于重载描述错误的是:A) 重载方法的返回值必须相同。
B) 重载方法的参数必须有不同之处。
C) 重载方法的名字必须相同,否则就不能称为重载了。
D) 重载方法的返回类型相不相同都可以。
5、程序如下:class Test{private int day;private int month;public String getDate(){return day+"/"+month;}}class Test2{public static void main(String[] args){Test test=new Test();test.day=25;System.out.println(test.getDate());}共9页第2 页}有关类的描述正确的是:A) 程序在编译时将出错。
C 习题
一、单项选择题1.有以下类的说明,请指出错误的地方_。
class CSample{int a=2. 5;(A)Csample();(B)public:CSample(int val);(C)-CSample();(D)};答:A分析:类的数据成员不能直接赋初值。
2.在C+十中,可以把具有相同内部存储结构和相同操作的对象看成属于同一类。
在指定一个类后,往往把属于这个类的对象称为类的①。
从语言角度来说,类是一种数据类型,而②是具有这种类型的变量。
A.实例B.实物C.特征D.对象答:①A②D3.有关类的说法不正确的是。
A.类是一种用户自定义的数据类型B.只有类中的成员函数才能存取类中的私有数据C.在类中,如果不作特别说明,所有的数据均为私有类型D.在类中,如果不作特别说明,所有的成员函数均为公有类型答:D4.有关类和对象的说法下列不正确的有。
A.对象是类的一个实例B.任何一个对象只能属于一个具体的类C.一个类只能有一个对象D.类与对象的关系和数据类型和变量的关系相似答:C5.有关构造函数的说法不正确的是。
A.构造函数名字和类的名字一样B.构造函数在说明类变量时自动执行C.构造函数无任何函数类型D.构造函数有且只有一个答:D6.有关析构函数的说法不正确的是。
A.析构函数有且只有一个B.析构函数无任何函数类型C.析构函数和构造。
数一样可以有形参D.析构函数的作用是在对象被撤消时收回先前分配的内存空间答:C分析:构造函数可以有形参,但析构函数不能有形参。
7.在类的定义体外定义成员函数时,需要在函数名前加上(1) ,而在域外使用成员函数时,需要在成员名外加上②的名字。
A类标记B.类域标记C.类对象D.域运算符答:①B②C8.若函数是在运行时被激活的,则该函数称为。
A内联函数B.非内联函数C.成员函数D.静态成员函数答:B9.在类的定义形式中,数据成员、成员函数和组成了类定义体。
A.成员的访问控制信息B.公有消息C.私有消息D.保护消息答:A10.的功能是对对象进行初始化。
静态成员函数
静态成员函数静态成员函数是C++中一种重要的函数,由于它不依赖类的实例,因此又被称为“类函数”或“独立函数”。
静态成员函数的使用有很多优势,特别是在程序的性能方面。
由于静态成员函数不依赖类的实例,不同的类的实例可以共享同一个函数。
这样可以避免重复定义函数,节省空间。
因此,静态成员函数的使用可以提升程序的性能。
在使用静态成员函数时,需要注意,静态成员函数只能访问静态成员变量,而不能访问类的普通成员变量。
这是因为静态成员函数是单独定义的函数,不依赖于任何实例,所以不能访问类的普通成员变量。
另外,在静态成员函数中,不能调用非静态成员函数,因为非静态成员函数操作的数据是类的实例,而静态成员函数却不能操作实例数据。
在定义静态成员函数时,需要在函数声明之前使用关键字static 进行标记,声明时也需要指定类名称,以防止函数名称重复。
可以使用类名和作用域限定符来表明函数声明。
例如,可以使用以下格式来声明一个静态成员函数:ClassNa:staticFunctionName(parameters){//函数内容}当程序需要通过静态成员函数来调用某个类的普通成员函数时,可以使用指向对象的指针或引用来调用。
如下所示:ClassNa:staticFunctionName(ClassName *pObject, parameters){//通过指针调用普通成员函数pObject->normalFunctionName(parameters);}使用静态成员函数可以提高程序性能,同时又不影响程序的灵活性。
但在使用静态成员函数时,需要注意不能调用非静态成员函数,也不能访问类的普通成员变量。
另外,定义静态成员函数时,需要注意函数名不能重复,以防出现命名冲突。
综上所述,静态成员函数是C++语言中一种重要的功能,它可以共享函数,提高程序性能,同时又不降低程序的灵活性,是一种有效地编程技巧。
【黑马程序员】C语言面试必须掌握的20道技术面试题,不看就等于被Pass
【黑马程序员】C语言面试必须掌握的20道技术面试题,不看就等于被Pass问1:请用简单的语言告诉我C++ 是什么?答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。
C++支持多种编程范式--面向对象编程、泛型编程和过程化编程。
其编程领域众广,常用于系统开发,引擎开发等应用领域,是最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性!问2:C和C++的区别?答:c++在c的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。
C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
问3:什么是面向对象(OOP)?答:面向对象是一种对现实世界理解和抽象的方法、思想,通过将需求要素转化为对象进行问题处理的一种思想。
问4:什么是多态?答:多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。
不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态。
问5:设计模式懂嘛,简单举个例子?答:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
比如单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用于:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
比如工厂模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。
Factory Method 使一个类的实例化延迟到其子类。
适用于:当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
C++自测题(ANSWER)
一. 选择(共50题,共1分)1. 下列关于类和对象的叙述中,错误的是( )A.一个类只能有一个对象B.对象是类的具体实例C.类是对某一类对象的抽象D.类和对象的关系是一种数据类型与变量的关系2. 当将一个类A或函数f()说明为另一个类B的友元后,类A或函数f()能够直接访问类B的( )。
A.只能是公有成员B.只能是保护成员C.只能是除私有成员之外的任何成员D.任何权限的成员3. 类中定义的成员默认为( )访问属性。
A.publicB.privateC.protectedD.friend4. 一个类的友元不是该类的成员,与该类的关系密切,所以它(D )。
A.有this指针,有默认操作的对象B.没有this指针,可以有默认操作的对象C.有this指针,不能执行默认操作D.没有this指针,也就没有默认操作的对象5. 假定AA为一个类,a为该类私有的数据成员,GetValue()为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为( )。
A.x.aB.x.a()C.x->GetValue()D.x.GetValue()6. 对于任一个类,用户所能定义的构造函数的个数至多为( )。
A.0B.1C.2D.任意个7. 一个类的析构函数通常被定义为该类的( )成员。
A.私有B.保护C.公用D.友元8. 有如下类声明:class Foo {int bar; };则Foo类的成员bar 是()A.公有数据成员B.公有成员函数C.私有数据成员D.私有成员函数9. 关于封装,下列说法中不正确的是( )。
A.通过封装,对象的全部属性和操作结合在一起,形成一个整体B.通过封装,一个对象的实现细节被尽可能地隐藏起来(不可见)C.通过封装,每个对象都成为相对独立的实体D.通过封装,对象的属性都是不可见的10. 假定AB为一个类,则执行“AB *s=new AB(a,5);”语句时得到的一个动态对象为( )。
C++复习题及答案
C++复习题及答案一、选择题1、关于C++与C语言关系的描述中,(D )是错误的。
A C语言是C++语言的一个子集 B C语言与C++语言是兼容的 C C++语言对C语言进行了一些改进 D C++语言和C语言都是面向对象的2、下列说法中不正确的是( C)。
A 对象是类的一个实例B 任何一个对象只能属于一个类C 一个类只能有一个对象D 类与对象间的关系和数据类型与变量间关系相类似3、当将一个类A或函数f( )说明为另一个类B的友元后,类A或函数f( )能够直接访问类B的( D )。
A 只能是公有成员B 只能是保护成员C 只能是除私有成员之外的任何成员D 任何权限的成员 4、(B )是析构函数的特征。
A 析构函数在对象创建时调用B 一个类中只能定义一个析构函数C 析构函数的定义只能在类体内D 析构函数可以有一个或多个参数5、要声明一个有10个int型元素的数组,正确的语句是(A ) A int a[10]B int a[2,5]C int a[]D int *a[10]6、如果变量x,y已经正确定义,下列语句哪一项不能正确将x,y的值进行交换( D)。
A x=x+y,y=x-y,x=x-yB t=x,x=y;y=tC t=y,y=x,x=tD x=t,t=y,y=x7、假定AA为一个类,a为该类私有的数据成员,GetValue()为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为( D)。
A x.aB x.a() D x.GetValue()C x->GetValue()8、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用( A)。
A 内联函数 C 递归调用B 重载函数 D 嵌套调用9、设int *p,i; 以下正确的语句是( C) A *p=&10 B i=p C i=*pD p=2*p+1 10、静态数据成员的初始化必须在(B )。
C++考试题(选择题)
C++考试题(选择题)1、选择题1、___A__只能访问静态成员变量。
A 静态函数B 虚函数C 构造函数D 析构函数2、下列的各类函数中,__C___不是类的成员函数。
A 构造函数B 析构函数C友元函数 D 拷贝构造函数3、友元的作用_A__。
A 提高程序的运行效率B 加强类的封装性C 实现数据的隐藏性D 增加成员函数的种类4、类模板的使用实际上是将类模板实例化成一个具体的_D____。
A 类B 对象C 函数D 模板类5、下列函数中,___C__不能重载。
A 成员函数B 非成员函数C 析构函数D 构造函数6、___C__是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本。
A 虚析构函数B虚构造函数C纯虚函数 D 静态成员函数7、__A___是istream的派生类,处理文件输入;___C__是iostream的派生类,可以同时处理文件的I/O。
A、ifstreamB、ostreamC、fstreamD、ofstream8、对于派生类的构造函数,在定义对象时构造函数的执行顺序为:先执行__A___,再执行__B___,后执行__C___。
A 成员对象的构造函数B 基类的构造函数C 派生类本身的构造函数9、局部变量可以隐藏全局变量,那么在有同名全局变量和局部变量的情形时,可以用__A___提供对全局变量的访问。
A 域运算符B 类运算符C 重载D 引用10、一个__C___允许用户为类定义一种模式,使得类中的某些数据成员及某些成员函数的返回值能取任意类型。
A 函数模板B 模板函数C 类模板D 模板类11、系统在调用重载函数时,往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是___D__。
A 参数个数B 参数的类型C 函数名称D函数的类型12、如果一个类至少有一个纯虚函数,那么就称该类为__A___。
A 抽象类B 虚基类C 派生类D 以上都不对13、进行文件操作时需要包含__B___文件。
static函数的用法
static函数的用法
static函数是一个类的特殊成员函数,与类的实例化对象无关,有以下用法:
1. 不需要实例化对象:static函数可以直接通过类名调用,不需要通过类的实例化对象来调用。
这样可以避免创建对象的开销,提高效率。
2. 访问静态成员:static函数只能访问类的静态成员变量和静态成员函数,无法访问非静态成员变量和非静态成员函数。
因为非静态成员依赖于对象的实例化。
3. 共享数据和方法:静态函数和静态成员变量在内存中只有一份拷贝,所有实例化对象共享这些数据和方法。
可以使用静态函数来操作和修改静态成员变量,实现数据共享。
4. 不能访问非静态变量和函数:静态函数无法访问非静态成员变量和成员函数,因为非静态成员依赖于对象的实例化。
如果要在静态函数中访问非静态成员,可以通过传递对象作为参数的方式来实现。
5. 静态函数没有this指针:由于静态函数不依赖于对象实例,所以没有this指针,无法访问当前对象的成员。
不能在静态函数中使用this指针。
总的来说,static函数主要用于操作和修改静态成员变量,实现数据共享,提高效率。
但需要注意,在使用时要谨慎,因为静态函数不能直接访问非静态成员,
可能会导致一些编程问题。
静态成员和方法的使用场合及利弊分析
静态成员和⽅法的使⽤场合及利弊分析数据成员数据成员可以分静态变量、实例变量两种.静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是⼀个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.函数成员⽅法可以主要分为静态⽅法,实例⽅法静态⽅法:静态⽅法是不属于特定对象的⽅法,静态⽅法可以访问静态成员变量,静态⽅法不可以直接访问实例变量,可以在实例函数调⽤的情况下,实例变量做为参数传给静态⽅法。
静态⽅法也不能直接调⽤实例⽅法,可以间接调⽤,⾸先要创建⼀个类的实例,然后通过这⼀特定对象来调⽤静态⽅法。
实例⽅法:⼀个实例⽅法的执⾏与特定对象关联,他的执⾏需要⼀个对象存在。
实例⽅法可以直接访问静态变量和实例变量,实例⽅法可以直接访问实例⽅法、和静态⽅法,静态⽅法的访问⽅式为类名加点操作符加变量名。
当多个实例对象存在时,内存中并不是存在美个特定的实例⽅法的拷贝,⽽是,相同类的所有对象都共享每个实例⽅法的⼀个拷贝(实例⽅法只占⽤“⼀套”空间)。
静态的东西,在构造的时候是在堆中⽣成,在结束前不会被释放与改变.⼤量的数据访问由于已经⽣成且不被释放,所以就不会在栈中反复创建实例,节约空间时间。
⾮静态的反复调⽤⽅法有可能造成使⽤过的变量或⽅法被系统回收,⽽再创建的问题。
对于⼤数据量的访问操作,应该使⽤静态⽅法,可以提⾼性能。
如果⼀个⽅法不需要实例就能很好的运⾏,那它本来就该是静态的,除⾮是你故意把它写成⾮静态的,所以这个效率是⽆稽之谈。
静态⽅法的使⽤场合⼀、该⽅法与任何实例⽆关。
⼆、该⽅法与特定实例⽆关。
三、该⽅法是运算符。
四、该⽅法不修改实例。
不过,除了第⼀条和第三条是亘古不变的之外,第⼆第四都是见仁见智的了。
关于静态⽅法1、static声明的变量和⽅法会被放到内存的堆区,即使不调⽤也会被分配空间,⽽⾮static情况只有在使⽤的时候才被分配空间,使⽤完就释放掉。
新《C++程序设计》自考必备题库(含答案)
新《C++程序设计》自考必备题库(含答案)一、单选题1、类A将每其它类对象作为成员,则建立A类对象时,下列描述正确的是()A、A类构造函数先执行B、成员构造函数先执行C、两者并行执行D、不能确定正确答案:B2、列描述错误的是()A、在创建对象前,静态成员不存在B、静态成员是类的成员C、静态成员不能是虚函数D、静态成员函数不能直接访问非静态成员正确答案:A3、关多态性说法不正确的是()A、C++语言的多态性分为编译时的多态性和运行时的多态性B、编译时的多态性可通过函数重载实现C、运行时的多态性可通过模板和虚函数实现D、实现运行时多态性的机制称为动态多态性正确答案:C4、编译指令中,宏定义使用哪个指令()A、ttincludeB、#defineC、#ifD、#else正确答案:B5、于对象概念的描述中,说法错误的是()A、对象就是C语言中的结构体B、对象代表着正在创建的系统中的一个实体C、对象是类的一个变量D、对象之间的信息传递是通过消息进行的正确答案:A6、没有使用private关键字定义类的数据成员,则默认为()A、privateB、publicC、protectedD、friend正确答案:A7、符型数据在内存中的二进制编码方式是()A、补码B、原码C、ASCII码D、反码正确答案:C8、++语言是从早期的C语言逐渐发展演变而来的与C语言相比,它在求解问题方法上进行的最大改进是:()A、面向过程B、面向对象C、安全性D、复用性正确答案:B9、符串“ABC”在内存占用的字节数是()A、3B、4C、6D、8正确答案:B10、创建派生类对象时,构造函数的执行顺序是()A、对象成员构造函数、基类构造函数、派生类本身的构造函数B、派生类本身的构造函数、基类构造函数、对象成员构造函数C、基类构造函数、派生类本身的构造函数、对象成员构造函数D、基类构造函数、对象成员构造函数、派生类本身的构造函数正确答案:D11、中定义的成员默认访问属性为()A、publicB、privateC、protectedD、friend正确答案:B12、求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用()A、内联函数B、重载函数C、内部函数D、函数模板正确答案:A13、面正确的字符常量是()A、“c”B、'\\''C、,W<D、''正确答案:C14、有说明语句:chare二‘\72‘;则变量c()A、包含1个字符B、包含2个字符C、包含3个字符D、说明不合法,c值不确定正确答案:A15、inta二5,使b不为2的表达式是()A、b=6一(---a)B、b=a%2C、b=a/2D、b=a>3? 2:1正确答案:B16、C++语言中用于注释的标识符是()A、&B、//C、*D、/正确答案:B17、数型数据在内存中的二进制编码方式是()A、补码B、原码C、ASCII码D、反码正确答案:A18、his指针存在的目的是()A、保证基类公有成员在子类中可以被访问B、保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码C、保证基类保护成员在子类中可以被访问D、保证基类私有成员在子类中可以被访问正确答案:B19、哪种派生方式中,派生类可以访问基类中的protected成员()A、public和privateB、public和protectedC、protected和privateD、仅protected正确答案:B20、行x二(6*7%8+9)/5;后,x的值为()A、1B、2C、3D、4正确答案:B21、类中声明的变量,下列描述中正确的是()A、属于全局变量B、只属于该类C、属于该类,某些情况下也可被该类不同实例所共享D、任何情况下都可被该类所有实例共享正确答案:C22、列说明中constchar^ptr;其中ptr应该是:()A、指向字符常量的指针B、指向字符的常量指针C、指向字符串常量的指针D、指向字符串的常量指针正确答案:C23、变量a是整型,f是实型,i是双精度型,则表达式10+'a,+i*f 值的数据类型是()A、intB、folatC、doubleD、不确定正确答案:C24、于类和对象不正确的说法是()A、类是一种类型,它封装了数据和操作B、对象是类的实例C、一个类的对象只有一个D、一个对象必属于某个类正确答案:C*q[5];等价的定义语句是()25、下与intA、intq[5];B、int*qC、int(q[5])D、int(*q)[5]正确答案:D26、izeof(float)是()A、一个双精度型表达式B、一个整型表达式C、一种函数调用D、一个不合法的表达式正确答案:B27、ntFunc(int,int);不可与下列哪个函数构成重载()A、intFHnc(int,int,int);B、doubleFunc(int,int);C、doubleFunc(double,double);D、doubleFunc(int,double);正确答案:B28、列哪个类型函数不适合声明为内联函数()A、函数体语句较多B、函数体语句较少C、函数执行时间较短D、函数执行时间过长正确答案:A29、列有关重载函数的说法中正确的是()A、重载函数必须具有不同的返回值类型B、重载函数参数个数必须相同C、重载函数必须有不同的形参列表D、重载函数名可以不同正确答案:C30、行语句x=(a二3,b=a---)后,x,a,b的值依次为()B=3A=2X=3A、3,2,3B、2,3,2C、3,3,2D、3,2,2正确答案:A31、有代数式3ae/bc,则不正确的c语言表达式是()A、a/b/c*e3B、3*a e/b/c*cC、3a e/bD、a e/c/c*3正确答案:C32、用值传递方式将实参传给形参,下列说法正确的是0A、形参是实参的备份B、实参是形参的备份C、形参和实参是同一对象D、形参和实参无联系正确答案:A33、果没有为一个类定义任何构造函数的情况下,下列描述正确的是0A、编译器总是自动创建一个不带参数的构造函数B、这个类没有构造函数C、这个类不需要构造函数D、该类不能通过编译正确答案:A34、有定义inta[10],*p=a;,则p+5表示()A、元素a[5]的地址B、元素a[5]的值C、元素a[6]的地址D、元素a[6]的值正确答案:A35、a=-3;执行(a〉0)?a:-a;后,a的值为()A、3B、1C、0D、一3正确答案:D36、使用关键字new所开辟的动态存储空间,释放时必须使用()A、fIreeB、createC、deleteD、cfile正确答案:C37、存在函数intmax(int,int)返回两参数中较大值,若求22,59, 70三者中最大值,下列表达式不正确的是()A、intm=max(22,max(59,70));B、intm=max(max(22,59),70);C、intm=max(22,59,70);D、intm=max(59,max(22,70));正确答案:C38、于类模板的说法正确的是()A、类模板的主要作用是生成抽象类B、类模板实例化时,编译器将根据给出的模板实参生成一个类C、在类模板中的数据成员具有同样类型D、类模板中的成员函数没有返回值正确答案:B39、于友元描述正确的是()A、友元是本类的成员函数B、友元不是本类的成员函数C、友元不是函数D、友元不能访问本类私有成员正确答案:B40、PC机中,"在内存占用的字节数是()A、1B、2C、3D、4正确答案:A41、有语句inta二3;,则执行了语句a+二a-二a*后,变量a的值是()A、3B、0C、9D、-12正确答案:D42、列正确的标识符是()A、hot_doB、a+bC、test!D、%y正确答案:A43、的私有成员可在何处访问0A、通过子类的对象访问B、本类及子类的成员函数中C、通过该类对象访问D、本类的成员函数中正确答案:D44、C语言中,合法的长整型常数是()A、0LB、4962710C、0.054838743D、 2.1869el0正确答案:A45、C++语言和C语言的兼容性,描述正确的是()A、C++兼容CB、C++部分兼容CC、C++不兼容D、C兼容C++正确答案:A46、写C++程序一般需经过的几个步骤依次是()A、编辑、调试、编译、连接B、编译、调试、编辑、连接C、编译、编辑、连接、运行D、编辑、编译、连接、运行正确答案:D47、贝构造函数的参数是()A、某个对象名B、某个对象的成员名C、某个对象的引用名D、某个对象的指针名正确答案:C48、C++中使用流进行输入输出,其中用于屏幕输出的对象是()A、cerrB、cinC、coutD、cfile正确答案:C49、所有变量均为整型,则表达式(a二2,b二5,b++,a+b)的值为()A、7B、8C、9D、2正确答案:A50、C语言中,要求运算数必须是整型的运算符是()A、/B、++D、%正确答案:D51、列关于类的权限的描述错误的是0A、类本身的成员函数只能访问自身的私有成员B、类的对象只能访问该类的公有成员C、普通函数不能直接访问类的公有成员,必须通过对象访问D、一个类可以将另一个类的对象作为成员正确答案:A52、x二8,执行语句y二x++,则y等于()A、6B、7C、8D、9正确答案:C53、intk二32767;执行k=k+l;后k值为()A、32768B、—32768C、0D、-1正确答案:A54、个类可包含析构函数的个数是()B、1个C、至少一个D、0个或多个正确答案:B55、于虚函数的描述中,()是正确的。
福师《C++语言程序设计》在线作业1答案
福师《C++语言程序设计》在线作业1答案一、单选题(共30 道试题,共60 分。
)1. 下面列出的保留字中,不能作为函数的返回类型的是(C)A. voidB. intC. newD. long2. 下面关于类的对象性质的描述,正确的是(D )A. 对象之间不可以相互赋值B. 不可以说明指向对象的指针C. 对象不能用作数组元素D. 一个对象能用作另一个对象的成员3. 循环体至少被执行一次的语句为(C)A. for循环B. while循环C. do循环D. 任一种循环4. 要使几个不同数据类型的数据共享同一块内存区域,应使用(C )A. 数组B. 结构C. 联合D. 文件5. 要声明一个有10个int型元素的数组,正确的语句是(A)A. int a[10];B. int a[2,5];C. int a[];D. int *a[10];6. 下面程序的结果是什么?Int i=3,j=4;i?i++:j++;printf(“%d %d\n”,i,j);(B)A. 3 3B. 4 4C. 3 4D. 4 37. 下列运算符中,运算对象必须是整型的是(B)A. /B. %C. =D. &8. 下面关于new 和delete操作符的说法中,不正确的是(D )A. 使用new操作符,可以动态分配全局堆中的内存资源B. 若p的类型已由A*强制转换为void *,那么执行语句delete p;时,类A的析构函数不会被调用C. 实现全局函数时,new和delete通常成对地出现在由一对匹配的花括号限定的语句块中D. 执行语句A * p=new A[100]时,类A的构造函数只会被调用1次9. 下列叙述正确的是(A )A. 一个程序中可以有多个#include命令行B. 在#include命令行中,用双引号和用尖括号将被包含的文件名括起来没有区别C. #include命令行只能放在程序开始位置D. #include命令后也必须以分号结束10. 表达式9!=10的值为(D) A. 非零值B. true C. 0 D. 111. 下面说法中,正确的是(C )A. 公有派生类的成员函数可以访问基类的私有成员B. 私有派生类的成员函数可以访问基类的私有成员C. 无论公有派生还是私有派生,派生类的成员函数均可以访问基类的公有成员D. 无论公有派生还是私有派生,派生类的成员函数均可以访问基类的私有成员12. 下列关于C++语言类的描述中错误的是(C )A. 类用于描述事物的属性和对事物的操作B. 类与类之间通过封装而具有明确的独立性C. 类与类之间必须是平等的关系,而不能组成层次结构D. 类与类之间可以通过一些方法进行通信和联络13. 在C++语言中,为了使得类中的某些数据成员及某些成员函数的返回值能取任意类型,应使用(B )A. 类B. 类模板C. 抽象类D. 虚基类14. 虚函数使用关键字(A )A. virtualB. staticC. publicD. private15. 下列字符中不能构成标识符的是(D )A. 数字字符B. 大写字母C. 下划线字符D. 连接符16. 已知函数test定义为:void test() { …………} 则函数定义中void的含义是(A)A. 执行函数test后,函数没有返回值B. 执行函数test后,函数不再返回C. 执行函数test后,函数返回任意类型值D. 以上三个答案都是错误的17. 下列运算符中,(C)运算符在C++中不能重载A. &&B. []C. ::D. new18. 若x,y,z均被定义为整数,则下列表达式终能正确表达代数式1/(x*y*z)的是(B )A. 1/x*y*zB. 1.0/(x*y*z)C. 1/(x*y*z)D. 1/x/y/(float)z19. 已知:print( )函数是一个类的常成员函数,且无返回值。
c++期末考试判断题+填空题
判断题1、对空指针不能用delete运算符。
(错误)2、对重载的函数,要求函数类型相同但参数不同。
(错误)3、任何一个对象只能属于一个具体的类。
(正确)4、用new运算符来创建对象时不会调用构造函数。
(错误)5、对重载的函数,要求参数不同或函数类型不同。
(错误)6、在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。
(错误)7、析构函数可以是虚函数。
(正确)8、无论什么方式的继承,基类的私有成员都不能被派生类访问。
(正确)9、要达到动态联编的效果,基类和派生类的对应函数不仅名字相同,而且返回类型、参数个数和类型也必须相同。
(正确)10、如果派生类没有实现虚函数,那么它将使用他的基类的虚函数。
(正确)11、构造函数可以是虚函数。
(错误)12、指向对象数组的指针不一定必须指向数组的首指针。
(正确)13、对象数组的元素可以是不同类的对象。
(错误)14、对象数组可以赋初值又可以赋值。
(错误)15、一个类的构造函数可以不包含对其子对象的初始化。
(错误)16、在C++中,既允许单继承,又允许多继承。
(正确)17、派生类从基类派生出来,它不能生成新的派生类。
(错误)18、派生类的继承方式只有2种:公有继承和私有继承。
(错误)19、在公有继承中,基类的成员在派生类中都可以直接使用。
(错误)20、在单继承中,派生类中对基类成员的访问也会出现二义性。
(错误)21、解决多继承下二义性问题的方法之一是使用作用域运算符。
(正确)22、作用域运算符(::)只能用来限定成员函数所属的类。
(错误)注:还限制成员变量所属的类。
23、析构函数是一种函数体为空的成员函数。
(错误)24、构造函数和析构函数都不能重载。
(错误)注:构造函数可以重载,析构函数不可以重载(因为析构函数无参数,不可能进行参数区分)。
25、说明或定义对象时,类名前面不需要加class关键字。
(正确)26、对象成员的表示与结构变量成员表示相同,使用运算符.或->。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
静态成员函数一般情况下只能访问静态成员变量,因为不接受隐含的this指针。
另外作为类的静态成员函数,不用声明对象,便可直接调用,例如类A的静态成员函数fun(); A::fun();
1、主要用于封装全局变量和全局函数。
以避免在文件作用域内包含带外部连接的数据。
例如全局变量:int path;int para1;
解决办法:设计一个全局类,并将这些全局名称声明为静态变量,并编写静态函数来调用这些变量。
class Global{
static int s_path;
static int s_para;
private:
Global();//不实现,避免无意中的实例化
public:
//manipulators
static void setPath(int path){s_path = path;}
static void setPara(int para){s_para = para;}
//accessors
static int getPath(){return s_path;}
static int getPara(){return s_para;}
}
2、对自由函数的封装
在.h文件的文件作用域内避免使用自由函数(运算符函数除外);在.c文件中避免使用带有外部连接的自由函数,因此可以使用静态成员函数进行处理。
例如:int getPara();int getPath();我们可以通过声明一个结构的静态方法代替:
struct SysUtil{
static int getPath();
static int getPara();
}这样,唯一有冲突危险的就是出现类名SysUtil了。
前言:
本文只是本人对C++中关于静态类型的一个总结,如错误之处,请大家帮我改正。
我分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。
一、在面向过程设计中的static关键字
1、静态全局变量
定义:在全局变量前,加上关键字static 该变量就被定义成为了一个静态全局变量。
特点:
A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0。
C、访变量只在本源文件可见,严格的讲应该为定义之处开始到本文件结束。
例(摘于C++程序设计教程---钱能主编P103)://file1.cpp
#include<iostream.h>
void fn();
extern int n;
void main()
{
n=20;
cout << n << endl;
fn();
}
//file2.cpp
#include<iostream.h>
static int n; //定义静态全局变量,初始化为0;
void fn()
{
n++;
cout << n << endl;
}
文件分别编译能通过,但连接时file1.cpp 中的变量n找不到定义,产生连接错误。
D、文件作用域下声明的const的常量默认为static存储类型。
2、静态局部变量
定义:在局部变量前加上static关键字时,就定义了静态局部变量。
特点:
A、该变量在全局数据区分配内存。
B、初始化:如果不显式初始化,那么将被隐式初始化为0。
C、它始终驻留在全局数据区,直到程序运行结束。
但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
3、静态函数(注意与类的静态成员函数区别)
定义:在函数的返回类型前加上static关键字,函数即被定义成静态函数。
特点:
A、静态函数只能在本源文件中使用(这是与普通函数区别)
例(摘于C++程序设计教程---钱能主编P103)://file1.cpp
void fn();
void staticFn()
void main()
{
fn();
staticFn();
}
//file2.cpp
#include<iostream.h>
static void staticFn();
void fn();
void fn()
{
staticFn();
cout << "this is fn() \n";
}
void staticFn()
{
cout << "this is staticFn() \n";
}
连接时,将产生找不到函数staticFn()定义的错误。
B、主意事项
在文件作用域下声明的inline函数默认为static类型。
二、面象对象中的static关键字(主要指类中的static关键字)
1、静态数据成员
特点:
A、内存分配:在程序的全局数据区分配。
B、初始化和定义:
a、静态数据成员定义时要分配空间,所以不能在类声明中定义。
b、为了避免在多个使用该类的源文件中,对其重复定义,所在,不能在类的头文件中
定义。
c、静态数据成员因为程序一开始运行就必需存在,所以其初始化的最佳位置在类的内部实现。
C、特点
a、对相于public,protected,private 关键字的影响它和普通数据成员一样,
b、因为其空间在全局数据区分配,属于所有本类的对象共享,所以,它不属于特定的类对象,在没产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。
D、访问形式
a、类对象名.静态数据成员名
b、类类型名:: 静态数据成员名
E、静态数据成员,主要用在类的所有实例都拥有的属性上。
比如,对于一个存款类,帐号相对于每个实例都是不同的,但每个实例的利息是相同的。
所以,应该把利息设为存款类的静态数据成员。
这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局区的内存,所以节省存贮空间。
第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了,因为它们实际上是共用一个东西。
2、静态成员函数
特点:
A、静态成员函数与类相联系,不与类的对象相联系。
B、静态成员函数不能访问非静态数据成员。
原因很简单,非静态数据成员属于特定的类实例。
作用:
主要用于对静态数据成员的操作。
调用形式:
A、类对象名.静态成员函数名()
B、类类型名:: 静态成员函数名()。