C++复习知识点(仅供参考)

C++总结

namespce定义可嵌套。

0值转换为true,0值转换为false

运算符

C语言返回变量的值      C++语言是返回变量本身

1,C语言中的三目运算符返回的是变量值,不能作为左值使用

2,C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方(如果有一个是常量值,则不能作为左值使用)

Const常变量const修饰的常量编译期间,就已经确定下来了,由编译器处理的,提供类型检查和作用域检查

宏定义由预处理器处理,单纯的文本替换

引用即别名,实际引用在C++中的内部实现是一个常指针

const 对象的引用必须是 const 的

inline内联 必须和函数定义结合在一起

内联函数由 编译器处理,直接将编译后的函数体插入调用的地方,

宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程。

函数重载:用同一个函数名定义不同的函数,当函

数名和不同的参数搭配时函数的含义不同。

封装,可以达到,对内开放数据,对外屏蔽数据,对外提供接口。

复制构造函数

A x(2);  //直接初始化,调用构造函数
A y = x;  //复制初始化,调用复制构造函数

初始化列表中的初始化顺序,与声明顺序有关,与前后赋值顺序无关。

newdelete是运算符,不是函数,因此执行效率高

,静态成员是属于整个类的而不是某个对象,静态成员变量只存储

一份供 所有对象共用。所以在所有对象中都可以共享它。

//声明 在类的内部

static 数据类型 成员变量;

//初始化 在类的外部

数据类型 类名::静态数据成员 = 初值;

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函 数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元 的名称前加上 关键字 friend

运算符重载

左操作数该函数的调用对象   右操作数该函数的参数对象

类型兼容性原则

子类对象可以当作父类对象使用

子类对象可以直接赋值给父类对象

子类对象可以直接初始化父类对象

父类指针可以直接指向子类对象

父类引用可以直接引用子类对象

构造函数先父后子  析构函数先子后父

C++语言中函数的返回值类型的是由在定义该函数时所指定的数据类型决定的成员函数拥有this指针

面向对象程序设计的特征:封装,继承、派生,多态性

当成员函数体在写类的声明内且无循环语句与switch 语句是为内联函数,其余不是内联函数

类继承中,缺省的继承方式是私有。

虚函数实现了C++的多态机制,类实现了C++的封装机制。

复制构造函数的参数是什么形式?

答:复制构造函数是用类的对象给类的另外一个对象赋值,所以构造函数的参数的类的对象。class A

{

public:                          加const 防止拷贝构造函数修改形参的值

A(const A&a);

} ;

拷贝构造函数的作用是用对象初始化对象

对象成员的构造函数调用顺序取决于对象成员在类中声明的顺序

C++中,编译系统自动为一个类生成缺省构造函数的条件是该类没有定义任何构造函数

缺省参数函数参数默认值

要禁止修改指针p本身,又要禁止修改p所指向的数据,p应定义为const char * const p = ABCD;

多态性不同对象调用相同名称的函数

 类与对象     *为选读

  1. 数据成员--不能初始化
  2. 成员函数--可以使用类中的所有成员(变量和函数)

  1>声明与实现都定义在类内部

  2>声明在类内部,实现在类外部

  1. private--1>类内可以被访问

        2>类外不能被直接访问,通过公有成员函数访问

        3>默认类型(数据成员常用)

        4>继承关系中,子类不可以访问父类的private成员

  1. protected--1>类内可以被访问

           2>类外不能被直接访问,通过公有成员函数访问

           3>继承关系中,子类可以访问父类的protected成员

  1. public--1>类内和类外都可以被访问

        2>成员函数常用

  1. 构造函数--1>特殊的成员函数为新对象分配内存空间

           2>功能:为新对象分配内存空间;初始化数据成员

           3>写法:a.构造函数名与类名相同

                   b.没有返回时值类型

                   c.可以重载

d.一般为public(例如:在成员函数里生成对象,可以为私有)

           4>使用:声明对象(或需要构造新对象)时系统自动调用

           5>默认构造函数

            (只有一个,无参数/每个参数都有默认值,无函数体)

  1. 析构函数--1>特殊的类成员函数,回收内存空间

           2>功能:撤销类的对象

           3>写法:a.析构函数名与类名相同,前面冠以~

                   b.没有参数,返回时值类型

                   c.不可以重载,只有一个

                   d.公有

           4>使用:撤销对象时系统自动调用

           5>默认析构函数

            (只有一个,无参数/每个参数都有默认值,无函数体)

  • 构造函数与析构函数调用顺序:先构造后析构,后构造先析构
  1. 引用--1>已经定义的变量的别名,不为其分配内存空间

       2>&是引用类型说明符

       3>声明引用时,必须同时对其进行初始,且不能再把该引用名作为其他变量名的别别名

       4>不能建立数组的引用,只能建立数组元素的引用。

       5>使用:a.引用作为函数参数 --类似于地址传值

              b.引用作为函数返回值--一般函数返回值时,要生成一个临时变量作为返回值的副本,而用引用作为返回值时,不生成值的副本。

注意:引用作为函数的返回值的情况:

      I.全局变量  II.引用参数传递过来的变量

      ##不能是函数中的局部变量,这时返回的局部变量地址已经失效。

9.复制构造函数:特殊的构造函数

1>功能:用一个已经存在的对象去初始化一个新的同类对象   

  2>写法:a.函数名与类名相同

     b.形参是本类对象的引用,无返回值类型

          c.默认拷贝构造函数/自定义拷贝构造函数

3>以下情况时,系统自动调用复制构造函数

a.用一个对象初始化另一个对象

b.函数形参是类的对象,函数形参和实参结合时

c.函数返回值是类的对象,当函数返回时

10.成员对象与构造函数

1>定义:类中的成员,除了成员数据和成员函数外,还有成员对象,即用

其他类的对象作为类的成员,也称为对象成员,使用成员对象的技术称为聚合。成员对象是实体,系统不仅为它分配内存,而且要进行初始化。

2>构造函数写法:

a. 类名::构造函数名(参数总表):对象成员1(参数名表1),对象成员2(参数名表2)……对象成员n(参数名表n){……}

//参数总表:含数据类型;参数名表:不含数据类型

b. 构造函数可以采用多种方法对数据成员初始化:

  • 在构造函数体中初始化
  • 在构造函数头部初始化
  • 混合初始化

3>构造函数调用顺序:

     含对象成员的类对象的初始化时,首先依次自动调用各成员对象的构造函数,再执行该类对象自己的构造函数的函数体部分。各成员对象的构造函数调用的次序与类定义中说明的顺序一致,而与它们在构造函数成员初始化列表中的顺序无关。

4>析构函数调用顺序:

因为析构函数没有参数,所以包含成员对象的类的析构函数形式上并无特殊之处。但是撤销该类对象时,会首先调用自己的析构函数,再调用成员对象的析构函数,调用次序与初始化时的次序相反。

11. 运算符重载

1>定义:运算符的重载是特殊的函数重载,必须定义一个函数,并通知C++编译器,当遇到该重载的运算符时调用此函数。对运算符进行定义叫做运算符重载函数,通常为类的成员函数。

2>写法:

a. 返回值类型 operator重载的运算符(参数表){……}

//operator是关键字,它与重载的运算符一起构成函数名。

b.引用作为参数:const 引用

Complex operator+(const Complex &c){ }         

注意:参数采用对象的引用而不是对象本身,调用时不再重新分配内存建立一个复制的对象,函数效率会更高。而在引用形式参数类型说明前加const关键字,表示被引用的实参是不可改变的,如程序员不当心在函数体中重新赋值了被引用的实参, C++编译器会认为出错。

[附加]:const引用可以实现不可寻址的值,或不同数据类型的引用

     <1>const  int &q=7;   q的值不能变

     <2>int p=3;  const  double &q=p;  => double t=p;   const  double &q=t;  //t为临时变量

3>实现:运算符的左操作数一定是对象,因为重载的运算符是该对象的成员函数,而右操作数是该函数的参数。

  • c3=c1+c2解释为:c1.operator+(c2) ;
  • 用标示符temp表示返回的临时变量,c3=temp,解释为:c3.operator=(temp)

4>默认的赋值重载运算符

Complex &operator+(const Complex &c){ }     //返回值类型是为了a=b=c的形式

5>右操作数不是类的对象    c3=c1+0.6;     c3= 0.6+c1; (错误,用友元解决)

Complex operator+(const Complex &c){ }  或  Complex operator+(double c){ }

6>不允许重载的运算符     ?:    ./.*    ::       sizeof

12. 友元

   1>定义:某一个类的友元(friend)函数不属于该类,但可以在类外访问该类中的任何成员,包括私有数据。友元函数用关键字friend说明。

2>写法:friend complex operator + (const complex &c1,const complex &c2)

//“const 引用”作为参数,可以实现: a+0.6;  0.6+a;    a+b

  3>说明:

a. friend只用于类说明中,定义时不加friend

b.注意友元不是成员函数,但可以直接访问私有成员

c. d+c被C++编译器解释为:operator+(d,c)

d.友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。

4> 运算符重载的三种形式

成员函数形式

CInt operator+(const CInt &r);

友元函数形式

friend CInt operator+(const Cint &r1,const CInt &r2);

全局函数形式

CInt operator+(const Cint &r1,const CInt &r2);

函数调用

特点

说明

成员函数形式

a.operator+(b)

1.定义为类的成员函数

2.左操作数必须是类的对象

3.右操作数设为函数参数

1.左操作数作为当前对象通过this指针访问

2.右操作数通过函数参数访问

友元函数形式

operator+(a,b)

1.定义为类的友元函数

2.左操作数不一定是类的对象

3.左右操作数按顺序作为函数的参数

1.作为类的友元直接访问对象的私有数据成员

2.有些运算符的参数只能为特定类型,如,流插入运算符”<<”

全局函数形式

operator+(a,b)

1.定义为全局函数

2.左右操作数按顺序作为函数的参数

一般要通过共有访问函数访问对象的私有数据成员

5> 只能重载为类的成员函数的运算符:

赋值运算符

 =

函数调用运算符

()

下标运算符

[]

成员访问运算符

->

13.静态成员:是指声明为static的类成员

1>在类的范围内所有对象共享的某个数据,静态数据成员不属于类的某一特定对象,而是属于整个类。

2>无论私有或非私有,必须在类外初始化,用(::)来指明所属的类。

3>静态成员函数只能直接访问类中的静态成员。

4>非静态成员时,必须借助对象名或指向对象的指针。

5>静态成员(变量和函数)可以用类名或对象名访问。

14.指针:

  1>指向对象的指针---引用成员方式 :-> 或  *.

  [补充]

a. 指向const对象的指针:   const int i = 9;const int *p = &i;

//允许给p指针重新赋值,使其指向另一个const对象,但是不允许通过p指针来修改所指对象的值。

b. const指针:     int i = 0;int *const p = &i;

//const指针的值是不能被修改的,这意味着不能使其指向其他的对象。所以在定义的时候就必须要初始化。

c.指向const对象的const指针:   const i = 10; const int *const p = &i;

//既不能修改指针p所指向的对象的值,也不允许修改该指针p的指向

2>this指针

a.定义: 只能在一个类的成员函数中调用,它表示当前对象的地址

b.使用:(1) 数据成员与成员函数参数同名时

       (2) 成员函数返回值时当前类的对象

15.string 类

  C++的字符串 string类,它重载了运算符,连接、索引和复制等操作不必使用函数,使运算更加方便,而且不易出错。

#include<string>

using namespace std;

16.多文件结构

模板

通用的代码就必须不受数据类型的限制,可以把数据类型改为一个设计参数。这种类型的程序设计称为参数化(parameterize) 程序设计。

17.函数模板:

1>定义:用来创建一个通用函数,支持多种不同类型形参。

2>写法:

template<模板参数表>返回类型 函数名([形式参数表]){……}

// <模板参数表>尖括号中不能为空,参数可以有多个,用逗号分开。

//由关键字 class 或 typename(建议用typename) 后加一个标识符构成。

3>使用:使用函数模板,只需以函数模板名为函数名进行函数调用:

      函数名(数据实参表);

18.类模板:

1>写法:

template<模板参数表> class 类名{};

template<模板参数表> 返回类型 类名<模板参数名表>::成员函数名([形参表]) { }

2>说明:

a.类模板的定义格式与类相同,包含数据成员与成员函数

b.类模板中的成员函数都是函数模板

c.函数声明(声明与定义分开)时不加“template<模板参数表>”

d.模板参数有两种:模板类型参数和模板非类型参数。

3>使用:类模板名 <具体参数类型说明符> 对象名 (初始化参数表)

4>模板非类型参数:表示该参数名代表了一个常量。

19.模板与类参数:

在面向对象程序设计中,函数模板有两种常见的应用方式:

1>函数模板作为类模板的成员函数,在模板类型参数中重载函数与运算符,直接访问私有数据成员,实现通用算法。

2>独立的函数模板(非成员函数)处理模板类(或普通类,或普通数据),以类模板为参数,借助模板类型参数中重载的函数或运算符实现通用算法。

20.动态内存分配

  1>动态分配与释放

a.分配:当程序运行到需要动态分配变量或对象时,必须向系统申请取得自由存储区中的一块所需大小的存储空间,用于存储该变量或对象。

指针变量名=new 类型名(初始化式)

    b.释放:当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存储空间,这样系统就能进行再次分配,做到重复使用有限的资源。 delete 指针名;

//这时释放了pi所指的目标的内存空间,也就是撤销了该目标,称动态内存释放,但指针pi本身并没有撤销,该指针所占内存空间并未释放。

C.数组的动态内存分配

char *pc;

int n;  cin>>n;           //动态数组个数

pc=new char[n];       //申请内存

strcpy(pc,”china”);

delete [ ]pc;               //释放内存

指针变量名=new 类型名[下标表达式];  //“下标表达式”可以是变量表达式

delete[ ] 指向该数组的指针变量名;

    特点:i.”下标表达式”可以在运行时确定

          ii.如果有char *pc1,令pc1=pc,同样可用delete [ ] pc1来

            释放该空间。

         iii.没有初始化式,不可对数组初始化。

2>自由存储区对象与构造函数

  通过new建立的对象要调用构造函数,通过delete删除对象也要调用析构函数。

3>浅复制与深复制

a.浅复制:默认复制构造函数,可用一个类对象初始化另一个类对象,称为默认的按成员复制,而不是对整个类对象的按位复制。这称为浅复制。

b.深复制:重新定义复制的构造函数,给每个对象独立分配一个自由存储区对象,称深复制。

21.继承

1>定义:被继承的类称为基类(base class)或超类(superclass),新的类为派生类(derived class)或子类(subclass)。

2>写法:派生类的定义:

class 派生类名:访问限定符  基类名1《,访问限定符 

    基类名2,……,访问限定符  基类名n{

private:

              成员表1;》 //派生类增加或替代的私有成员

public:

              成员表2;》 //派生类增加或替代的公有成员

protected:

              成员表3;》 //派生类增加或替代的保护成员

}

3>访问限定符:公有派生是绝对主流

继承方式

基类特性

派生类特性

派生类中对基类成员的访问限定 

在派生类对象访问基类成员 

公有继承

public

public

可访问

protected

protected

不可访问

private

不可访问

不可访问

私有继承

public

private

不可访问

protected

private

不可访问

private

不可访问

不可访问

保护继承

public

protected

不可访问

protected

protected

不可访问

private

不可访问

不可访问

4〉派生类构造函数

派生类名(参数总表):基类名1(参数名表1)《,基类名2(参数名表2),……,基类名n(参数名表n)》,《成员对象名1(成员对象参数名表1),……,成员对象名m(成员对象参数名表m)》{

……//派生类新增成员的初始化;

} //所列出的成员对象名全部为新增成员对象的名字

5〉派生类构造函数各部分执行次序:

a.调用基类构造函数,按它们在派生类定义的先后顺序,顺序调用。

b.调用成员对象的构造函数,按它们在类定义中声明的先后顺序调用。

c.派生类的构造函数体中的操作。

//注意:

1.如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的默认构造函数。

2. 如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数,显式给出基类名和参数表。

6>析构函数调用次序与构造函数相反

  1. 多重继承

1〉基类构造函数的调用顺序:

  1. 派生类构造函数执行顺序是先执行所有基类的构造函数,再执行派生类本身构造函数。

b.处于同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的各基类顺序,与派生类构造函数中所定义的成员初始化列表的顺序无关。

多继承时的重名成员:

2〉在多个基类中有重名的成员:

   使用作用域运算符::访问重名的成员

23. 虚基类

1〉引入:

a.多继承时,发生了重名成员。且这些重名成员来自同一个间接基类。

b.将共同基类设置为虚基类,从不同路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。

2〉写法:

class 派生类名:virtual  访问限定符  基类类名{...};

class 派生类名:访问限定符  virtual  基类类名{...};

3〉构造函数:

派生类名(参数总表):基类名1(参数名表1),……,《成员对象名1(成员对象参数名表1),……底层虚基类名1(参数名表1),……, 底层虚基类名r(参数名表r){

}; 

//在多层虚拟继承构造函数中,基类名不仅要列出直接基类,而且要列出底层虚基类,否则编译器认为出错。如不是虚拟继承只能列直接基类。

4〉构造函数调用顺序

首先是虚基类的构造函数并按它们声明的顺序构造。

第二是非虚基类的构造函数按它们声明的顺序调用。

第三是成员对象的构造函数。

最后是派生类自己的构造函数被调用。

24.派生类应用讨论

1>派生时的同名覆盖:

a.数据成员的同名覆盖

b.成员函数的同名覆盖

c.使用作用域运算符::访问被覆盖的成员

2> 赋值兼容规则:

在任何需要基类对象的地方都可以用公有派生类的对象来代替:

  1. 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。
  2. 可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。同样也不能反过来做。
  3. 派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员

3>继承与聚合:

继承使派生类可以利用基类的成员,如果我们把基类的对象作为一个新类的对象成员,也可以取得类似的效果。派生类采用继承方法,成员对象是聚合的概念。

4>派生类与模板:

  模板追求的是运行效率,而派生追求的是编程的效率。 

25.多态性与虚函数

C++中有两种多态性

编译时的多态性

运行时的多态性

运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的。目的也是建立一种通用的程序。通用性是程序追求的主要目标之一。  

通过函数的重载和运算符的重载来实现的。

C++中有两种多态性

编译时的多态性

运行时的多态性

运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的。目的也是建立一种通用的程序。通用性是程序追求的主要目标之一。  

通过函数的重载和运算符的重载来实现的。

C++中有两种多态性

编译时的多态性

运行时的多态性

运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的。目的也是建立一种通用的程序。通用性是程序追求的主要目标之一。  

通过函数的重载和运算符的重载来实现的。

  1. 虚函数:

virtual  返回类型  函数名(参数表){…}

//关键字virtual指明该成员函数为虚函数。virtual仅用于类定义中,如虚函数在类外定义,不可再加virtual。

//当一个类的某个成员函数被定义为虚函数,则由该类派生出来的所有派生类中,该函数始终保持虚函数的特征。

2>成员函数设置为虚函数的要点:

a.派生类中定义虚函数必须与基类中的虚函数同名外,还必须同参数表,同返回类型。否则被认为是重载,而不是虚函数。

b.只有类的成员函数才能说明为虚函数,这是因为虚函数仅适用于有继承关系的类对象。

c.静态成员函数和内联函数,不能作为虚函数。

d.一个类对象的静态和动态构造是相同的,实现动态多态性时,必须使

用基类类型的指针变量或引用使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。

e.析构函数可定义为虚函数,构造函数不能定义虚函数,因为在调用构造函数时对象还没有完成实例化。通常把析构函数定义为虚函数,实现撤消对象时的多态性。

g.函数执行速度要稍慢一些。为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现。所以多态性总是要付出一定代价,但通用性是一个更高的目标。

3>纯虚函数:

  1. 定义:是指被标明为不具体实现的虚拟成员函数。它用于这样的情况:定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类。
  2. 写法:virtual 返回类型 函数名(参数表)=0
  3. 含有纯虚函数的基类是不能用来定义对象的。纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类。
  • 72
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
复习资料 1.1选择题 1.在一个C++程序中,main函数的位置( c )。 (a) 必须在程序的开头 (b) 必须在程序的后面 ( c ) 可以在程序的任何地方 (d) 必须在其它函数中间 2.用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) 解释 (b) 汇编 (c) 编辑 (d) 编译 3.C++程序基本单位是( c )。 (a) 数据 (b) 字符 (c) 函数 (d) 语句 4. C++程序中的语句必须以( b )结束。 (a) 冒号 (b) 分号 (c) 空格 (d)花括号 5. 执行C++程序时出现的“溢出”错误属于( c )错误。 (a) 编译 (b) 连接 (c) 运行 (d) 逻辑 6.下列选项中,全部都是C++关键字的选项为( c )。 (a) while IF static (b) break char go (c) sizeof case extern (d) switch float integer 7. 按C++标识符的语法规定,合法的标识符是( a ,c )。 (a) _abc (b) new (c) int1 (d) “age” 8.下列选项中,( a )不是分隔符。 (a) ? (b) ; (c) : (d) () 9.下列正确的八进制整型常量表示是( b )。 (a) 0a0 (b) 015 (c) 080 (d) 0x10 10.下列正确的十六进制整型常量表示是( a,b,d )。 (a) 0x11 (b) 0xaf (c) 0xg (d) 0x1f 11.在下列选项中,全部都合法的浮点型数据的选项为( a,b,d ),全部都不合法的浮点型数据选项是( c )。 (a) -1e3 , 15. , 2e-4 (b) 12.34 , -1e+5 , 0.0 (c) 0.2e-2.5 , e-5 (d) 5.0e-4 , 0.1 , 8.e+2 12.下列正确的字符常量为( b,d )。 (a) " a " (b) '\0' (c) a (d) '\101' 13.下列选项中,( a,b,c )能交换变量a和b的值。 (a) t=b ;b=a ;a=t; (b) a=a+b ;b=a-b ;a=a-b; (c) t=a ;a=b ;b=t; (d) a=b ; b=a ; 14.执行语句 int i = 10,*p = &i; 后,下面描述错误的是( a )。 (a) p的值为10 (b) p指向整型变量i (c) *p表示变量i的值 (d) p的值是变量i的地址 15.执行语句 int a = 5,b = 10,c;int *p1 = &a, *p2 = &b; 后,下面不正确的赋值语句是( b )。 (a) *p2 = b; (b) p1 = a; (c) p2 = p1; (d) c = *p1 *(*p2); 16.执行语句 int a = 10,b;int &pa = a,&pb = b; 后,下列正确的语句是( b )。 (a) &pb = a; (b) pb = pa; (c) &pb = &pa; (d) *pb = *pa; 17.执行下面语句后,a和b的值分别为( b )。 int a = 5,b = 3,t; int &ra = a; int &rb = b; t = ra;ra = rb;rb = t; (a) 3和3 (b) 3和5 (c) 5和3 (d) 5和5 18. 在下列运算符中,( d )优先级最高。 (a) <= (b)*= (c)+ (d)* 19. 在下列运算符中,( d )优先级最低。 (a) ! (b)&& (c)!= (d)?: 20.设i=1,j=2,则表达式i+++j的值为( c )。 (a) 1 (b)2 (c)3 (d)4 21.设i=1,j=2,则表达式 ++i+j的值为( d )。 (a)1 (b)2 (c)3 (d)4 22.在下列表达式选项中,( c )是正确。 (a)++(a++) (b)a++b (c)a+++b (d)a++++b 23.已知i=0,j=1,k=2,则逻辑表达式 ++i||--j&&++k的值为( b )。 (a) 0 (b)1 (c)2 (d)3 24. 执行下列语句后,x的值是( d ),y的值是( c )。 int x , y ; x = y = 1; ++ x || ++ y ; (a) 不确定 (b) 0 (c) 1 (d) 2 25.设X为整型变量,能正确表达数学关系1< X < 5的C++逻辑表达式是( b, c, d )。 (a) 1<X<5 (b) X==2||X==3||X==4 (c) 1<X&&X<5 (d) !(X<=1)&&!(X>=5) 26. 已知x=5,则执行语句 x += x -= x*x ; 后,x的值为( c )。 (a)25 (b)40 (c)-40 (d)20 27. 设a=1,b=2,c=3,d=4,则条件表达式a<b?a:c<d?c:d的值为( a )。 (a) 1 (b)2 (c)3 (d)4 28. 逗号表达式“(x=4*5,x*5),x+25的值为( d )。 (a) 25 (b)20 (c)100 (d)45 1.已知 int i,x,y;在下列选项中错误的是( c )。 (a) if(x == y)i++; (b) if(x = y)i--; (c) if( xy )i--; (d) if( x+y )i++; 2.设有函数关系为y= ,下面选项中能正确表示上述关系为( c )。 (a) y = 1; (b) y = -1; if( x>=0 ) if( x!=0) if( x==0 )y=0; if( x>0 )y = 1; else y = -1; else y = 0 (c) if( x<=0 ) (d) y = -1; if( x<0 )y = -1; if( x<=0 ) else y = 0; if( x<0 )y = -1; else y = 1; else y = 1; 3.假设i=2,执行下列语句后i的值为( b )。 switch(i) { case 1:i++; case 2:i--; case 3:++i;break; case 4:--i; default:i++; } (a) 1 (b) 2 (c) 3 (d) 4 4.已知int i=0,x=0;下面while语句执行时循环次数为( d )。 while(!x && i<3 ){ x++;i++;} (a) 4 (b) 3 (c) 2 (d) 1 5.已知int i=3;下面do_while 语句执行时循环次数为( b )。 do{ i--; cout<<i<<endl;}while( i!= 1 ); (a) 1 (b) 2 (c) 3 (d) 无限 6.下面for语句执行时循环次数为( b )。 for ( int i=0,j=5;i=j;) { cout << i << j << endl; i++;j--; } (a) 0 (b) 5 (c) 10 (d) 无限 7.以下死循环的程序段是( b )。 (a) for(int x=0;x<3 ;){ x++;}; (b) int k=0; do { ++k;} while( k>=0 ); (c) int a=5;while(a){ a--;}; (d) int i=3;for(;i;i--); 1.以下正确的函数原型为( d )。 (a) f( int x; int y ); (b) void f( x, y ); (c) void f( int x, y ); (d) void f( int, int ); 2.有函数原型 void fun1( int ); 下面选项中,不正确的调用是( c )。 (a) double x = 2.17 ; fun1( x ); (b) int a = 15 ; fun1( a*3.14 ) ; (c) int b = 100 ; fun1( & b ); (d) fun1( 256 ); 3.有函数原型 void fun2( int * ); 下面选项中,正确的调用是( c )。 (a) double x = 2.17 ; fun2( &x ); (b) int a = 15 ; fun2( a*3.14 ); (c) int b = 100 ; fun2( &b ); (d) fun2( 256 ); 4.有函数原型 void fun3( int & ); 下面选项中,正确的调用是( c )。 (a) int x = 2.17; fun3( &x ); (b) int a = 15; fun3( a*3.14 ); (c) int b = 100; fun3( b ); (d) fun3( 256 ) ; 5.有声明 int fun4( int ); int (*pf)(int) = fun4; 下面选项中,正确的调用是( c )。 (a) int a = 15 ;int n = fun4( &a ); (b) int a = 15; cout<<pf(a*3.14); (c) cout<<(*pf)( 256 ); (d) cout << *pf( 256 ); 注意:选项(b)也可以调用函数fun4,但由于实参为浮点型表达式,VC6编译器将出现与形参类型不匹配的警告。 6.在VC中,若定义一个函数的返回类型为void,以下叙述正确的是( a,c )。 (a) 用语句调用函数 (b) 用表达式调用函数 (c) 没有返回值 (d) 通过return语句可以返回指定值 7.函数参数的默认值不允许为( c )。 (a) 全局常量 (b) 全局变量 (c) 局部变量 (d) 函数调用 8.使用重载函数编程序的目的是( a )。 (a) 使用相同的函数名调用功能相似的函数 (b) 共享程序代码 (c) 提高程序的运行速度 (d) 节省存贮空间 9.下列的描述中( b )是错误的。 (a) 使用全局变量可以从被调用函数中获取多个操作结果 (b) 局部变量可以初始化,若不初始化,则系统默认它的值为0 (c) 当函数调用完后,静态局部变量的值不会消失 (d) 全局变量若不初始化,则系统默认它的值为0 10.下列选项中,( c ,d )的具有文件作用域。 (a) 语句标号 (b) 局部变量 (c) 全局变量 (d) 静态全局变量 1.以下对一维数组 a 的正确定义是( c )。 (a) int n = 5, a[n]; (b) int a(5); (c) const int n = 5; int a[n]; (d) int n; cin>>n; int a[n]; 2.下列数组定义语句中,不合法的是( a )。 (a) int a[3] = { 0, 1, 2, 3 }; (b) int a[] = { 0, 1, 2 }; (c) int a[3] = { 0, 1, 2 }; (d) int a[3] = { 0 }; 3.已知 int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, *p = a ;则不能表示数组 a 中元素的式子是( c )。 (a) *a (b) *p (c) a (d) a[ p-a ] 4.已知 int a[] = { 0, 2, 4, 6, 8, 10 }, *p = a ; 值不等于0的表达式是( b,d )。 (a) *(p++) (b) *(++p) (c) *(p-- ) (d) *(--p) 5.以下不能对二维数组a进行正确初始化的语句是( c )。 (a) int a[2][3] = { 0 }; (b) int a[][3] = { { 0, 1 }, { 0 } }; (c) int a[2][3] = { { 0, 1 }, { 2, 3 }, { 4, 5 } }; (d) int a[][3] = { 0, 1, 2, 3, 4, 5 }; 6.已知int a[][3] = { { 0, 1 }, { 2, 3, 4 }, { 5, 6 }, { 7 } } ;则 a[2][1]的值是( c )。 (a) 0 (b) 2 (c) 6 (d) 7 7.已知int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ; 则不能表示数组元素a[2][1]的地址是( a,b )。 (a) &[2][1] (b) *(a[2]+1) (c) a[2]+1 (d) *(a+2)+1 8.已知char *a[]={ "fortran", " basic", "pascal", "java", "c++" ; 则 cout<<a[3];的显示结果是( c )。 (a) t (b) 一个地址值 (c) java (d) javac++ 9.若用数组名作为调用函数的实参,则传递给形参的是( a )。 (a) 数组存贮首地址 (b) 数组的第一个元素值 (c) 数组中全部元素的值 (d) 数组元素的个数 10.在下列选项中,( b, d )是错误的。 (a) gets和puts函数可以输入输出包含空格的字符串 (b) cin不能输入包含空格的字符串 (c) cout不能输出包含空格的字符串 (d) 使用赋值运算符可以对字符数组整体赋值 11.下列描述中,错误的是( c )。 (a) 输出字符指针就是输出字符串 (b) 输出字符指针的间接引用就是输出单个字符 (c) 具有相同字符的两个字符串常量相等 (d) 两个数组名的比较是地址的比较 12.判断字符串s1和s2是否相等的表达式为( d )。 (a) s1=s2 (b) s1==s2 (c) strcpy(s1,s2)==0 (d) strcmp(s1,s2)==0 13.判断字符串s1是否大于字符串s2的表达式为( c )。 (a) s1>s2 (b) strcmp(s1,s2)==0 (c) strcmp(s1,s2)>0 (d) strcmp(s2,s1)>0 5.若有以下声明和定义,则下列错误的引用是( d )。 struct worker { int no ; char name[ 20 ] ; } w, *p = &w ; (a) w.no (b) p->no (c) (*p).no (d) *p.no 6.若有以下声明和定义,则下列引用非法的是( d )。 struct data { int n; float score; data *q ; }; data a[3] = {1001,87,&a[1],1002,75,&a[2],1003,90,&a[0]}; data *p = a; (a) p->n++ (b) (*p).n++ (c) ++p->n (d) *p->n 7.关于类和对象不正确的说法是( c )。 (a) 类是一种类型,它封装了数据和操作 (b) 对象是类的实例 (c) 一个类的对象只有一个 (d) 一个对象必属于某个类 8.在类定义的外部,可以被访问的成员有( c )。 (a) 所有类成员 (b) private或protected的类成员 (c) public的类成员 (d) public或private的类成员 9.关于this指针的说法错误的是( a,d )。 (a) this指针必须显式说明 (b) 当创建一个对象后,this指针就指向该对象 (c) 成员函数拥有this指针 (d) 静态成员函数拥有this指针 10.声明一个类的对象时,系统自动调用( b,d )函数;撤消对象时,系统自动调用( c )函数。 (a) 成员函数 (b) 构造函数 (c) 析构函数 (d) 复制构造函数 11.下面对构造函数的不正确描述是( b )。 (a) 系统可以提供默认的构造函数 (b) 构造函数可以有参数,所以也可以有返回值 (c) 构造函数可以重载 (d) 构造函数可以设置默认参数 12.下面对析构函数的正确描述是( a,c )。 (a) 系统可以提供默认的析构函数 (b) 析构函数必须由用户定义 (c) 析构函数没有参数 (d) 析构函数可以设置默认参数 13.对静态成员的不正确描述是( c,d )。 (a) 静态成员不属于对象,是类的共享成员 (b) 静态数据成员要在类外定义和初始化 (c) 调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针 (d) 只有静态成员函数可以操作静态数据成员 14.下面选项中,不是类的成员函数为( c )。 (a) 构造函数 (b) 析构函数 (c) 友元函数 (d) 复制构造函数 15.下面对友员的错误描述是( d )。 (a) 关键字friend用于声明友员 (b) 一个类中的成员函数可以是另一个类的友员 (c) 友员函数访问对象的成员不受访问特性影响 (d) 友员函数通过this指针访问对象成员 1.在下列运算符中,能重载的是( a,c,d )。 (a) ! (b) sizeof (c) new (d) delete 2. 在下列运算符中,不能重载的是( c )。 (a) <= (b) >> (c) && (d) &= 3.下列关于运算符重载的描述中,( d )是正确的。 (a) 可以改变参与运算的操作数个数 (b) 可以改变运算符原来的优先级 (c) 可以改变运算符原来的结合性 (d) 不能改变原运算符的语义 4.下列函数中,能重载运算符的函数是( b,c )。 (a) 成员函数 (b) 构造函数 (c) 析构函数 (d) 友员函数 5.不能用友员函数重载的是( a )。 (a) = (b) == (c) += (d) != 6.下面描述中,错误的是( b )。 (a) 只有系统预先定义的运算符才可能被重载 (b) 使用类型转换函数不能把一个类转换为另一个类 (c) 使用类型转换函数可以把类转换为基本类型 (d) 类型转换函数只能定义为一个类的成员函数,不能定义为类的友员函数 1.在c++中,类与类之间的继承关系具有( c )。 (a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性 2.下列关于类的继承描述中,( a,b )是错误的。 (a) 派生类可以访问基类的所有数据成员,调用基类的所有成员函数 (b) 派生类也是基类,所以基类具有派生类的全部属性和方法 (c) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法 (d) 一个基类可以有多个派生类,一个派生类可以有多个基类 3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( a )。 (a) public 成员 (b)private成员 (c) protected成员 (d)友员 4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( b )。 (a) public 成员 (b)private成员 (c) protected成员 (d)友员 5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( c )。 (a) public 成员 (b)private成员 (c) protected成员 (d)友员 6.不论派生类以何种方式继承基类,都不能使用基类的( b )。 (a) public 成员 (b)private成员 (c) protected成员 (d)public 成员和protected成员 7.下面描述中,错误的是( b, c )。 (a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问 (b) 在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问 (c) 在基类定义的public和protected成员在保护继承的派生类中不可见 (d) 在派生类中不可见的成员要变成可访问的需进行访问声明 8.在c++中,不能被派生类继承的函数是( b,c )。 (a) 成员函数 (b)构造函数 (c) 析构函数 (d)静态成员函数 9.在创建派生类对象时,构造函数的执行顺序是( d )。 (a) 对象成员构造函数、基类构造函数、派生类本身的构造函数 (b) 派生类本身的构造函数、基类构造函数、对象成员构造函数 (c) 基类构造函数、派生类本身的构造函数、对象成员构造函数 (d) 基类构造函数、对象成员构造函数、派生类本身的构造函数 10.当不同的类具有相同的间接基类时,有特点( d )。 (a) 各派生类对象将按继承路线产生自己的基类版本 (b) 派生类对象无法产生自己的基类版本 (c) 为了建立惟一的间接基类版本,应该必须改变类格 (d) 为了建立惟一的间接基类版本,应该声明虚继承 1.在C++中,要实现动态联编,必须使用( d )调用虚函数。 (a) 类名 (b) 派生类指针 (c) 对象名 (d) 基类指针 2.下列函数中,可以作为虚函数的是( c,d )。 (a) 普通函数 (b) 构造函数 (c) 成员函数 (d) 析构函数 3.在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( b )。 (a) 不同 (b) 相同 (c) 相容 (d) 部分相同 4.下面函数原型声明中,( b )声明了fun为纯虚函数。 (a) void fun()=0; (b)virtual void fun()=0; (c) virtual void fun(); (d)virtual void fun(){ }; 5.若一个类中含有纯虚函数,则该类称为( d )。 (a) 基类 (b) 纯基类 (c) 派生类 (d) 抽象类 6.假设 Aclass为抽象类,下列声明( a,c,d )是错误的。 (a) Aclass fun( int ) ; (b)Aclass * p ; (c) int fun( Aclass ) ; (d)Aclass Obj ; 7.下面描述中,正确的是( b,d )。 (a) 虚函数是没有实现的函数 (b) 纯虚函数的实现在派生类定义 (c) 抽象类是只有纯虚函数的类 (d) 抽象类指针可以指向不同的派生类 使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类circle作为基类。在circle类中定义一个数据成员radius和两个虚函数area()和volume()。由circle类派生sphere类和column类。在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。 #include <iostream.h>const double PI=3.14159265;class circle{ public: circle(double r) { radius = r; } virtual double area() { return 0.0; } virtual double volume() { return 0.0; } protected: double radius;};class sphere:public circle{ public: sphere( double r ):circle( r ){ } double area() { return 4.0 * PI * radius * radius; } double volume() { return 4.0 * PI * radius * radius * radius / 3.0; }};class column:public circle{ public: column( double r,double h ):circle( r ) { height = h; } double area() { return 2.0 * PI * radius * ( height + radius ); } double volume() { return PI * radius * radius * height; } private: double height;};void main(){ circle *p; sphere sobj(2); p = &sobj; cout << "球体:" << endl; cout << "体积 = " << p->volume() << endl; cout << "表面积 = " << p->area() << endl; column cobj( 3,5 ); p = &cobj; cout << "圆柱体:" << endl; cout << "体积 = " << p->volume() << endl; cout << "表面积 = " << p->area() << endl;} 2、定义一个Book(图书)类,在该类定义中包括 数据成员: bookname(书名)、price(价格)和number(存书数量); 成员函数: display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。 在main函数中,要求创建某一种图书对象,并对该图书进行简单的显示、借阅和归还管理。 #include <stdlib.h>#include <stdio.h>int main(){class Book{public:long number;float price;char *bookname;void display(){printf("The name of this book is:%s\n",bookname);printf("The price of this book is:%fdolars\n",price);printf("The number of such book is:%d\n",number);}void restore(){number++;}void borrow(){number--;}};Book b;b.bookname="Harry Potter";b.price=18.00;b.number=100;b.display();b.borrow();b.display();b.restore();b.display();system("pause");return 0;} 1. #include <iostream.h> void main() { int a,b,c,d,x; a = c = 0; b = 1; d = 20; if( a ) d = d-10; else if( !b ) if( !c ) x = 15; else x = 25; cout << d << endl; } 2. #include <iostream.h> void main() { int a = 0, b = 1; switch( a ) { case 0: switch( b ) { case 0 : cout << "a=" << a << " b=" << b << endl; break; case 1 : cout << "a=" << a << " b=" << b << endl; break; } case 1: a++; b++; cout << "a=" << a << " b=" << b << endl; } } 3. #include <iostream.h> void main() { int i = 1; while( i<=10 ) if( ++i % 3 != 1 ) continue; else cout << i << endl; } 4、#include < iostream.h > class T { public : T( int x, int y ) { a = x ; b = y ; cout << "调用构造函数1." << endl ; cout << a << '\t' << b << endl ; } T( T &d ) { cout << "调用构造函数2." << endl ; cout << d.a << '\t' << d.b << endl ; } ~T() { cout << "调用析构函数."<<endl; } int add( int x, int y = 10 ) { return x + y ; } private : int a, b ; }; void main() { T d1( 4, 8 ) ; T d2( d1 ) ; cout << d2.add( 10 ) << endl ; } 答案: 调用构造函数1. 4 8 调用构造函数2. 4 8 20 调用析构函数. 调用析构函数. 5. #include < iostream.h > struct data { int n ; float score ; } ; void main() { data a[3] = { 1001,87,1002,72,1003,90 } , *p = a ; cout << (p++)->n << endl ; cout << (p++)->n << endl ; cout << p->n++ << endl ; cout << (*p).n++ << endl ; } 6. #include < iostream.h > struct node { char * s ; node * q ; } ; void main() { node a[ ] = { { "Mary", a+1 }, { "Jack", a+2 }, { "Jim", a } } ; node *p = a ; cout << p->s << endl ; cout << p->q->s << endl ; cout << p->q->q->s << endl ; cout << p->q->q->q->s << endl ; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LucianaiB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值