题:请问下面程序打印出的结果是什么?【中国某著名杀毒软件企业J公司2008年4月面试题】
// P107_example3.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
class base
{
private:
int m_i;
int m_j;
public:
base(int i): m_j(i), m_i(m_j){}
base(): m_j(0), m_i(m_j){}
int get_i(){return m_i;}
int get_j(){return m_j;}
};
int _tmain(int argc, _TCHAR* argv[])
{
base obj(98);
std::cout<<obj.get_i()<<std::endl<<obj.get_j()<<std::endl;
return 0;
}
解析:本题想要得到的结果是“98,98”。但是成员变量的声明是先m_i,然后是m_j; 初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的,因此m_i会被赋予一个随机值。更改一下成员变量的声明顺序可以得到预想的结果。如果要得到“98,98”的输出结果,程序需要修改如下:
// P107_example3.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <string> class base { private:
//修改成员变量声明顺序 int m_i;public: base(int i): m_j(i), m_i(m_j){} base(): m_j(0), m_i(m_j){} int get_i(){return m_i;} int get_j(){return m_j;}};int _tmain(int argc, _TCHAR* argv[]){ base obj(98); std::cout<<obj.get_i()<<std::endl<<obj.get_j()<<std::endl; return 0;} 答案:输出结果第一个为随机数,第二个为98。int m_j;