类中声明的const变量与引用变量数据成员为什么可以不初始化?

时间:2022-09-09 15:11:47

class ConstRef
{
public:
ConstRef(int);
private:
int i;
const int ci;
int &ri;
};
中声明的ci,ri为什么可以不初始化?

12 个解决方案

#1


能初始化啊...
ConstRef(int ival,int cival,int rival):i(ival),ci(cival),ri(rival){}
是不能赋值啦...

#2


我觉得class是定义一个类型,初始化针对的应该是类型的变量而不是类型本身。你可以写一个构造函数,在定义该类型的变量时自动初始化。

#3


lz使用的一定是赋值语句而非初始化
初始化是在类的构造函数中使用初始化列表实现的!
而且类中包含引用成员几乎总是馊主意

#4


语法的问题,王八的屁股--规定。

#5


我的意思是说,我们平时声明一个const变量或引用的时候必须同时对它初始化,比如:
const int i=10;
int j;
int &k=j;
而在这个类中为什么没有给ci 一个具体的值,而ri也没有与一个具体的变量绑定在一起?

#6


它们都是对象的成员而不是类的成员,各对象的成员一般不同,它们一般在构造时生成自己独有的一份成员.
lz所说的那种初始化方式在C++中是不允许的,而且是完全没有意义的

#7


谢谢各位,突然感觉自己问的问题好傻.

#8


类的思想是定义一个抽象的概念,这个概念一旦有个具体的属性,它就变成对象了。所以类只是

提供一种准则和一种描述,具体的实现要在对象里面来体现。

所以才有了一些奇怪的用法,这是由C++语言本身就是一门面向对象的语言而决定的。这是设计

的思想问题,而不是死板的语言法律

#9


我的意思是说,我们平时声明一个const变量或引用的时候必须同时对它初始化,比如:
const int i=10;
int j;
int &k=j;
而在这个类中为什么没有给ci 一个具体的值,而ri也没有与一个具体的变量绑定在一起?
==============================================================================
因为还不到时候,当你实现一个这个的类的实例的时候就会初始化。const成员必须要在构造函数的初始化列表里直接初始化,不能在构造函数体里面复制初始化。

#10


在一个类里,const又部分地恢复到它在C语言中的含义,当声明一个类的实例时,它是要占用内存空间的.但是在类的定义中,又不能将其初始化,必须在声明它的实例时初始化.
    反过来讲,如果要是能在类的定义里初始化的话,那初始化为几呢?比如是10吧:
class myint{
    const int c=10;  // (1)
};
那么使用时:
myint mi=5;//这里想初始化为5,怎么办?是不是不可能了?所以(1)处初始化是不应该的,也是错误的.正确的方法应该是这样的:
class myint{
    const int c;
public:
    myint(int v):c(v){}//注意这里的初始化,必须在这个位置.
};

这样,在定义myint的变量时,就可以这样使用:
myint mi(5);//这时初始化成5是可以的了.
当然,要使用下面的语法,可能还需要重载一下=操作符才行吧:
myint mi=5;

当然,实在要初始化类里的常量,也是可以的,但是要在前面加个static,如下所示:
class myint{
    static const int cs=10;//(2)
};
当这样定义时,cs将永远不占用内存空间.这时,cs与不是类里的const就是相同的了.

#11


不好意思,刚才打错了一个地方,改了一下:


    在一个类里,const又部分地恢复到它在C语言中的含义,当声明一个类的实例时,它是要占用内存空间的.但是在类的定义中,又不能将其初始化,必须在声明它的实例时初始化.
    反过来讲,如果要是能在类的定义里初始化的话,那初始化为几呢?比如是10吧:
class myint{
    const int c=10;  // (1)
};
那么使用时:
myint mi=5;//这里想初始化为5,怎么办?是不是不可能了?所以(1)处初始化是不应该的,也是错误的.正确的方法应该是这样的:
class myint{
    const int c;
public:
    myint(int v):c(v){}//注意这里的初始化,必须在这个位置.
};

这样,在定义myint的变量时,就可以这样使用:
myint mi(5);//这时初始化成5是可以的了.
当然,要使用下面的语法,可能还需要重载一下=操作符才行吧:
const myint mi=5;///////////这里刚才错了,前面应该有const 

当然,实在要初始化类里的常量,也是可以的,但是要在前面加个static,如下所示:
class myint{
    static const int cs=10;//(2)
};
当这样定义时,cs将永远不占用内存空间.这时,cs与不是类里的const就是相同的了.

#12


在<<C++ primer>>第4版中P56页写到:

   定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分.当定义数据成员时,只能指定该数据成员的名字和类型.类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数的特殊成员函数控制初始化.

#1


能初始化啊...
ConstRef(int ival,int cival,int rival):i(ival),ci(cival),ri(rival){}
是不能赋值啦...

#2


我觉得class是定义一个类型,初始化针对的应该是类型的变量而不是类型本身。你可以写一个构造函数,在定义该类型的变量时自动初始化。

#3


lz使用的一定是赋值语句而非初始化
初始化是在类的构造函数中使用初始化列表实现的!
而且类中包含引用成员几乎总是馊主意

#4


语法的问题,王八的屁股--规定。

#5


我的意思是说,我们平时声明一个const变量或引用的时候必须同时对它初始化,比如:
const int i=10;
int j;
int &k=j;
而在这个类中为什么没有给ci 一个具体的值,而ri也没有与一个具体的变量绑定在一起?

#6


它们都是对象的成员而不是类的成员,各对象的成员一般不同,它们一般在构造时生成自己独有的一份成员.
lz所说的那种初始化方式在C++中是不允许的,而且是完全没有意义的

#7


谢谢各位,突然感觉自己问的问题好傻.

#8


类的思想是定义一个抽象的概念,这个概念一旦有个具体的属性,它就变成对象了。所以类只是

提供一种准则和一种描述,具体的实现要在对象里面来体现。

所以才有了一些奇怪的用法,这是由C++语言本身就是一门面向对象的语言而决定的。这是设计

的思想问题,而不是死板的语言法律

#9


我的意思是说,我们平时声明一个const变量或引用的时候必须同时对它初始化,比如:
const int i=10;
int j;
int &k=j;
而在这个类中为什么没有给ci 一个具体的值,而ri也没有与一个具体的变量绑定在一起?
==============================================================================
因为还不到时候,当你实现一个这个的类的实例的时候就会初始化。const成员必须要在构造函数的初始化列表里直接初始化,不能在构造函数体里面复制初始化。

#10


在一个类里,const又部分地恢复到它在C语言中的含义,当声明一个类的实例时,它是要占用内存空间的.但是在类的定义中,又不能将其初始化,必须在声明它的实例时初始化.
    反过来讲,如果要是能在类的定义里初始化的话,那初始化为几呢?比如是10吧:
class myint{
    const int c=10;  // (1)
};
那么使用时:
myint mi=5;//这里想初始化为5,怎么办?是不是不可能了?所以(1)处初始化是不应该的,也是错误的.正确的方法应该是这样的:
class myint{
    const int c;
public:
    myint(int v):c(v){}//注意这里的初始化,必须在这个位置.
};

这样,在定义myint的变量时,就可以这样使用:
myint mi(5);//这时初始化成5是可以的了.
当然,要使用下面的语法,可能还需要重载一下=操作符才行吧:
myint mi=5;

当然,实在要初始化类里的常量,也是可以的,但是要在前面加个static,如下所示:
class myint{
    static const int cs=10;//(2)
};
当这样定义时,cs将永远不占用内存空间.这时,cs与不是类里的const就是相同的了.

#11


不好意思,刚才打错了一个地方,改了一下:


    在一个类里,const又部分地恢复到它在C语言中的含义,当声明一个类的实例时,它是要占用内存空间的.但是在类的定义中,又不能将其初始化,必须在声明它的实例时初始化.
    反过来讲,如果要是能在类的定义里初始化的话,那初始化为几呢?比如是10吧:
class myint{
    const int c=10;  // (1)
};
那么使用时:
myint mi=5;//这里想初始化为5,怎么办?是不是不可能了?所以(1)处初始化是不应该的,也是错误的.正确的方法应该是这样的:
class myint{
    const int c;
public:
    myint(int v):c(v){}//注意这里的初始化,必须在这个位置.
};

这样,在定义myint的变量时,就可以这样使用:
myint mi(5);//这时初始化成5是可以的了.
当然,要使用下面的语法,可能还需要重载一下=操作符才行吧:
const myint mi=5;///////////这里刚才错了,前面应该有const 

当然,实在要初始化类里的常量,也是可以的,但是要在前面加个static,如下所示:
class myint{
    static const int cs=10;//(2)
};
当这样定义时,cs将永远不占用内存空间.这时,cs与不是类里的const就是相同的了.

#12


在<<C++ primer>>第4版中P56页写到:

   定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分.当定义数据成员时,只能指定该数据成员的名字和类型.类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数的特殊成员函数控制初始化.