静态函数 静态数据成员与静态成员函数 为什么虚函数必须是非静态成员函数 构造函数能为static吗
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产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。
C++静态成员变量和静态成员函数的使用方法总结

C++静态成员变量和静态成员函数的使⽤⽅法总结⼀.静态成员变量:类体中的数据成员的声明前加上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 _numis"<<a._num<<endl;b._num++;cout<<"derived class static data number _numis"<<b._num<<endl;} // 结果为1,2;可见派⽣类与基类共⽤⼀个静态数据成员。
二级C++-12

二级C++-12(总分:100.00,做题时间:90分钟)一、单项选择题(总题数:40,分数:40.00)1.程序流程图中带有箭头的线段表示的是______。
(分数:1.00)A.图元关系B.数据流C.控制流√D.调用关系解析:[解析] 在数据流图中,用标有名字的箭头表示数据流。
在程序流程图中,用标有名字的箭头表示控制流。
所以选择C。
2.结构化程序设计的基本原则不包括______。
(分数:1.00)A.多态性√B.自顶向下C.模块化D.逐步求精解析:[解析] 结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用goto语句,所以选择A。
3.软件设计中模块划分应遵循的准则是______。
(分数:1.00)A.低内聚低耦合B.高内聚低耦合√C.低内聚高耦合D.高内聚高耦合解析:[解析] 软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。
模块的划分应遵循一定的要求,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。
模块之间的耦合应尽可能的低,模块的内聚度应尽可能的高。
4.在软件开发中,需求分析阶段产生的主要文档是______。
(分数:1.00)A.可行性分析报告B.软件需求规格说明书√C.概要设计说明书D.集成测试计划解析:[解析] A错误,可行性分析阶段产生可行性分析报告。
C错误,概要设计说明书是总体设计阶段产生的文档。
D错误,集成测试计划是在概要设计阶段编写的文档。
B正确,软件需求规格说明书是后续工作如设计、编码等需要的重要参考文档。
5.算法的有穷性是指______。
(分数:1.00)A.算法程序的运行时间是有限的√B.算法程序所处理的数据量是有限的C.算法程序的长度是有限的D.算法只能被有限的用户使用解析:[解析] 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
有穷性是指算法程序的运行时间是有限的。
C++虚函数及虚函数表解析

C++虚函数及虚函数表解析虚函数的定义: 虚函数必须是类的⾮静态成员函数(且⾮构造函数),其访问权限是public(可以定义为private or proteceted,但是对于多态来说,没有意义。
),在基类的类定义中定义虚函数的⼀般形式: virtual 函数返回值类型虚函数名(形参表) { 函数体 } 虚函数的作⽤是实现动态联编,也就是在程序的运⾏阶段动态地选择合适的成员函数,在定义了虚函数后, 可以在基类的派⽣类中对虚函数重新定义(形式也是:virtual 函数返回值类型虚函数名(形参表){ 函数体 }),在派⽣类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。
以实现统⼀的接⼝,不同定义过程。
如果在派⽣类中没有对虚函数重新定义,则它继承其基类的虚函数。
当程序发现虚函数名前的关键字virtual后,会⾃动将其作为动态联编处理,即在程序运⾏时动态地选择合适的成员函数。
实现动态联编需要三个条件: 1、必须把需要动态联编的⾏为定义为类的公共属性的虚函数。
2、类之间存在⼦类型关系,⼀般表现为⼀个类从另⼀个类公有派⽣⽽来。
3、必须先使⽤基类指针指向⼦类型的对象,然后直接或者间接使⽤基类指针调⽤虚函数。
定义虚函数的限制: (1)⾮类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。
实际上,优秀的程序员常常把基类的析构函数定义为虚函数。
因为,将基类的析构函数定义为虚函数后,当利⽤delete删除⼀个指向派⽣类定义的对象指针时,系统会调⽤相应的类的析构函数。
⽽不将析构函数定义为虚函数时,只调⽤基类的析构函数。
(2)只需要在声明函数的类体中使⽤关键字“virtual”将函数声明为虚函数,⽽定义函数时不需要使⽤关键字“virtual”。
(3)如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、参数类型都相同的⾮虚函数。
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;}感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
静态函数 静态数据成员与静态成员函数 为什么虚函数必须是非静态成员函数 构造函数能为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。
《面向对象程序设计C++》期末试卷及标准答案(A)

《面向对象程序设计C++》期末考试试卷(A)试卷说明:本套试题共四个大题,全部题目都答在答题纸上,写在其他地方均无效。
(答题纸在本套试卷的第10页上)一、选择题(每小题2分,共40分)1、C++是()。
A. 面向对象的程序设计语言B. 面向过程的程序设计语言C. 既支持面向对象的程序设计又支持面向过程的程序设计的混合型语言D. 非结构化的程序设计语言2、面向对象程序设计思想的主要特征中不包括()。
A. 封装性B. 多态性C. 继承性D. 功能分解,逐步求精3、若定义:string str; 当语句cin>>str; 执行时,从键盘输入:Microsoft Visual Studio 6.0!所得的结果是str=()。
A. Microsoft Visual Studio 6.0!B. MicrosoftC. Microsoft VisualD. Microsoft Visual Studio 6.04、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z='*');下面函数调用中,不合法的是()。
A. testDefaulParam(5);B. testDefaulParam(5,8);C. testDefaulParam(5,'#');D. testDefaulParam(0,0,'*');5、下列语句中,将函数int sum(int x, int y)正确重载的是()。
A. float sum(int x, int y);B. int sum(int a, int b);C. float sum(float x, float y);D. double sum(int y, int x);6、下列表示引用的方法中,()是正确的。
已知:int a=1000;A. int &x=a;B. char &y;C. int &z=1000;D. float &t=&a;7、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用()。
最新版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++选择题题集

C++选择题集1.下列的各类函数中,不是类的成员函数。
(C)A)构造函数B)析构函数C)友元函数D)拷贝初始化构造函数2.作用域运算符“::”的功能是:(B)A)标识作用域的级别的B)指出作用域的范围的C)给定作用域的大小的D)标识成员是属于哪个类的3.A)C)4.已知:A)5.A)C)public6.7.A)C)一个类的对象只有一个D)一个对象必属于某个类8.在C++中,类与类之间的继承关系具有(C)A)自反性B)对称性C)传递性D)反对称性9.结构化程序设计所规定的三种基本控制结构是:(C)A)输入、处理、输出B)树形、网形、环形C)顺序、选择、循环D)主程序、子程序、函数10.C++语言是从早期的C语言逐渐发展演变而来的.与C语言相比,它在求解问题方法上进行的最大改进是:(B)A)面向过程B)面向对象C)安全性D)复用性11.在C++中实现封装是借助于(B)A)枚举B)类C)数组D)函数12.C++语言是从早期的C语言逐渐发展演变而来的与C语言相比,它在求解问题方法上进行的最大改进是:(B)A)13.在a)数组b14.(C)15.A)C)16.已知A)int&Z;17.对于A)paB)paC)pa[5]D)pa是一个具有5个元素的指针数组,每个元素是一个int型指针18.定义析构函数时,应该注意:(C)A)其名与类名完全相同B)返回类型是void类型C)无形参,也不可重载D)函数体中必须有delete语句19.在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(B)A)受限制B)保持不变C)受保护D)不受保护20.下列不是函数重载所要求的条件是:(D)A)函数名相同B)参数个数不同C)参数类型不同D)函数返回值类型不同21.在C++中执行以下4条语句后输出rad值为:(C)staticinthot=200;int&rad=hot;}A)C)A)析构函数B)构造函数C)其它成员函数D)友元函数25.关于构造函数的说法,不正确的是:(A)A)没有定义构造函数时,系统将不会调用它B)其名与类名完全相同C)它在对象被创建时由系统自动调用D)没有返回值26.按解释中的要求在下列程序划线处填入的正确语句是:(C)#include<iostream.h>classBase{public:voidfun(){cout<<"Base::fun"<<endl;}};classDerived:publicBase{public:voidfun(){//};A)fun();27.在28.A)受限制29.int(*pfA)int(*p)(float)=&f1;B)pf=&f4;C)pf=&f2;D)pf=&f3;30.通常拷贝构造函数的参数是:(C)A)对象名B)对象的成员名C)对象的引用名D)对象的指针名31.系统在调用重载函数时,不能作为确定哪个重载函数被调用的依据是:(D)A)参数个数B)参数类型C)函数名称D)函数的返回值类型32.下列描述中,正确的是:(D)A)所有的运算符号都可以重载。
静态函数调用非静态函数

静态函数调用非静态函数在面向对象编程中,静态函数和非静态函数是两种不同的函数类型。
静态函数是类的函数成员,它独立于任何对象的存在,可以直接通过类名来调用;非静态函数是对象的函数成员,它依赖于具体的对象实例,只能通过对象来调用。
静态函数和非静态函数有着各自的特点和用途。
静态函数在类的定义中不涉及对象数据成员,因此静态函数无法直接访问对象的非静态成员。
但是,静态函数可以访问类的静态成员,包括静态变量和静态函数。
然而,虽然静态函数无法直接访问非静态成员,但是它们可以通过传入对象实例或者调用非静态函数来间接访问非静态成员。
下面是一个示例代码:```cpp#include <iostream>class MyClassprivate:int nonStaticVariable;public:static void staticFunctioMyClass object;object.nonStaticFunction(;}void nonStaticFunctiostd::cout << "Non-static function called" << std::endl;}};int maiMyClass::staticFunction(;return 0;```在上述代码中,`staticFunction`是一个静态函数。
在静态函数内部,我们创建了一个`MyClass`对象`object`,然后通过该对象调用了非静态函数`nonStaticFunction`。
通过这种方式,我们实现了静态函数间接调用非静态函数的功能。
需要注意的是,在静态函数中创建了一个对象实例,这个对象实例的生命周期仅限于静态函数的执行过程,当静态函数执行完毕后,该对象实例将被销毁。
因此,在静态函数中只能通过临时创建的对象来调用非静态函数,不能持久保存该对象实例。
1.在静态函数中需要执行一些与对象无关的操作,但需要调用对象的一些非静态函数来完成特定功能。
《面向对象程序设计C++》期末试卷及标准答案

《面向对象程序设计C++》期末考试试卷(A)班级::学号:分数:试卷说明:本套试题共四个大题,全部题目都答在答题纸上,写在其他地方均无效。
(答题纸在本套试卷的第10页上)一、选择题(每小题2分,共40分)1、C++是()。
A. 面向对象的程序设计语言B. 面向过程的程序设计语言C. 既支持面向对象的程序设计又支持面向过程的程序设计的混合型语言D. 非结构化的程序设计语言2、面向对象程序设计思想的主要特征中不包括()。
A. 封装性B. 多态性C. 继承性D. 功能分解,逐步求精3、若定义:string str; 当语句cin>>str; 执行时,从键盘输入:Microsoft Visual Studio 6.0!所得的结果是str=()。
A. Microsoft Visual Studio 6.0!B. MicrosoftC. Microsoft VisualD. Microsoft Visual Studio 6.04、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z='*');下面函数调用中,不合法的是()。
A. testDefaulParam(5);B. testDefaulParam(5,8);C. testDefaulParam(5,'#');D. testDefaulParam(0,0,'*');5、下列语句中,将函数int sum(int x, int y)正确重载的是()。
A. float sum(int x, int y);B. int sum(int a, int b);C. float sum(float x, float y);D. double sum(int y, int x);6、下列表示引用的方法中,()是正确的。
已知:int a=1000;A. int &x=a;B. char &y;C. int &z=1000;D. float &t=&a;7、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用()。
c++复习题及答案

1、填空题()多态分为:专用多态和通用多态。
2、选择题(10分)下面对构造函数的描述不正确的是(C )A 可以重载B 其名字与类名相同C 可以显式调用构造函数D 构造函数是成员函数E 构造函数不能是虚函数3、判断题(正确的请写T,错误的请写F)(20分)静态成员函数可以直接调用类中说明的非静态成员。
(F)windows应用程序采用基于消息的事件驱动运行机制。
(T)(一)填空题在类体内使用关键字(static )说明的成员称为静态成员。
2、重载的函数要求参数的(个数)和(类型)不同。
3、如果要表示某个变量的值不能修改,用修饰符(const )限制。
4、对函数int fun( int x,int y) 中的参数x指定默认值10 正确的声明方式是(int fun(int y,int x=10) )。
5、C++语言规定,成员函数如果被定义在类体内,则为默认为(内联成员函数)。
6、在类层次结构中,创建子类对象时,(派生类)构造函数最后被执行。
7、C++规定,运行多态性通过(基)类的指针或者(引用)调用(虚函数)来实现。
8、派生类的生成过程经历了三个步骤:(吸收基类成员)、(改造基类成员)和(添加新的成员)。
9、面向对象程序设计的4个基本特征是(抽象)、(继承)、(封装)、(多态)。
10、Windows应用程序采用基于(消息)的事件驱动运行机制。
11、通常将用来派生新类的类称为(基类),又称为父类,而将派生出来的新类称为(派生类),又称为子类。
12、含有(纯虚)函数的类称为抽象类。
13、引用与被引用的实体具有相同的(地址)。
14、类成员的访问权限有3种(共有类型)、(私有类型)、(保护类型)。
15、通过函数改变实参的数据,c++ 可以通过( 指针)或者(引用)实现。
16、c++通过(函数重载)实现静态多态性,其(形参个数或类型)必须不同。
18、c++类的用途有两种,一种是生成类的对象,另一种是通过(继承)派生出新类。
C++选择题,判断题题库ZY-D

C++选择题1.面向对象程序设计将数据与(A)放在一起,作为一个相互依存、不可分割的整体来处理。
A.对数据操作的函数B.信息C.数据隐藏D.数据抽象2.C++对C语言做了很多改进,下列描述中(D)使得c语言发生了质变,即从面向过程变成面向对象。
A.增加了一些新的运算符B.允许函数重载,并允许设置默认函数C.规定函数说明必须用原型D.引进了类和对象的概念3.从语言角度来说,类是一种数据类型,而(A)是具有这种类型的变量。
A.实例B.实物C.特征D.对象4.C++语言相对于C语言的最根本的变化是(D)A.增加了一些新的运算符B.允许函数重载,并允许设置缺省参数C.规定函数说明符必须用原型D.引进了类和对象5.关于new运算符的下列描述中,(A)是错误的。
A.可以用来动态创建对象和对象数组B.使用它创建的对象或对象数组可以使用运算符delete删除C.使用它创建对象是要调用构造函数D.使用它创建对象数组时必须指定初始值6.作用域标示符“::”,可用于全局变量与局部变量同名时访问(B)变量A.局部B.全局C.char型D.对象7、如果表达式y*x++中,“*”是作为成员函数重载的运算符,“++”是作为友元函数重载的运算符,采用运算符函数调用格式,该表达式还可以表示为( D )A) x. operator++(0). Operator*(y)B) operator*(x. operator++(0),y)C) operator*( operator++(x,0),y)D) y. operator*( operator++(x,0))8.在C++中,声明内联函数时所用到的关键字是(C)A.innerB.insideC.inlineD.within9.若有:int x:则正确的定义引用的语句是(D)A.int y=&xB.int &y=x,xC.float x;int y=&z;D.int x: int &y=x;10、如果表达式——x/y中的“——”和“/”都是作为友元函数重载的运算符,采用运算符函数调用格式,该表达式还可以表示为( B )A) operator/(x. operator—(),y)B) operator/( operator—(x),y)C) x. operator—().operator/(y)D) y. operator/( operator—(x))11.下列语句中错误的是(D)A.int *p=new int(10);B.int *p=new int[10];C.int*pnew int;D.int *p=new int[40](0);12.下列类型声明中正确是(D)A.int &a[4];B.int &*p;C.int&&q;D.int I,*p=&I;13.在C++中建立参数类型或个数不同的同名函数是可能的,这称为函数(A)A.重载B.抽象C.继承D.友元14.重载函数在调用时,在下列选择的依据中,(D)是错误的A.参数个数B.参数的类型C.函数的名字D.函数的类型15.在下列关键字中,用以说明类中公有成员的是(A)A.publicB.privateC.protectedD.friend16.构造函数是在(B)是被执行的A.程序编译B.创建对象C.创建类D.程序装入内存17.在下面有关对构造函数的描述中,正确的是(B)A.构造函数可以带有返回值B.构造函数的名字与类名完全相同C.构造函数必须带有参数D.类中必须定义构造函数且不能缺省18.以下不属于构造函数特征的是(D)A.构造函数名与类名相同B.构造函数可以重载C.构造函数可以设置默认参数D.构造函数必须制定函数类型19.在声明类名时,下面的选项正确的是(C)A.可以在类的声明中给数据成员赋初值B.数据成员的数据类型可以是registerC.private、public、protected可以按任意顺序出现D.没有用private、public、protected定义的数据成员是公有成员20.关于成员函数特征的下列描述中,错误的是(A)A.成员函数一定是内联函数B.成员函数可以重载C.成员函数可以设置默认值D.成员函数可以是静态的21.通常拷贝构造函数的参数,正确的是(C)A.某个对象名B.某个对象的成员名C.某个对象的引用名D.某个对象的指针名22.有一个类BB,若在其类名中声明拷贝构造函数,正确的写法是(B)A.BB(int &)B.BB(BB&)C.~BB()D.~BB (BB&b)23.(B)的功能是对对象进行初始化。
新《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++笔试316_真题(含答案与解析)-交互

二级C++笔试316(总分98, 做题时间90分钟)一、选择题1.有如下程序:#include<iostream.h>using namespacestd;class Demo { public: Demo(){ cont <<"default constructor\n";} Demo(const Demo &x){ cont<<"copy constructor\n";} };Demo userCode(Demo b){Democ(b);return c;} int main() { Demo a,d; cout<<"callinguserCode()\n"; d=userCode(a); return 0;} 执行上面程序的过程中,构造函数Demo()和Demo(const Demo &x)被调用的次数分别是SSS_SINGLE_SELA 1和1B 1和2C 2和3D 2和4分值: 2答案:C[解析] 本题考核构造函数的应用,有一定的深度。
函数Demo()为构造函数,而 Demo(const Demo &x)为复制构造函数。
C++在创建一个对象时,会自动调用类的构造函数,所以语句“Demo a,d;”将调用函数Demo()2次。
当一个对象作为实参传递给函数时为初始化形参,要调用拷贝构造函数;在函数返回一个对象时调用拷贝构造函数。
由此可知语句“d=userCode(a);”调用复制构造函数3次。
2.下列函数原型声明中错误的是SSS_SINGLE_SELA void Fun(int x=0,int y=0);B void Fun(int x,int ;C void Fun(int x,int y=0);D void Fun(int x=0,int ;分值: 2答案:D[解析] 本题考核函数的定义方法和调用方法。
C++练习题2答案

填空题1. 根据访问权限的不同,可将类的成员分为三类____公有____ 、__私有_____ 和__保护______。
2.静态函数成员可直接引用该类的___静态数据成员_________ 和函数成员,而不能直接引用_____非静态数据成员___________ 。
3.静态成员属于__类____ ,而不属于_____对象______ ,它被同一个类的所有对象共享。
4.重载运算符的含义必须清楚,不能有_二义性________ 。
5.给出C++中以下英文单词的中文意思:OOP_____面向对象编程_________,OOA____面向对象分析__。
6. C++中的多态性是指具有不用功能的函数可以使用同一个___函数名___。
7.一个对象所占的空间的大小只取决于该对象中__数据成员__所占的空间,而与_成员函数____无关。
8.面向对象程序设计的四个主要特点为:_封装___、抽象____、继承和多态。
9.多态性是通过_调用函数_来实现的,动态多态性是通过__虚函数__ 来实现的。
10.C++提供的______继承____________机制允许一个派生类继承多个基类。
11.每个对象都有一个指向自身的指针,称为this__ 指针,通过使用它来确定其自身的地址。
12.当通过基类指针___ 或_____引用_ 使用虚函数时,C++会在与对象关联的派生类中正确的选择重定义的函数。
13.C++的动态多态性是通过虚函数实现的。
14.为了解决程序中函数调用的效率问题,引入了__内置函数______,定义时需在函数前面加上__inline______说明;为了提高程序的运行效率,引入了_寄存器_______,定义时需在函数前面加上___register_____说明。
15.在类的定义当中,缺省的成员是___实参_____成员。
16.当一个成员函数被调用时,该成员函数的_____t his指针_________指向调用它的对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
静态函数静态数据成员与静态成员函数为什么虚函数必须是非静态成员函数构造函数能为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。
以下程序我们来做一个模拟访问的例子,在程序中,每建立一个对象我们设置的类静态成员变自动加一,代码如下:#include <iostream>using namespace std;class Internet{public:Internet(char *name,char *address){strcpy(Internet::name,name);strcpy(Internet::address,address);count++;}static void Internet::Sc()//静态成员函数{cout<<count<<endl;}Internet &Rq();public:char name[20];char address[20];static int count;//这里如果写成static int count=0;就是错误的};Internet& Internet::Rq()//返回引用的成员函数{return *this;}int Internet::count = 0;//静态成员的初始化void vist(){Internet a1("中国软件开发实验室","");Internet a2("中国软件开发实验室","");}void fn(Internet &s){cout<<s.Rq().count;}void main(){cout<<Internet::count<<endl;//静态成员值的输出vist();Internet::Sc();//静态成员函数的调用Internet b("中国软件开发实验室","");Internet::Sc();fn(b);cin.get();}上面代码我们用了几种常用的方式建立对象,当建立新对象并调用其构造函数的时候,静态成员cout便运行加1操作,静态成员的初始化应该在主函数调用之前,并且不能在类的声明中出现,通过运行过程的观察我们发现,静态成员count 的状态并不会随着一个新的对象的新建而重新定义,尽而我们了解到类的静态成员是属于类的而不是属于哪一个对象的,所以静态成员的使用应该是类名称加域区分符加成员名称的,在上面的代码中就是Internet::count,虽然我们仍然可以使用对象名加点操作符号加成员名称的方式使用,但是不推荐的,静态类成员的特性就是属于类而不专属于某一个对象。
静态成员函数的特性类似于静态成员的使用,同样与对象无关,调用方法为类名称加域区分符加成员函数名称,在上面的代码中就是Internet::Sc();静态成员函数由于与对象无关系,所以在其中是不能对类的普通成员进行直接操作的。
如果上面的 static void Internet::Sc()修改成为:static void Internet::Sc()//静态成员函数{cout<<name<<endl;//错误cout<<count<<endl;}静态成员函数与普通成员函数的差别就在于缺少this指针,没有这个this指针自然也就无从知道name是哪一个对象的成员了。
根据类静态成员的特性我们可以简单归纳出几点,静态成员的使用范围:1.用来保存对象的个数。
2.作为一个标记,标记一些动作是否发生,比如:文件的打开状态,打印机的使用状态,等等。
3.存储链表的第一个或者最后一个成员的内存地址。
为了做一些必要的练习,深入的掌握静态对象的存在的意义,我们以前面的结构体的教程为基础,用类的方式描述一个线性链表,用于存储若干学生的姓名,代码如下:#include <iostream>using namespace std;class Student{public:Student (char *name);~Student();public:char name[30];Student *next;static Student *point;};Student::Student(char *name){strcpy(Student::name,name);this->next=point;point=this;}Student::~Student ()//析构过程就是节点的脱离过程{cout<<"析构:"<<name<<endl;if(point==this){point=this->next;cin.get();return;}for(Student *ps=point;ps;ps=ps->next){if(ps->next==this){cout<<ps->next<<""<<this->next<<endl;ps->next=next;//=next也可以写成this->next; cin.get();return;}}cin.get();}Student* Student::point=NULL;void main(){Student *c = new Student("marry");Student a("colin");Student b("jamesji");delete c;Student *fp=Student::point;while(fp!=NULL){cout<<fp->name<<endl;fp=fp->next;}cin.get();}从上面的代码来看,原来单纯结构化编程需要的一个链表进入全局指针在这里被类的静态成员指针所替代(类的静态成员完全可以替代全局变量),这个例子的理解重点主要是要注意观察类成员的析构顺序,通过对析构顺序的理解,使用析构函数来进行节点的脱链操作。
为什么虚函数必须是非静态成员函数如果定义为虚函数,那么它就是动态绑定的,也就是在派生类中可以被覆盖的,这与静态成员函数的定义本身就是相矛盾的。
==主要有两个作用:1、管理静态数据成员;2、提供类范围的功能,即不需要对象来实现的功能。
比如Symbian中的NewL/LC方法就是static的==使用static关键字声明的函数成员是静态的,静态成员函数同样也属于整个类,由同一个类的所有对象共同维护,为这些对象所共享。
作为成员函数,它的访问属性可以受到类的严格控制,对于公有的静态函数成员函数,可以通过类名或对象名来调用,但一般情况下建议用对象名来引用静态函数成员(真的吗?)。
注意,一般的成员函数只能通过对象名来调用。
由于一个类的静态成员函数只有一个拷贝,因此它访问对象的数据何函数使受到了限制。
静态成员函数可以直接访问该类的静态数据成员。
而访问非静态数据成员,必须通过参数传递方式得到对象名,然后通过对象名来访问。
可以看到,通过静态函数成员访问非静态成员使相当麻烦的,一般的使用中,它主要用来访问全局变量或同一个类中的静态数据成员,特别是和后者一起使用,达到对同一个类中对象之间共享的数据进行维护的目的。
构造函数不可以定义为static,看了上面,应该可以理解原因。
注意,由于static不是函数类型中的一部分,所以在类定义之外定义静态成员函数时不使用static,在类中定义的静态成员函数是内联的。
一般来说,通过成员名限定比使用对象名访问静态成员要好。
因为静态成员不是对象的成员。
静态成员可以被继承,这时,基类对象和派生类的对象共享该静态成员,除此之外,在类等级中对静态成员的其他特性(例如,静态成员在派生类中的访问权限,在派生类中重载成员函数等)的分析与一般成员类似。
静态成员函数不能被申明为虚函数,静态成员具有外部连接属性,static仅有的含义是使该成员为该类的所有对象共享。
类中的任何成员函数都可以访问静态成员,但静态成员函数只能通过对象名(或指向对象的指针)访问该对象的非静态成员,因为静态成员函数没有this 指针。
虚函数必须是非静态成员函数构造函数不可以定义为static。