服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 关于C++类的成员初始化列表的相关问题

关于C++类的成员初始化列表的相关问题

2021-04-02 16:19C++教程网 C/C++

下面小编就为大家带来一篇关于C++类的成员初始化列表的相关问题。小编觉得挺

在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member initialization list):

1,初始化一个引用成员(reference member);

2,初始化一个常量对象(const member);

3,调用一个基的构造函数,且该基类的构造函数有一组参数;

4,调用一个成员类(member class)的构造函数,且该构造函数有一组参数

这四种情况程序可以正常编译,但是效率有所欠缺(下面会具体说到)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Word{
 
String _name;
 
int _cnt;
 
public:
 
Word() {
 
_name = 0;
 
_cnt = 0;
 
 
};

上面这个程序的实现机制是:Word类的构造函数会先生成一个String类的临时对象(注意,_name是String类的对象),然后对该临时对象初始化。

然后通过赋值运算符将临时对象赋给_name,最后析构该临时对象。

以下是构造函数的内部扩张结果,c++伪代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Word::Word()
 
{
 
_name.String::String();  //调用String类的默认构造函数(default constructor)
 
String temp = String(0); //产生类的临时对象 并初始化
 
_name.String::operator = (temp); //通过赋值运算符将临时对象的值(深)拷贝给 _name
 
temp.String::~String();   //调用String的析构函数
 
_cnt = 0;
 
}

以上的代码效率并不高,因为中间需要调用默认构造函数和析构函数生成和销毁一个临时对象,以下是一个更有效率的实现方法:

?
1
2
3
4
5
6
7
Word::Word : _name (0)  //_name直接调用String类的构造函数对其赋值
 
{
 
_cnt = 0;
 
}

它会被构造函数扩张成以下的形式(c++伪代码)

?
1
2
3
4
5
6
7
8
9
Word::Word()
 
{
 
_name.Sting::String(0);  //调用String (int) 构造函数
 
_cnt = 0;
 
}

成员初始化列表并不是一组函数调用,编译器一一操作初始化列表,以适当的顺序在构造函数中插入初始化的操作,并且是在程序员显式的写入代码之前进行。

列表的中的项目次序是由类中的成员声明次序决定的,不是由初始化列表中的排列顺序决定。“初始化次序”和“初始化列表中的项目排列顺序”的错乱会带来意想不到的错误:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class X {
 
  int i;
 
  int j;
 
public:
 
  X (int value) : j (value), i (j)
 
 {}....
 
};

以上代码编写者的本意是要把j的初值设置为 value, 再把 i 的初值设置为 j 。然而,由于声明次序 i 在 j 之前,初始化列表中 i(j) 实际上比 j(value)更早执行,

这就带来了意想不到的错误。正确的写法应该是:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
 class X {
 
  int i;
 
  int j;
 
public:
 
  X (int value) : j (value)    // j (value) 此处调用构造函数赋初值
 
{ i = j; }
 
};

虽然这种写法仍然是 i 声明在 j 之前,但是并不会发生错误,因为初始化列表中的项目被插入到构造函数中不会再保持原来的声明次序,也就是说初始化列表被插入到构造函数中初始化列表中的项目顺序优先级高于代码编写者显式声明的顺序。

以上这篇关于C++类的成员初始化列表的相关问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

延伸 · 阅读

精彩推荐
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12