有关常数据成员,该怎么处理
有关常数据成员
源程序如下:
#include <iostream>
using namespace std;
class A
{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static const int b;
};
const int A::b=10;
A::A(int i):a(i),r(a)
{}
void A::print(){ cout < <a < < ": " < <b < < ": " < <r < <endl;}
int main()
{ A a1(100),a2(0);
a1.print();
a2.print();
}
问:我把“A::A(int i):a(i),r(a){}”中的“r(a)”换成“r(i)”为什么得到的结果不一样啊?
------解决方案--------------------
你的声明顺序如下:
const int &r;
const int a;
static const int b;
在用初始化列表进行初始化时,先初始化r,再是a,接着再是b,静态成员在编译时值已知。
这个初始化顺序是既定的,不会因为你在初始化列表中的顺序而改变。一般而言,为避免常量成员的初始化失败,尽量用constructor中的形参去初始化,而不要用已赋值的成员去初始化未初始化的常量成员。这也就是为什么值会不同的原因。
另外一点,我不明白你的用意是什么,通常情况下,const int &r 是只能读,任何修改都是不允许的,除非用const_cast < typename > ,但是通常用这种转换则说明程序设计不合理,若要用常量,只要const int a = 10;就行了,没必要const int &r = a .
------解决方案--------------------
你声明的顺序如下
const int &r;
const int a;
则r和a的初始化顺序是由你的声明顺序决定的,而不是由初始化列表的顺序(A::A(int i):a(i),r(a))决定的.
所以是先初始化r的,r是引用,在这个里面初始化为a的引用,也就是r和a是一个东西,r是a的别名,所以a(i)把a初始化为i,则r的值也为i.
而第二个方式A::A(int i):a(i),r(i)
这个时候i是一个局部变量,出了这个函数以后i就没有意义了,把r初始化为一个局部变量的引用是不对的,这也就和大家所的 "不要返回局部对象的引用或者不要返回局部对象的指针 "一样,所以会出现两种方式不一样的结果.
个人意见,仅供参考
源程序如下:
#include <iostream>
using namespace std;
class A
{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static const int b;
};
const int A::b=10;
A::A(int i):a(i),r(a)
{}
void A::print(){ cout < <a < < ": " < <b < < ": " < <r < <endl;}
int main()
{ A a1(100),a2(0);
a1.print();
a2.print();
}
问:我把“A::A(int i):a(i),r(a){}”中的“r(a)”换成“r(i)”为什么得到的结果不一样啊?
------解决方案--------------------
你的声明顺序如下:
const int &r;
const int a;
static const int b;
在用初始化列表进行初始化时,先初始化r,再是a,接着再是b,静态成员在编译时值已知。
这个初始化顺序是既定的,不会因为你在初始化列表中的顺序而改变。一般而言,为避免常量成员的初始化失败,尽量用constructor中的形参去初始化,而不要用已赋值的成员去初始化未初始化的常量成员。这也就是为什么值会不同的原因。
另外一点,我不明白你的用意是什么,通常情况下,const int &r 是只能读,任何修改都是不允许的,除非用const_cast < typename > ,但是通常用这种转换则说明程序设计不合理,若要用常量,只要const int a = 10;就行了,没必要const int &r = a .
------解决方案--------------------
你声明的顺序如下
const int &r;
const int a;
则r和a的初始化顺序是由你的声明顺序决定的,而不是由初始化列表的顺序(A::A(int i):a(i),r(a))决定的.
所以是先初始化r的,r是引用,在这个里面初始化为a的引用,也就是r和a是一个东西,r是a的别名,所以a(i)把a初始化为i,则r的值也为i.
而第二个方式A::A(int i):a(i),r(i)
这个时候i是一个局部变量,出了这个函数以后i就没有意义了,把r初始化为一个局部变量的引用是不对的,这也就和大家所的 "不要返回局部对象的引用或者不要返回局部对象的指针 "一样,所以会出现两种方式不一样的结果.
个人意见,仅供参考