您的位置 首页 > 数码极客

c如何格式化创建对象根据格式化创建新样式在哪…

一、前言

本部分为C++语言刷题系列中的第7节,主要讲解这几知识点:创建对象的过程、构造函数的初始化列表、成员变量的初始化顺序。欢迎大家提出意见、指出错误或提供更好的题目!

二、知识点讲解

知识点1:对象的创建与释放过程

C++对象的创建过程按如下三步进行:

· 第一阶段:按类的需求而分配相应的大小内存块

· 第二阶段:按类声明中定义成员变量的顺序,逐步初始化各成员变量

· 第三阶段:调用类的相应构造函数

重要结论:先执行成员对象的构造函数,后执行自己的构造函数!

C++对象的释放过程是与创建过程相反的三步:

· 第一阶段:调用类的相应构造函数

· 第二阶段:按类声明中定义成员变量的相反顺序,逐步释放各成员变量

· 第三阶段:释放对象的内存空间

重要结论:先执行自己的析构函数,后执行成员对象的析构函数!

知识点2:构造函数的初始化列表

由对象的创建过程可知,成员变量的初始化过程早于构造函数的调用。为此,C++语言采用构造函数的初始化列表将初始值传递给成员变量,以便在第二阶段中就利用这些初始值来初始化成员变量,从而提高运行的性能(更深的理解可看后续的文章)。

其格式如下:构造函数名(形参列表) :构造函数的初始化表

class Wheel

{

public:

Wheel(string s):name(s) { }

private:

string name;

};

需要注意:const和引用数据成员也必须是在构造函数的初始化表中被初始化,否则就会产生编译时刻错误。

知识点3:多个成员变量的初始化顺序

当类有多个成员变量时,则这些成员变量初始化的顺序取决于其在类中的声明顺序,而与其成构造函数的初始化列表中的顺序无关。

三、试题解析

1.下列关于类的成员对象的叙述中,错误的是( )。

A.类的成员可以是其他类的对象

B.类的成员对象是在构造函数的初始化列表中初始化的

C.成员对象的初始化顺序取决于在类中声明的顺序

D.如果成员初始化列表中未对成员对象进行显示初始化将产生编译错误

答案:D

解析:当一个类的成员是另一个类对对象时,这个对象就叫成员对象,选项A正确。成员对象的初始化尽量在构造函数初始化列表中进行,有利于提升性能,选项B正确。初始化列表的初始化变量顺序是与成员变量在类中的声明顺序一致,选项C正确。如果构造函数的初始化列表中未对成员对象进行显式初始化,则会调用成员对象的默认构造函,选项D错。

2.下列关于成员对象构造函数调用顺序的叙述中,正确的是()

A. 与成员对象在类中声明的顺序相同

B. 与成员对象的析构函数的调用顺序相同

C. 与成员对象在构造函数初始化列表中的顺序相同

D. 与成员对象在构造函数体中被调用的顺序相同

正确答案:A

解析:本题考查的是类的成员初始化的次序。构造函数初始化列表仅指定用于初始化成员的值,并不决定这些初始化执行的次序,成员对象被初始化的次序与类在声明这些成员的次序相同。答案为A。

3. 有如下类定义:

class Box

{

public:

Box(int h,int w,int l):width(w),length(l),height(h) { }

private:

int length,width,height;

};

Box 类中3个数据成员的初始化顺序为( )。

A. length,height,width

B. length,width,height

C. height,width,lenth

D. width,length,height

正确答案:B

解析:C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在构造函数初始化列表中的顺序,所以B选项正确。

4. 有如下程序:

#include<iostream>

#include<string>

using namespace std;

class Wheel

{

public:

Wheel(string s):name(s) { cout<<name; }

~Wheel() {cout<<"E";}

private:

string name;

};

class Monocycle

{

public:

Monocycle(string br,string w):brand(br),one(w) { cout<<brand; }

~Monocycle() { cout<<'D'; }

private:

string brand;

Wheel one;

};

void main()

{

Monocycle *bike=new Monocycle("G","W");

delete bike;

}

运行时的输出结果是()。

A. GWED

B. WGED

C. WGDE

D. GWWE

正确答案:C

解析:创建对象时,先初始化成员对象,后执行构造函数;释放对象时,先执行析构函数,后释放成员对象。因此,构造函数与析构函数的执行顺序为:Wheel()-->Monocycle()-->~Monocycle()-->~Wheel(),正确结果为WGDE,选项C正确。

四、试题测试

1.设类A将其它类对象作为成员,则建立A类对象时,下列描述正确的是( )。

A.A类构造函数先执行

B.成员构造函数先执行

C.两者并行执行

D.不能确定

2.对象成员的构造函数调用顺序取决于( )。

A.对象成员在初始化列表中给出的顺序

B.对象成员在类中声明的顺序

C.对象成员与在初始化列表中顺序和类中声明顺序均有关

D.随机顺序

------------------------------

欢迎大家提出意见、指出错误或提供更好的题目,只有大家的共同努力,才能帮助更多人掌握C++的基本概念,顺利通过考试!

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“c如何格式化创建对象,根据格式化创建新样式在哪,ps如何格式化智能对象,格式化智能对象,高级格式化的操作对象”边界阅读