c++中初始化列表的初始化变量顺序问题

例题来看:请问下面程序打印出的结果是什么?

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 class base
 7 {
 8 private:
 9    int m_i;
10    int m_j;
11 public:
12    base(int i):m_j(i),m_i(m_j);
13    base():m_j(0),m_i(m_j){}
14    int get_i() {return m_i;}
15    int get_j() {return m_j;}
16 };
17 int main(int argc,char* argv[])
18 {
19     base obj(98);
20     cout<<obj.get_i()<<endl;
21     cout<<obj.get_j()<<endl;
22     return 0;
23 }

如果你回答“98,98”,说明你对c++根本不是精通,熟悉都谈不上。因为这个类的成员变量的声明顺序为:先 m_i,再是 m_j,而初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的,也就是先给m_i赋值,再给m_j赋值;并不是列表中的顺序。因此m_i会被赋予一个随机值。此程序实际输出为——一个随机数和98。

原文地址:https://www.cnblogs.com/dukedu/p/9420522.html

时间: 2024-08-03 09:31:46

c++中初始化列表的初始化变量顺序问题的相关文章

为什么 没有缺省构造函数的类类型成员 必需要在初始化列表 里初始化 ?

名词解释 1.缺省构造函数:类的构造函数无参或参数默认值统称为缺省构造函数. 2.初始化列表:与其它函数不同,构造函数除了有名字,参数列表和函数体外还可以有初始化列表.列表以冒号开始后跟以逗号隔开的初始化字段.类成员是在构造函数的初始化列表创建好的,在创建类成员的同时,给成员变量一个初始化值. 在解释原因之前,需要了解构造函数是如何执行的 构造函数的执行过程 首先,构造函数的执行分为三步.先创建函数的形参(如果没有形参这步可以省略),然后执行初始化列表(即使没有初试化列表),最后执行函数体的内容

初始化列表来初始化

有一个类B继承子类,他们数据成员如下: class A{ ... private:   const int a; }; class B : public A{ ... private:   int a; public:   const int b;   A c;   static const char* d;   A& e; }; 则这些成员变量一定要通过A或者B的构造函数初始化列表来初始化的是( ) 解析:常量必须在初始化列表中初始化,否则,由于常量无法修改,在其他任何地方做为左值出现都将报错

构造函数、初始化列表来初始化字段、析构函数、拷贝构造函数

#include <iostream> using namespace std; class Line { public: int getLength( void ); Line( int len ); // 简单的构造函数 Line( const Line &obj); // 拷贝构造函数 ~Line(); // 析构函数 private: int *ptr; }; // 成员函数定义,包括构造函数 Line::Line(int len) { cout << "

【转】构造函数中,成员变量一定要通过初始化列表来初始化的几种情况

1.类成员为const类型 2.类成员为引用类型 #include <iostream> using namespace std; class A { public: A(int &v) : i(v), p(v), j(v) {} void print_val() { cout << "hello:" << i << " " << j << endl; } private: const

构造函数,哪些成员变量一定要通过初始化列表来初始化?

class A { ... private: int &a; }; class B : public A { ... private: int a; public: const int b; A c; static const char* d; A* e; }; 答案是  b  c 构造函数初始化时必须采用初始化列表一共有三种情况, 1.需要初始化的数据成员是对象(继承时调用基类构造函数)    这一点c符合 2.需要初始化const修饰的类成员                         

只能在初始化列表中初始化的变量

1.const变量 有几个容易混淆的地方: (1)const 的变量只能通过构造函数的初始化列表进行初始化:(貌似在c++11中可以正常编译) (2)static 的变量只能通过在类外重新定义进行初始化: (3)static const 变量 只能通过在类中直接用”=”进行赋值. 2.引用 引用只能初始化,不能赋值 3.不含默认构造函数的类的对象 因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化. 构造函数的函数体内只能做赋值而不是初始化,因此初始化const对

c++中初始化列表简单记录

首先 放另外一个博主的链接:http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 在学习c++构造函数的过程中遇到了初始化列表这个词,便主动搜索资料,学习初始化列表这个概念 一.初始化列表的由来 在构造函数中,除了 函数名,函数体外,可以有初始化列表,也可以没有初始化列表,初始化列表不是必须的. struct  Test { public: Test(string   n, int b): name(n), id(b){}

【C++】类的特殊成员变量+初始化列表

参考资料: 1.黄邦勇帅 2.http://blog.163.com/sunshine_linting/blog/static/448933232011810101848652/ 3.http://www.cnblogs.com/zhoug2020/archive/2012/08/31/2665451.html 一.初始化列表 1.假如定义了类 www 则 www::www (int i, int j, int k):x (i), y(j), z(k){},定义了一个带 i,j,k 三个参数的构

C++类成员初始化列表的构造顺序

看下面代码, 输出结果是多少呢? class A{ public: A(int k) : j(k), i(j) { } void show() { cout << this->i << endl; cout << this->j << endl; } private: int i; int j; }; void test() { A a(3); a.show(); } int main(int argc, char const *argv[])