(二)构造函数、析构函数、静态成员、友元

2022/6/27 23:29:46

本文主要是介绍(二)构造函数、析构函数、静态成员、友元,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1-3   C++程序中,一个类的构造函数可以被重载。
1-4   C++程序中,一个类的析构函数可以被重载。
1-5析构函数的作用主要是释放对象占用的资源。
  1-8如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加上const关键字。
1-9在类的成员函数说明后可以加const关键字,则该成员函数成为常成员函数。
1-10常量对象可以使用常量成员函数。
1-11在定义常量成员函数和声明常量成员函数时都应该使用const关键字。
1-12当用一个对象去初始化同类的另一个对象时,要调用拷贝构造函数。
1-13对象间赋值将调用拷贝构造函数。
1-14对象数组生命期结束时,对象数组的每个元素的析构函数并不会都被调用。
1-15若new一个对象数组,那么用delete释放时应该写[],否则只delete一个对象(调用一次析构函数)。
1-16当一个对象调用其成员函数时,编译器先将该对象的地址赋给 this 指针,然后调用成员函数,这样成员函数对对象的数据成员进行操作时,就隐含使用了 this 指针。
1-17静态成员用以解决同一个类的不同对象之间成员,包括数据成员和函数成员的共享问题。
1-18静态成员的特点是不管这个类创建了多少个对象,其静态成员在内存中只保留一份副本,这个副本为该类的所有对象共享,或者说静态成员为类所有。
1-21静态数据成员不能在类中初始化,使用时需要在类体外声明。
1-22静态成员变量的访问控制权限没有意义,静态成员变量均作为公有成员使用。
1-23对象数组的元素可以是不同类的对象。 F
1-24在生成对象数组时,将针对每个数组元素按其下标的排列顺序依次调用一次构造函数,调用的次数等于数组元素的个数。
1-25在定义对象数组时,可以直接进行初始化,也可以通过赋值语句实现赋值。
1-26如果只定义对象数组不进行初始化,此时调用的是有参构造函数。
1-27程序执行结束前,调用析构函数将数组中各个对象元素释放,释放顺序与创建对象的顺序相反。
1-28  point (*p)[3];point是类名,p为对象指针数组。
1-29  point *p[3];point是类名,p为定义指向对象数组的指针 。
1-30对静态数据成员初始化可以在类内进行。
1-31静态数据成员不属于某个对象,在给对象分配存储空间时,不包括静态数据成员所占的空间。
1-32静态成员函数属于类而不是类的对象,没有this指针,静态成员函数中不能使用this指针。
1-34由于静态成员函数不属于某个特定的对象,因此。不能像一般的成员函数那样随意的访问对象中的非静态数据成员。只能引用类中声明的静态数据成员。如果要引用非静态数据成员,可通过对象引用。
1-35常数据成员的值必须初始化,且不能改变。
1-36在类中声明常数据成员时,只能通过构造函数成员初始化列表的方式来实现。
1-37常成员函数既可以被常对象调用,也可以被非常对象调用。
1-39每个对象都有一个指向自身的指针,称为 this 指针,通过使用它来确定其自身的地址。
1-40当一个类对象的成员函数被调用时,该成员函数的 this指针指向调用它的对象。     2-1以下程序段,哪个是不正确的?
2-2下面对静态数据成员的描述中,正确的是()。
2-3对于常数据成员,下面描述正确的是(常数据成员必须被初始化,并且不能更新 )。
2-4在下面有关静态成员函数的描述中,正确的是()。 在静态成员函数中可以使用this指针
2-5下列选项中,静态成员函数不能直接访问的是()。 非静态数据成员
2-6对于常成员函数,下面描述正确的是() 常成员函数只能修改常对象的数据成员
2-7已知print()函数是一个类的常成员函数,它无返回值,下列表示中正确的是()。 void print(const);
2-9在 C++ 中,实现封装性需借助于 ▁▁▁▁▁。 函数
2-10下列关于this指针的叙述中,正确的是( ) 类非静态成员函数才有this指针
2-11构造函数可以重载,析构函数不能重载
2-12假定MyClass为一个类,则该类的复制构造函数的声明语句为() MyClass(MyClass *x)
2-13假定MyClass为一个类,则执行MyClass a,b(3),*p;语句时,自动调用该类构造函数()次。 3 D.4
2-14下面对静态数据成员的描述中,正确的是( ) B.类的每个对象都有自己的静态数据成员 C.

类的不同对象有不同的静态数据成员值

D.

静态数据成员不能通过类的对象调用

  答案正确:1 分
2-15 分数 1 作者 董卫萍 单位 绍兴文理学院元培学院

假设A 是一个类的名字,下面哪段程序不会调用A的复制构造函数?

A.

A a1,a2; a1 = a2;

B.

void func( A a) { cout << "good" << endl; }

C.

A func( ) { A tmp; return tmp; }

D.

A a1; A a2(a1);

  答案正确:1 分
2-16 分数 1 作者 黄淑伟 单位 沈阳师范大学

关于类的析构函数描述正确的是。

A.

析构函数可以有参数

B.

析构函数可以重载

C.

析构函数可以省略

D.

析构函数有返回值类型

  答案正确:1 分
2-17 分数 1 作者 黄淑伟 单位 沈阳师范大学

关于常成员的描述中,哪个是错误的?

A.

常成员是用关键字const说明的

B.

常成员有常数据成员和常成员函数两种

C.

常数据成员的初始化是在类体内定义它时进行的

D.

常数据成员的值是不可以改变的

  答案正确:1 分
2-18 分数 1 作者 黄淑伟 单位 沈阳师范大学

关于运算符delete的描述中,错误的是( ).

A.

使用该运算符可以释放用new运算符创建的对象或对象数组

B.

使用该运算符可以释放所有对象

C.

使用delete运算符时会自动调用析构函数

D.

用它释放对象数组时,它作用的指针名前要加运算符[ ]

  答案正确:1 分
2-19 分数 1 作者 黄淑伟 单位 沈阳师范大学

如果某函数的返回值是个对象 ,则该函数被调用时,返回的对象?

A.

是通过拷贝构造函数初始化的

B.

是通过无参数的构造函数初始化的

C.

用哪个构造函数初始化,取决于函数中return 语句是怎么写的

D.

不需要初始化

  答案正确:1 分
2-20 分数 1 作者 黄淑伟 单位 沈阳师范大学

以下说法正确的是?

A.

在静态成员函数中可以调用同类的其他任何成员函数

B.

const成员函数不能作用于非 const 对象

C.

在静态成员函数中不能使用 this 指针

D.

静态成员变量每个对象有各自的一份

  答案正确:1 分
2-21 分数 1 作者 黄淑伟 单位 沈阳师范大学

以下对类A的定义,哪个是正确的?

A.

class A{ private:int v; public:void fun(){} }

B.

class A{ int v; A * next; void fun(){} };

C.

class A{ int v; public: void fun(); }; A::void fun(){}

D.

class A{ int v; public: A next; void fun(){} };

  答案正确:1 分
2-22 分数 1 作者 黄淑伟 单位 沈阳师范大学

在类体内说明友元使用的关键字是?

A.

virtual

B.

friend

C.

inline

D.

static

  答案正确:1 分
2-23 分数 1 作者 黄淑伟 单位 沈阳师范大学

有如下类的定义:

class Sample
{
public:
    Sample( );
    Sample(int x );
    ......
};
 

动态申请对象存储单元,调用一个带参构造函数,初值为2的语句是()。

A.

Sample *a=new Sample(2);

B.

Sample a=new Sample(2);

C.

Sample *a=new Sample[2];

D.

Sample a=new Sample[2];

  答案错误:0 分
2-24 分数 1 作者 黄淑伟 单位 沈阳师范大学

有如下定义:

class Sample
{
public:
    Sample( );
    Sample(int x );
    ......
};
 

如果用new创建对象数组,该数组中包含10个对象,则正确的语句为()。

A.

Sample *a=new Sample[10];

B.

Sample *a=new Sample(10);

C.

Sample *a=new Sample[ ];

D.

Sample *a=new Sample;

  答案正确:1 分
2-25 分数 1 作者 何振峰 单位 福州大学

下列对重载函数的描述中,( )是错误的。

A.

重载函数中不允许使用默认参数

B.

重载函数中编译根据参数表进行选择

C.

不要使用重载函数来描述毫无相干的函数

D.

构造函数重载将会给初始化带来多种方式

  答案正确:1 分
2-26 分数 1 作者 余春艳 单位 浙江大学

在下面类声明中,关于生成对象不正确的是( )。
class point
{ public:
int x;
int y;
point(int a,int b) {x=a;y=b;}
};

A.

point p(10,2);

B.

point *p=new point(1,2);

C.

point *p=new point[2];

D.

point *p[2]={new point(1,2), new point(3,4)};

  答案正确:1 分
2-27 分数 1 作者 何振峰 单位 福州大学

设A为自定义类,现有普通函数int fun(A& x)。则在该函数被调用]时:

A.

将执行复制构造函数来初始化形参x

B.

仅在实参为常量时,才会执行复制构造函数以初始化形参x

C.

无需初始化形参x

D.

仅在该函数为A类的友元函数时,无需初始化形参x

  答案正确:1 分
2-28 分数 1 作者 何振峰 单位 福州大学

以下哪一个不是正确的成员访问属性。

A.

protected

B.

private

C.

hidden

D.

public

  答案正确:1 分
2-29 分数 1 作者 何振峰 单位 福州大学

所有类都应该有:

A.

构造函数

B.

析构函数

C.

构造函数和析构函数

D.

以上答案都不对

  答案正确:1 分
2-30 分数 1 作者 何振峰 单位 福州大学

对于以下关于友元的说法

A.

如果函数fun被声明为类A的友元函数,则该函数成为A的成员函数

B.

如果函数fun被声明为类A的友元函数,则该函数能访问A的保护成员,但不能访问私有成员

C.

如果函数fun被声明为类A的友元函数,则fun的形参类型不能是A。

D.

以上答案都不对

  答案正确:1 分
2-31 分数 1 作者 何振峰 单位 福州大学

对于类之间的友元关系:

A.

如果类A是类B的友元,则B的成员函数可以访问A的私有成员

B.

如果类A是类B的友元,则B也是A的友元。

C.

如果类A是类B的友元,并且类B是类C的友元,则类A也是类C的友元。

D.

以上答案都不对。

  答案正确:1 分
2-32 分数 1 作者 何振峰 单位 福州大学

给定以下类声明,哪个成员函数可能改变成员变量data?

class A {

public:

 void f1 (int d);
 void f2 (const int &d);
 void f3 (int d) const;
 

private:

   int data;
 

};

A.

f1

B.

f2

C.

f3

D.

f1和f2

  答案错误:0 分
2-33 分数 1 作者 张德慧 单位 西安邮电大学

在面向对象的软件系统中,不同类对象之间的通信的一种构造称为_______。

A.

属性

B.

封装

C.

D.

消息

  答案正确:1 分
2-34 分数 1 作者 张德慧 单位 西安邮电大学

在面向对象系统中,对象的属性是________。

A.

对象的行为特性

B.

和其他对象相关联的方式

C.

和其他对象相互区分的特性

D.

与其他对象交互的方式

  答案正确:1 分
2-35 分数 1 作者 陈晓梅 单位 广东外语外贸大学

假定AA为一个类,a()为该类公有的函数成员,x为该类的一个对象,则访问x对象中函数成员a()的格式为()

A.

x.a

B.

x.a()

C.

x->a()

D.

(*x).a()

  答案正确:1 分
2-36 分数 1 作者 李廷元 单位 中国民用航空飞行学院

某类中有一个无参且无返回值的常成员函数 Show,则正确的 Show 函数原型是

A.

const void Show();

B.

void const Show();

C.

void Show() const;

D.

void Show(const);

  答案正确:1 分
2-37 分数 1 作者 李廷元 单位 浙江大学

下面程序的输出结果是

 
#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass() {
        ++count;
    }
    ~MyClass() {
        --count;
    }
    static int getCount() {
        return count;
    }
private:
    static int count;
};
int MyClass::count = 0;
int main() {
    MyClass obj;
    cout << obj.getCount();
    MyClass obj2;
    cout << MyClass::getCount();
    cout << obj2.getCount();
    return 0;
}
  A.

121

B.

232

C.

221

D.

122

  答案正确:1 分
2-38 分数 1 作者 李廷元 单位 中国民用航空飞行学院

下面关于成员函数和常成员函数的程序,其主函数中错误的语句是

 
#include<iostream>
using namespace std;
class MyClass {
public:
    MyClass(int x): val(x) {}
    void Set(int x) {val = x;}
    void Print()const {cout << "val=" << val << '\t';}
private:
    int val;
};
int main() {
    const MyClass obj1(10);
    MyClass obj2(20);
    obj1.Print();    //语句 1
    obj2.Print();    //语句 2
    obj1.Set(20);  //语句 3
    obj2.Set(30);  //语句 4
    return 0;
}
  A.

语句 1

B.

语句 2

C.

语句 3

D.

语句 4

  答案正确:1 分
2-39 分数 1 作者 王秀 单位 福州大学

以下说法正确的是()。

A.

每个对象内部都有成员函数的实现代码

B.

一个类的私有成员函数内部不能访问本类的私有成员函数

C.

类的成员函数之间可以相互调用

D.

编写一个类时,至少要写一个成员函数

  答案正确:1 分
2-40 分数 1 作者 黄万丽 单位 曲阜师范大学

现有类的定义如下:

class MyClass {
public:
    MyClass(int x): val(x) {}
    void Print() const {cout << "const:val=" << val << '\t';}
    void Print() {cout << "val=" << val << '\t';}
private:
    int val;
};
 

在main函数中定义该类的l两个对象:const MyClass obj1(10); MyClass obj2(20);
依次执行obj1.Print(); obj2.Print();的输出结果是()。

A.

val=10 const:val=20

B.

const:val=10 const:val=20

C.

const:val=10 val=20

D.

val=10 val=20

  答案正确:1 分
2-41 分数 1 作者 陈晓梅 单位 广东外语外贸大学

关于成员函数特征的描述中,( )是错误的。

A.

成员函数可以重载

B.

成员函数一定是内联函数

C.

一个类可以没有成员函数

D.

成员函数可以设置参数的默认值

  答案正确:1 分
2-42 分数 1 作者 陈晓梅 单位 广东外语外贸大学

设类AA已定义,假设以下语句全部合法,哪些语句会触发调用拷贝构造函数( )。

AA a, b; //1
AA c(10, 20); //2
AA d(c); //3
AA e = d; //4
  A.

2

B.

3

C.

4

D.

3 和 4

  答案正确:1 分
2-43 分数 1 作者 范鹏程 单位 内蒙古师范大学

对类的构造函数和析构函数描述正确的是

A.

构造函数可以重载,析构函数不能重载

B.

构造函数不能重载,析构函数可以重载

C.

构造函数可以重载,析构函数也可以重载

D.

构造函数不能重载,析构函数也不能重载

  答案正确:1 分
2-44 分数 1 作者 范鹏程 单位 内蒙古师范大学

类的析构函数是在什么时候调用的?

A.

类创建时

B.

创建对象时

C.

删除对象时

D.

不自动调用

  答案正确:1 分
2-45 分数 1 作者 范鹏程 单位 内蒙古师范大学

下列关于构造函数说法不正确的是

A.

构造函数必须与类同名

B.

构造函数可以省略不写

C.

构造函数必须有返回值

D.

在构造函数中可以对类中的成员进行初始化

  答案正确:1 分
2-46 分数 1 作者 范鹏程 单位 内蒙古师范大学

C++函数的声明和定义可以分开。函数声明不需要( )。

A.

返回类型

B.

函数名

C.

参数表

D.

函数体

  答案正确:1 分
2-47 分数 1 作者 范鹏程 单位 内蒙古师范大学

不能作为函数重载判断依据的是( )

A.

返回类型

B.

const

C.

参数个数

D.

参数类型

  答案正确:1 分
2-48 分数 1 作者 范鹏程 单位 内蒙古师范大学

下面关于new运算符的描述中错误的是( )

A.

使用new创建对象时必须定义初始值

B.

使用new创建对象时会调用类的构造函数

C.

new可以用来动态创建对象和对象数组

D.

使用new创建的对象可以使用delete删除

  答案正确:1 分
2-49 分数 1 作者 范鹏程 单位 内蒙古师范大学

不属于类的成员函数的是( ) 。

A.

构造函数

B.

析构函数

C.

友元函数

D.

复制构造函数

  答案正确:1 分
2-50 分数 1 作者 范鹏程 单位 内蒙古师范大学

对于C++结构体中定义的成员,其隐含的访问权限为( )

A.

public

B.

protected

C.

private

D.

static

  答案正确:1 分
2-51 分数 1 作者 范鹏程 单位 内蒙古师范大学

为类提供对外接口的是( )

A.

公有成员函数

B.

私有成员函数

C.

保护成员函数

D.

友元函数

  答案正确:1 分
2-52 分数 1 作者 范鹏程 单位 内蒙古师范大学

若类A的构造函数定义为
A(int aa=1, int bb=0) { a = aa; b = bb; }
则执行:A x(4);后,x.a和x.b的值分别是( )

A.

1,0

B.

1,4

C.

4,0

D.

4,1

  答案正确:1 分
2-53 分数 1 作者 范鹏程 单位 内蒙古师范大学

已知类A中的一个成员函数说明为void fun(A &a);,则A &a的含义是( )

A.

将a的地址值赋给变量fun

B.

指向类A的指针为a

C.

a是类A的对象引用,用来做函数fun()的形参

D.

变量A与a按位相与运算后作为函数fun()的参数

  答案正确:1 分
2-54 分数 1 作者 董俊 单位 燕山大学

下列哪一种情况下,类的复制构造函数不会被调用

A.

用类的一个对象赋值给另一个对象时

B.

当用类的一个对象去初始化该类的另一个对象时

C.

如果函数的形参是类的对象,调动函数时,进行形参和实参结合时

D.

如果函数的返回值是类的对象,函数执行完成返回调用者时

  答案正确:1 分
2-55 分数 1 作者 黄淑伟 单位 沈阳师范大学

以下关于友元的说法哪个是不正确的?

A.

一个类的友元函数可以访问类对象的私有成员

B.

友元类关系是相互的,即若类A是类B 的友元,类B也是类A的友元

C.

在一个类中可以将另一个类的成员函数声明为友元

D.

类之间的友元关系不能传递

  答案正确:1 分
2-56 分数 1 作者 文冬 单位 燕山大学

下面对静态数据成员的描述中,正确的是

A.

静态数据成员可以在类体内进行初始化

B.

静态数据成员不可以被类的对象调用

C.

静态数据成员不能受private控制符的作用

D.

静态数据成员可以直接用类名调用



这篇关于(二)构造函数、析构函数、静态成员、友元的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程