博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++初始化列表
阅读量:4177 次
发布时间:2019-05-26

本文共 1718 字,大约阅读时间需要 5 分钟。

C++初始化列表

  • 定义
  • 想到这个的起因
  • 意外之喜

定义

与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。 [百度百科 ]

想到这个的起因

f0211.cpp 引用的初始化:

#include 
using namespace std;class A{ int i; int &ri; int &rii;public: A(int ii): i(ii), ri(i), rii(ii) { cout << "in constructor\n" << "i = " << i << " ri = " << ri << " rii = " << rii << endl; } void print() { cout << "i = " << i << " ri = " << ri << " rii = " << rii << endl; }};void main(){ A a(2); a.print();}程序的输出结果:in constructori = 2 ri = 2 rii = 2i = 2 ri = 2 rii = 4199850t

解释:rii通过初始化列表初始化为ii,由于ii是构造函数的形参,随着构造函数的运行结束而消失,因此后面的rii将是不确定的结果。

自己有些不理解,为什么i在后面是确定的结果呢?所以就把它们的地址也进行了输出。

#include 
using namespace std;class A{ int i; int &ri; int &rii;public: A(int ii): i(ii), ri(i), rii(ii) { cout << "in constructor\n" << "i = " << i << " ri = " << ri << " rii = " << rii << endl; cout << "&ii = " << &ii << endl; cout << "&i = " << &i << " &ri = " << &ri << " &rii = " << &rii << endl; } void print() { cout << "i = " << i << " ri = " << ri << " rii = " << rii << endl; }};void main(){ A a(2); a.print();}运行结果:in constructori = 2 ri = 2 rii = 2&ii = 0019FEE4&i = 0019FF34 &ri = 0019FF34 &rii = 0019FEE4i = 2 ri = 2 rii = 4199882

可以看到,ii和rii的地址、i和ri的地址竟是相同的。这就让我很惊讶,打算百度看看有没有这方面的点。

结果,这方面的没找着,却收获了另一个点。

##意外之喜

#include 
using namespace std;class foo1{ int i; int j;public: foo1(int x): i(x), j(i) { cout << "i = " << i << " j = " << j << endl; }};class foo2{ int i; int j;public: foo2(int x): j(x), i(j) { cout << "i = " << i << " j = " << j << endl; }};int main(){ foo1 a(1); foo2 b(2); return 0;}运行结果:i = 1 j = 1i = -858993460 j = 2

喏,i的值很不可思议。

解释:

成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的。

所以,一个好的习惯是,按照成员定义的顺序进行初始化。

转载地址:http://nptai.baihongyu.com/

你可能感兴趣的文章
Hibernate中的数据的获取策略(fetching)
查看>>
Hibernate中通过HQL/JPQL查询的方式实现动态数据获取
查看>>
Hibernate中通过FetchProfile的方式实现动态数据获取
查看>>
Hibernate中通过JPA entity graph的方式实现动态数据获取
查看>>
Hibernate中的数据获取方式及时机(fetching)
查看>>
Hibernate的二级缓存概述
查看>>
Hibernate二级缓存的全局配置
查看>>
Hibernate应用中通过JPA配置Entity缓存
查看>>
Hibernate中配置二级缓存的并发策略
查看>>
Hibernate的Entity cache(实体缓存)
查看>>
Hibernate中的Query cache(查询缓存)
查看>>
Hibernate的interceptors与events
查看>>
TestNG概述
查看>>
TestNG中测试方法的依赖关系详解
查看>>
TestNG中的运行时测试实例工厂详解
查看>>
TestNG测试的并发执行详解
查看>>
TestNG的监听器概述
查看>>
TestNG的IAnnotationTransformer监听器详解
查看>>
TestNG的IMethodInterceptor监听器详解
查看>>
TestNG的IHookable监听器详解
查看>>