成员函数的特性
面向对象程序设计复习试题(答案)

语法扩充1.1选择题在C++中用(D)能够实现将参数值带回。
a)数组b)指针c)引用d)上述ABC都可考虑函数原型voidtest(inta,intb=7,char*ch="*"),下面的函数调用中,属于不合法调用的是:(C)A)test(5)B)test(5,8)C)test(6,"#")D)test(0,0,"*");已知:intm=10;下列表示引用的方法中,正确的是:(C)A)C)在A)对在A)C)A)C)A)intFunc(int,int,int);B)doubleFunc(int,int);C)doubleFunc(double,double);D)doubleFunc(int,double);下面的哪个保留字不能作为函数的返回类型(C)A)voidB)intC)newD)long一个函数功能不太复杂,但要求被频繁调用,选用(A)。
A.内联函数B.重载函数C.递归函数D.嵌套函数已知函数f的原型为:voidf(int&a,char*b);变量s,t的定义是:ints;chart[]="ABCD";把s和t分别作为第一参数和第二参数来调用函数f,正确的调用语句是(C)Af(&s,&t);Bf(&s,t);Cf(s,t);Df(s,&t);若定义cin>>str;当输入MicrosoftVisualStudio6.0!所得结果是str=(B)。
A、MicrosoftVisualStudio6.0!B、MicrosoftC、MicrosoftVisualD、MicrosoftVisualStudio6.0.函数模板(C)。
A、代表某一具体函数B、与模板函数是同一个函数C、与某一个具体的数据类型连用D在ABCDAC1.21。
23int*&p=c;p=&b;4、假设有如下函数定义:voidFun(intx,inty=100);则语旬Fun(5)语句__Fun(5,100)_等价。
c++ 静态成员函数

c++ 静态成员函数
c++ 静态成员函数是一类特殊的成员函数,它可以被类的
所有对象共享。
换句话说,它可以在类的任何对象之间共享数据,而不需要实例化该类的任何对象,这种特殊的成员函数叫做静态成员函数。
静态成员函数的特性跟普通的成员函数有很多不同,首先,静态成员函数不属于任何的实例,也就是说,它不受任何实例的影响。
其次,静态成员函数可以被类的任何对象访问,不需要实例化任何对象。
最后,静态成员函数可以调用另一个静态成员函数,但不能调用普通的成员函数。
静态成员函数的定义和声明也跟普通的成员函数有所不同,它们应该在类外面定义,以关键字static开头,并且不能包含this指针。
而声明时,静态成员函数也应该以static关键字开头,并且在类内部声明。
静态成员函数有很多用途,它可以用来访问和更新类的静态数据成员,也可以用来实现一些特殊的功能,例如用来实现单例模式。
另外,它还可以用来实现类的多态性,因为它可以被多个类共享,而不需要实例化任何对象。
总之,c++静态成员函数是一种特殊的成员函数,它具有
访问和更新类的静态数据成员、实现一些特殊功能、实现类的
多态性等多种用途。
它的定义和声明也有所不同,所以要特别注意。
C++面向对象技术复习题汇总(含答案)

面向对象程序设计C++复习资料与答案第一、二、六、七章习题一、选择题1、系统约定C++源程序文件名的缺省的扩展名为()A、bccB、c++C、cppD、vcc2、面向对象的程序设计将数据与( )放在一起,作为一个相互依存、不可分割的整体来处理.A、对数据的操作B、信息C、数据隐藏D、数据抽象3、当一个函数无返回值时,函数的类型应定义为()A、voidB、任意C、intD、无4、对于C++的函数,正确的叙述是:A、函数的定义不能嵌套,但函数的调用可以嵌套B、函数的定义不能嵌套,但函数的调用不能嵌套C、函数的定义和调用都不能嵌套D、函数的定义和调用都可以嵌套5、下列语句中错误的是( )A、int *p=new int(10);B、int *p=new int[10]C、int *p=new int;D、int *p=new int[40](0);6、假设已经有定义:const char *const name=”chen”;,下面的语句中正确的是:()A、name[3]=’a’;B、name=”lin”;C、name=new char[5]; D、cout<〈name[3];7、假设已经定义:char *const name=”chen”;, 下面的语句中正确的是:( )A、name[3]=’q';B、name=”lin”;C、name=new char[5];D、name=new char(‘q’);8、假设已经定义:const char *name=”chen”;,下面的语句中错误的是:( )A、name[3]=’q’;B、name=”lin”;C、name=new char[5];D、name=new char(‘q’);9、下面的类型声明中正确的是:( )A、int &a[4];B、int &*p;C、int &&qD、int i,*p=&i;10、假设定义了函数模板( )template 〈class T>T max(T x,T y){ return(x>y)?x:y;}并定义了int i;char c;错误的调用语句是:()A、max(i,i)B、max(c,c)C、max((int)c,i);D、max(i,c)11、模板的使用是为了( )A、提高代码的可重用性B、提高代码的运行效率C、加强类的封装性D、实现多态性12、设有二个语句:int x[‘a’];cin>>x;则编译器认为()A、说明语句int x[‘a’]错B、二个语句都错C、语句cin〉〉x 错D、二个语句正确,没有语法错13、设有语句:void f(int a[10],int &x);int y[10],*py=y,n;则对函数f的正确调用语句是( )A、f(py[10],n);B、f(py,n)C、f(*py,&n)D、f(py,&n)14、在C++中实现封装是借助于()A、枚举B、类C、数组D、函数15、对于下面几个函数:(1) void f(int x,float y){……}(2) int f(int a,float b){…… }(3) int f(int i,int j){……}(4) float k(int x){…… }是重载函数。
构造函数的作用是在创建对象时

二,对象数组
1.定义格式:
2.对象数组元素:
3.区别:指向对象数组的指针和对象指针数组。
三,子对象和堆对象
子对象概念:一个对象作为另一个类的成员时,该对象称为类的子对象。子对象实际是某类的数据成员。
堆对象:在程序运行中,根据需要随时创建的对象称为堆对象。
C++中,内存被分为4种储存区域:
该运算符必须用于由new返回的指针。
对于一个指针只能使用一次运算符delete。
指针名前只能使用一对方括号,而不管所释放数组的为数,并且方括号内不写任何东西。
该运算符也适应于空指针。
四,类型转换和转换函数
类型转换包括隐含类型转换和强制类型转换。转换函数是一种强制类型转换。
单参数的构造函数,提供了一种功能,可以将其他数据类型的数值或变量转换为用户所定义的数据类型。这便是单参数构造函数所具有的类型转换功能。
动态联编:指在程序运行时进行的联编,又称晚期联编。
继承是动态联编的基础,虚函数是动态联编的关键。
三,动态联编的条件
公有继承
虚函数
引用虚函数的方法:对象引用和对象指针、成员函数。
虚函数的特性:
派生类中的虚函数与基类中的虚函数具有相同的参数个数、对应的参数类型,相同的返回值类型。
基类中说明的虚函数具有自动向下传给他的派生类的性质。即派生类的虚函数中的virtual说明可以省略。
基类构造函数。
子对象构造函数。
派生类构造函数。
派生类析构函数的调用顺序:
先调用派生类的析构函数。
在调用派生类中子对象的析构函数。
最后调用基类的析构函数。
在基类中定义有默认构造函数或者没有定义任何构造函数时,派生类构造函数中省略对基类构造函数的调用。
函数三大特性学习总结

函数三⼤特性学习总结函数的三⼤特性(⼆)#多态:什么是多态:⼀个类表现出的多种状态,通过继承来实现的。
在java中的表现:在⼀个函数中需要给参数指定数据类型,如果这个地⽅可以接收两个以上类型的参数,那么这些类型应该有⼀个⽗类,这个⽗类是所有⼦类对象的类型。
在python中:函数的参数不需要指定数据类型,所以我们也不需要通过继承的形式来统⼀⼀组类的类型,换句话说所有的对象其实都是object类型,所以在python当中其实处处是多态。
#鸭⼦类型print()#所有对象都是鸭⼦类型不是明确的通过继承实现的多态,⽽是通过⼀个模糊的概念来判断这个函数能不能接受这个类型的参数#封装⼴义上的封装class 类名: def ⽅法1(self):pass是为了只有这个类的对象才能使⽤定义在类中的⽅法狭义上的封装把⼀个名字藏在class Goods: __discount = 0 #私有的静态变量 print(__discount)print(Goods.__discount) #在类的外部不能引⽤私有的静态变量类中的静态变量和⽅法名在程序加载的过程中就已经执⾏完了,不需要等待调⽤。
在这个类加载完成之前,Goods这个名字还没有出现在内存空间中私有的静态属性可以在类的内部使⽤,⽤来隐藏某个变量的值class Goods:__discount = 0# 变形:_类名__私有变量# print(Goods.__dict__)print(Goods._Goods__discount)'''编程规范的⾓度出发我们不能在类的外部是使⽤私有的变量'''class Student:def__init__(self,name,age):self.__name = nameself.age = agedef name(self):return self.__namezhuge = Student('诸葛',20)print(())print(zhuge.age)zhuge.age = 'adas'print(zhuge.age)从外部可以查询私有变量类中的私有成员:1.私有的静态属性2.私有的对象属性3.私有的⽅法我们为什么要定义⼀个私有变量?1.我不想让你看到这个值2.我不想让你修改这个值3.我想让你在修改这个值的时候有⼀些限制4.有些⽅法和属性不希望⼦类继承。
C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点

C++之普通成员函数、虚函数以及纯虚函数的区别与⽤法要点普通成员函数是静态编译的,没有运⾏时多态,只会根据指针或引⽤的“字⾯值”类对象,调⽤⾃⼰的普通函数;虚函数为了重载和多态的需要,在基类中定义的,即便定义为空;纯虚函数是在基类中声明的虚函数,它可以再基类中有定义,且派⽣类必须定义⾃⼰的实现⽅法。
假设我们有三个类Person、Teacher、Student它们之间的关系如下:类的关系图普通成员函数【Demo1】根据这个类图,我们有下⾯的代码实现#ifndef __OBJEDT_H__#define __OBJEDT_H__#include <string>#include <iostream>class Person{public:Person(const string& name, int age) : m_name(name), m_age(age){}void ShowInfo(){cout << "姓名:" << m_name << endl;cout << "年龄:" << m_age << endl;}protected:string m_name; //姓名int m_age; //年龄};class Teacher : public Person{public:Teacher(const string& name, int age, const string& title): Person(name, age), m_title(title){}void ShowInfo(){cout << "姓名:" << m_name << endl;cout << "年龄:" << m_age << endl;cout << "职称:" << m_title << endl;}private:string m_title; //职称};class Student : public Person{public:Student(const string& name, int age, int studyId): Person(name, age), m_studyId(studyId){}void ShowInfo(){cout << "姓名:" << m_name << endl;cout << "年龄:" << m_age << endl;cout << "学号:" << m_studyId << endl;}private:int m_studyId; //学号};#endif //__OBJEDT_H__测试代码:void test(){Person* pPerson = new Person("张三", 22);Teacher* pTeacher = new Teacher("李四", 35, "副教授");Student* pStudent = new Student("王五", 18, 20151653);pPerson->ShowInfo();cout << endl;pTeacher->ShowInfo();cout << endl;pStudent->ShowInfo();cout << endl;delete pPerson;delete pTeacher;delete pStudent;}结果:姓名:张三年龄:22姓名:李四年龄:35职称:副教授姓名:王五年龄:18学号:20151653说明:这⾥的ShowInfo就是⼀个普通的函数。
C++程序设计19秋在线作业1答卷

试卷总分:100 得分:100
一、单选题 (共 20 道试题,共 60 分)
1.假定classA为一个类,a为该类公有的数据成员,px为指向该类对象的指针,则访问px所指对象中数据成员a的格式为()。
A.px[a]
B.px.a
C.px->a
D.px(a)
答案:错误
25.私有静态数据成员不能被类外部函数访问,也不能用对象进行访问。
答案:正确
26.C++的变量声明非常灵活,它允许变量声明与可执行语句在程序中交替出现。
答案:正确
27.C++语言对同一字母的大小写将认为是同一字符。
答案:错误
28.C++允许定义有默认参数的函数,默认参数要在函数声明中提供,当又有声明又有定义时,定义中不允许默认参数。
C.成员函数可以是静态的
D.成员函数一定是内联函数
答案:D
6.假设已经有定义const char*const name="chen"; 下面的语句中正确的是()。
=new char[5];
="lin";
[3]= 'a';
D.cout<<name[3];
答案:C
2.关于虚函数的描述中,()是正确的。
A.虚函数是一个非成员函数
B.虚函数是一个static类型的成员函数
C.派生类的虚函数与基类的虚函数具有不同的参数个数和类型
D.基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数
答案:D
3.下列函数中,()是对文件进行写操作的。
2019年3月计算机二级C++选择题强化练习01

(1)程序流程图中带有箭头的线段表则不包括( ) A)多态性 。 (3)软件设计中模块划分应遵循的准则是( A)低内聚低耦合 (4)在软件开发中,需求分析阶段产生的 A)可行性分析报告 主要文档是( )。 (5)算法的有穷性是指( )。 A)算法程序的运行时间是有限的
A)12345ABCDE A)循环队列有队头和队尾两个指针, 因此,循环队列是非线性结构
(3)在长度为n的有序线性表中进行二分查 A)O(n) 找,最坏情况下需要比较的次数是( )。
(4)下列叙述中正确的是( )。 (5)数据流图中带有箭头的线段表示的是( )。 (6)在软件开发中,需求分析阶段可以使 用的工具是( )。 (7)在面向对象方法中,不属于“对象”基 本特点的是( )。 (8)一间宿舍可住多个学生,则实体宿舍 和学生之间的联系是( )。 (9)在数据管理技术发展的三个阶段中, 数据共享最好的是( )。
A)1
A)编译时出现语法错误,不能生成可 执行文件
(4)if语句的语法格式可描述为: 格式l:if(<条件>)<语句> 或 格式2:if(<条件>)<语句l> else<语句2> 关于上面的语法格式,下列表述中错误 的是( )。
A)<条件>部分可以是一个if语句,例 如if(if(a==0)…)…
(8)有如下类定义: class B { public:void funl(){} private:void fun2(){} protected:void fun3(){} }; class D:public B j protected:void fun4(){} }; 若obj是类D的对象,则下列语句中不违 反访问控制权限的是( )。 (9)有如下类定义: class Foo { public: Foo(int v):value(V){}//① ~Foo(){}//② private: Foo(){}//③ int value=0://④ }; 其中存在语法错误的行是( )。 (10)有如下类定义: class Point { int xx.yy; public: Point():xx(0),yy(0){} Point(int x,int Y=0):xx(X),YY(Y){} }; 若执行语句 Point a(2),b[3],幸c[4]; 则Point类的构造函数被调用的次数是( )。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void Myclass::GetNumber() { cout<<"Number="<<A<<","<<B<<","<<C<<endl; } void Myclass::GetSum() { cout<<"Sum="<<Sum<<endl; } void main() { Myclass M(3,7,10),N(14,9,11);//定义对象M,N M.GetNumber(); N.GetNumber(); M.GetSum(); N.GetSum(); }
6.9 对象的生存期
对象的生存期指对象从被创建到释放为止的时间。 按生存期的不同,对象可分为: 1. 局部对象:当对象被定义时调用构造函数,该 对象被创建,当程序退出定义该对象所在的函数 体或程序块时,调用析构函数,释放该对象。 2. 静态对象:当程序第一次执行所定义的静态对 象时,该对象被创建,当程序结束时释放。 3.全局对象:程序开始时,调用构造函数创建,当 程序结束时,调用析构函数释放。
6.6 友元
类具有封装和信息隐藏的特性。只有类的 成员函数才能访问类的私有成员,程序中的其 他函数是无法访问私有成员的。非成员函数可 以访问类中的公有成员,但是如果将数据成员 都定义为公有的,这又破坏了隐藏的特性。 友元是一种定义在类外部的普通函数,但 它需要在类体内进行说明,为了与该类的成员 函数加以区别,在说明时前面加以关键字friend。 友元不是成员函数,但是它可以访问类中的私 有成员。友元的作用在于提高程序的运行效率, 但是,它破坏了类的封装性和隐藏性,使得非 成员函数可以访问类的私有成员。
友元通俗的理解就是允许另一个类 或函数访问你的类的一种机制。友元可 以是一个函数,该函数被称为友元函数; 友元也可以是一个类,该类被称为友元 类. 友元函数是一种定义在类外部的普 通函数,其说明在类内部,关键字: friend. 友元函数不是成员函数,但是可 以访问类中的私有成员。 友元函数的特点是能够访问类中私 有成员的非成员函数。从语法上看,和 普通函数一样。
6.8 局部类和嵌套类
在一个函数体内定义的类称为局部类。 局部类只能使用外围作用域中的对象和 函数进行联系。局部类中不能定义 static 成员函数,并且所有成员函数都必须定 义在类体内。局部类很少使用。
例.
int a; void fun() { static int s; class A//定义局部类A { public: void init(int i){s=i;} }; A m; m.init(10); }
4、嵌套类中说明的成员不是外围类中对 象的成员,反之亦然。嵌套类的成员函 数对外围类的成员没有访问权,反之亦 然。因此,在分析嵌套类与外围类的成 员访问关系时,往往把嵌套类看作非嵌 套类来处理。 5、在嵌套类中说明的友元对外围类的成 员没有访问权。 6、如果嵌套类比较复杂,可以只在外围 类中对嵌套类进行说明,关于嵌套的详 细的内容可在外围类体外的文件域中进 行定义。
静态成员函数
对静态成员函数的引用不需要用对象名。 在静态成员函数的实现中,不能直 接引用类中说明的非静态成员,可以引 用类中说明的静态成员。如果静态成员 函数内要引用非静态成员,可以通过对 象来引用。
#include <iostream.h> class M {public: M(int a){A=a; B+= a;} static void f1(M m); private: int A; static int B; }; void M::f1(M m) { cout<<"A="<<m.A<<endl;//引用类的非静态成员 cout<<"B="<<B<<endl;//引用类的静态成员 } int M::B=0; void main() { M P(5),Q(10); M::f1(P); M::f1(Q); }
作用域的种类
按作用域的大小可分为: 程序级:作用域最大,包含着该程序的所有文 件,程序级的有外部函数和外部变量。 文件级:内部函数和外部静态变量,作用域仅 在定义它的文件内。 函数级:函数的形参和在函数内定义的自动类 变量和内部静态类变量以及语句标号,这些标 识符的定义域都是在它所定义的函数体内。 块级:定义在分程序中、if语句中、switch语句 以及循环语句中的自动类和静态类变量。
静态数据成员注意事项
1.在类体中的数据成员声明前面加上关键字 static 就使该数据成员成为静态的。 2.静态数据成员初始化的格式: <数据类型><类名>::<静态数据成员名>=<值> 一般地,静态数据成员在该类定义之外被初始化, 并且不加static ,以免与一般静态变量混淆。 3.必须对静态成员初始化 4.引用静态数据成员时,采用如下格式: <类名>::<静态成员名>
嵌套类
在一个类中定义的类称为嵌套类,定义 嵌套类的类称为外围类。 定义嵌套类的目的在于隐藏类名,减少 全局标识符,从而限制用户使用该类建 立对象,提高类的抽象能力,并强调类 之间的主从关系。
例
class A//外围类A { public: class B//嵌套类B { public: private: }; void f(); private: int a; };
注意事项
1、从作用域的角度看,嵌套类被隐藏在外围 类之中,该类名只能在外围类中使用。如果在 外围类的作用域内使用该类名时,需要加名字 限定。 2、从访问权限的角度来看,嵌套类名与它 的外围类的对象成员名具有相同的访问权限规 则。不能访问嵌套类的对象中的私有成员函数, 也不能对外围类的私有部分中的嵌套类建立对 象。 3、嵌套类中的成员函数可以在它的类体外 定义。
例6-10
该程序的Point类中说明了一个友元函数 Distance( ), 它在说明时前面加一个friend关键字, 标识它不是成员函数,而是友元函数。它不需要指 出所属的类,但是可以引用类中的私有成员,如 a.x,b.x,a.y,b.y,都是类的私有成员。 P1.Getxy(),p2.Getxy()是成员函数的调用。在调 用友元函数时,如Distance(p1,p2)是友元函数的 调用,不需要对象表示。
友元类
友元还可以是类,即一个类可以作 为另一个类的友元。当一个类作为另一 个类的友元时,该类的所有成员函数都 是另一个类的友元函数。
整个类作为另一个类的友元: class x { friend class y; //…… };
例6-11
6.7 类的作用域
类的作用域简称类域,是指在类的定义 中由花括号括起来的部分。每个类都有 自己的类域,该类的成员局部于类所属 的域中。 类域中可以定义变量,也可以定义函数, 但定义变量不能使用auto,register和 extern等修饰符,只能用static,定义的函 数不能用extern。 文件域可以包含类域。类域介于文件类 和函数类之间。
对象类型 全局对象 局部对象 静态局部对象 New动态创建的对象 构造函数调用 程序运行 对象定义处 对象定义处 创建对象处 析构函数调用 程序结束 离开程序块 程序结束 Delete显式撤消
6.5 静态成员
静态成员的提出是为了解决数据共 享的问题。 同全局对象相比使用静态数据成员有两个 优势: 1 静态数据成员没有进入程序的全局名字 空间,因此不存在与程序中其他全局名 字冲突的可能性 2 可以实现信息隐藏。静态成员可以是 private成员,而全局对象不能。
成员函数的特性
内联函数 重载性 设置参数的缺省值
内联函数
内联函数:函数的函数体放在类体内 外联函数:说明在类体内,定义在类体 外。 外联函数在函数头前加上inline就变成内 联函数了。
重载性
成员函数可以重载。构造函数可以重 载,析构函数不能重载。
构造函数和析构函数的调用时间tream.h> class Myclass {public: Myclass(int a,int b,int c); void GetNumber(); Exa6-7 void GetSum(); private: int A,B,C; static int Sum;//静态成员 }; int Myclass::Sum=0;//静态成员初始化,必须初始化 Myclass::Myclass(int a,int b,int c) { A=a; B=b; C=c; Sum += A+B+C; }