初始化列表-Effective-c++-第十三项的疑问

问题描述

Effective-c++-第十三项的疑问
Effective C++中,条款13:是这样写的:初始化列表中成员列出的顺序和他们在类中声明的顺序相同。
而且给出了相关例子。比如如果在类中是这样声明的:

 class A{      ...        private:         int sum1;         int sum2; }

在构造函数中这样写

 A::A:sum2(sum1)sum1(10){...}

这样写就会有问题,sum2的值是错误的。
但是如果这样写

 A::A:sum2(10)sum1(10)

这样就不会有问题。这是为什么?在函数实现中同样是先对sum2进行了初始化,另个结果却不相同

解决方案

取决于依赖,因为没法保证sum1在sum2前初始化,这样就会导致undefined behavior

解决方案二:
应该是sum2(sum1)时,sum1尚未被初始化,结果未定吧

解决方案三:

  • 这个应该是pascal/cdecl的问题.也就是参数是从左到右进栈还是从右到左进栈的问题。
  • 微软默认好像都是cdecl的.你试试反过来写```

A::A:sum1(10)sum2(sum1){...}

解决方案四:
变量按照定义的顺序初始化,所以反过来就可能不正确。至于怎么不正确,不同的编译器不同,属于未定义行为。

解决方案五:
没有错

解决方案六:
按照顺序初始化,当执行 sum2(sum1) 在 sum1(10)之前,
初始化sum2时,sum1未被初始化,所以不行吧

解决方案七:
应该是sum2(sum1)时,sum1尚未被初始化,结果未定吧

时间: 2024-10-03 02:53:20

初始化列表-Effective-c++-第十三项的疑问的相关文章

为什么不能在子类的初始化列表里初始化父类的成员

前段时间写了一段代码,其等价形式如下: class A { protected: int n_; }; class B : public A { public: B() : n_(0) {} }; class A { protected :      int n_ ; } ; class B : public A { public :      B ( ) : n_ ( 0 )      { } } ; intellisense会在高亮行提示: "n_" is not a nonsta

c++ 构造函数的初始化列表

构造函数的初始化列表仅仅指定用于初始化成员的值,并不指定这些初始化执行的次序.成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推   首先,运行下图中的C++代码,输出是什么? 复制代码 代码如下: class A { private:  int n1;  int n2; public:  A(): n2(0) , n1(n2 + 2)  {  }  void Print()  {   cout<<"n1:"<<n1<<

C++对象模型(四):class成员初始化列表(Member Initialization List)

本文是Inside C++ Object Model Chapter 2 部分的读书笔记. 编译器如何处理初始化成员列表的. 下列情况中,必须要使用member initialization list进行data member 的初始化: 1) 当初始化一个reference member. 2) 当初始化一个const member. 3) 当调用一个base class 的constructor,而他拥有一组参数的时候. 4) 调用一个member class 的constructor ,而

mfc中可以设置列表视图中某一项的颜色吗?网上只有设置某一行颜色的办法,,请大神们指点一下??

问题描述 mfc中可以设置列表视图中某一项的颜色吗?网上只有设置某一行颜色的办法,,请大神们指点一下?? mfc中可以设置列表视图中某一项的颜色吗?网上只有设置某一行颜色的办法,,请大神们指点一下,比如我想使列表视图中0行1列的字符串显示为红色,能实现吗 解决方案 设置视图背景颜色

c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧?

问题描述 c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧? 如题:c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧? 解决方案 什么?复制构造函数? 解决方案二: C++类构造函数列表初始化C++类构造函数初始化列表c++中什么类型的成员变量只能在构造函数的初始化列表中进行 解决方案三: 真是初始化列表,跟复制构造函数没关系,调用复制构造函数要看你是如何初始化的 解决方案四: 参数列表初始化成员是调用成员的构造函数,但是什

listview-如何从自定义列表视图获得选中的项?

问题描述 如何从自定义列表视图获得选中的项? 程序中的自定义列表视图的每一行都包含许多TextViews,当我点击List Item时,OnListItemClick()没有被调用.如何获取一个自定义列表视图中选中的项? XML for Row: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/ap

继承-关于c++成员初始化列表

问题描述 关于c++成员初始化列表 假定manager类由person类公有继承而来 新增了一个int值成员a 定义manager类的复制构造函数时 manager::manager(const manager & m):person(m),a(m.a) { } 是不是不能a(m.a)这样用?我把"."打出来后显示没有可用成员 为什么呢? 解决方案 class A { public: int a; }; class B { public: B(int a) {} }; clas

C++初始化列表问题

C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错"[]"操作符语法错误   class ClassA{private ClassB arrayOfObjectClassB[2];public ClassA(int i):arrayObjectOfClassB[0](i),arrayObjectOfClassB[1](i)}arrayObjectOfClassB[0](i)这儿有问题   初始化列表中,只能初始化 单个变量 或 类的对象,不能初始化数组

Way on c &amp;amp; c++ 小记 [五] – 初始化列表与成员函参作用域

初始化列表与成员函参作用域 作者:Jason Lee @http://blog.csdn.net/jasonblog 日期:2010-04-11   [1]初始化列表 所谓初始化列表,从语法角度讲,就是构造函数圆括号后的冒号与左花括号之间的紧跟初始值的变量序列,如下是一个示例: Demo(): b(2), a(b){ 作为初始化列表,它以它的作用和初始化顺序而出名.   初始化列表有什么作用呢?我觉得可以一言以蔽之:初始化列表最重要的作用就是用来初始化不能被赋值的成员.比如引用必须在第一次出现的