
C++函数初始化列表问题
有这样一段代码#include<iostream>#include<string>usingnamespacestd;classbase{private:intm_i;i...
有这样一段代码
#include <iostream>
#include<string>
using namespace std;
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 main(int argc,char*argv[])
{
base obj(98);
cout<<obj.get_i()<<endl
<<obj.get_j()<<endl;
return 0;
}
虽然编译不出错,但是输出结果第一个值不能确定。如果我要是把第一个构造函数改为base(int i):m_j(i),m_i(i){}或是不让他用初始化列表,而是用函数体实现,
base(int i)
{
m_j = i;
m_i = m_j;
}
其结果都是正确的,但是我不知道结果虽然正确了,其实质的用法对不对,而且也不明白为什么用初始化列表实现不了对m_i的初始化。请帮忙解释下,谢谢。 展开
#include <iostream>
#include<string>
using namespace std;
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 main(int argc,char*argv[])
{
base obj(98);
cout<<obj.get_i()<<endl
<<obj.get_j()<<endl;
return 0;
}
虽然编译不出错,但是输出结果第一个值不能确定。如果我要是把第一个构造函数改为base(int i):m_j(i),m_i(i){}或是不让他用初始化列表,而是用函数体实现,
base(int i)
{
m_j = i;
m_i = m_j;
}
其结果都是正确的,但是我不知道结果虽然正确了,其实质的用法对不对,而且也不明白为什么用初始化列表实现不了对m_i的初始化。请帮忙解释下,谢谢。 展开
3个回答
展开全部
在一个对象初始化的时候,是这样初始化的:
1,先调用基类构造函数,按基类的声明顺序
2,调用各成员对象的构造函数,按在类中定义成员对象的顺序来调用
3,调用派生类的构造函数,初始化的顺序也是按定义的顺序来进行(这个顺序是不变的,不管初始化列表中的声明顺序如何)
你这里没有基类和成员对象,因此第一和第二步不用管它,你只需要看第三步,因为你在类中是先定义int m_i,再定义int m_j的,因此先初始化m_i,在初始化m_j,
根据你的构造函数base(int i):m_j(i),m_i(m_j){}
先把m_j(还没初始化之前是系统给的一个随机值)的值给m_i,再把i的值给m_j,因此输出的是m_i是乱码,m_j的值是i的值
你只要改成
base(int i):m_j(m_i),m_i(i){}
就可以得到你要的结果了~
呵呵~都是自己的理解,有什么不明白找我Q277369986~~~~~~
1,先调用基类构造函数,按基类的声明顺序
2,调用各成员对象的构造函数,按在类中定义成员对象的顺序来调用
3,调用派生类的构造函数,初始化的顺序也是按定义的顺序来进行(这个顺序是不变的,不管初始化列表中的声明顺序如何)
你这里没有基类和成员对象,因此第一和第二步不用管它,你只需要看第三步,因为你在类中是先定义int m_i,再定义int m_j的,因此先初始化m_i,在初始化m_j,
根据你的构造函数base(int i):m_j(i),m_i(m_j){}
先把m_j(还没初始化之前是系统给的一个随机值)的值给m_i,再把i的值给m_j,因此输出的是m_i是乱码,m_j的值是i的值
你只要改成
base(int i):m_j(m_i),m_i(i){}
就可以得到你要的结果了~
呵呵~都是自己的理解,有什么不明白找我Q277369986~~~~~~

2023-12-06 广告
UIkit是一套轻量级、模块化且易于使用的开源UI组件库,由YOOtheme团队开发。它提供了丰富的界面元素,包括按钮、表单、表格、对话框、滑块、下拉菜单、选项卡等等,适用于各种类型的网站和应用程序。UIkit还支持响应式设计,可以根据不同...
点击进入详情页
本回答由网易云信提供
展开全部
因为C++初始化列表是按成员变量声明顺序来的,你先声明的是m_i,所以先初始化它,但它是用m_j初始化的,而m_j没有初始化,所以错误。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
构造函数的调用顺序:
调用基类的构造函数,调用顺序按照他们被继承时声明的基类名的顺序
调用内嵌对象的构造函数,调用顺序按各个对象在派生类内声明的顺序
执行派生类构造函数体中的内容
另外,我不知道使用这句话的目的
A *lpKpmsBase = dynamic_cast<A*>(Parent);
lpKpmsBase和Parent不都是class A的对象吗?为什么需要强制转换?
A中并没有虚函数,这样转换编译器会报错的吧
还有这个
A(A *Parent, bool Mem = false) :B(Parent, Mem)
{};
class B的构造函数中有其子类A的对象Parent。
调用基类的构造函数,调用顺序按照他们被继承时声明的基类名的顺序
调用内嵌对象的构造函数,调用顺序按各个对象在派生类内声明的顺序
执行派生类构造函数体中的内容
另外,我不知道使用这句话的目的
A *lpKpmsBase = dynamic_cast<A*>(Parent);
lpKpmsBase和Parent不都是class A的对象吗?为什么需要强制转换?
A中并没有虚函数,这样转换编译器会报错的吧
还有这个
A(A *Parent, bool Mem = false) :B(Parent, Mem)
{};
class B的构造函数中有其子类A的对象Parent。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询