类类型的const变量必须要定义构造函数吗


#include<iostream>
using namespace std;
class B
{
public:
  B()
  {
    b=2;
  }
  int b;
};
class A
{
public:
  A()
  {}
 int i;
  B a;
};
int main()
{
 
const A aa;
 //using A::B;
 cout<<sizeof(A)<<endl;
 // B b;
}

如果不定义A()
构造函数不行,这个不是编译器自动定义吗?

13 个解决方案

#1


把你所谓的不定义A()的代码贴一下, 恐怕你是声明了没实现吧.

#2


public:
//A()
//{}
int i;
B a;

这样应该也是没什么问题的。

public:
A();
int i;
B a;

这样不行。因为你自己声明了A()构造函数,原本默认的就不会生成了。

#3


在声明时就给它赋个值

#4


引用 1 楼 qq120848369 的回复:
把你所谓的不定义A()的代码贴一下, 恐怕你是声明了没实现吧.

我自己试了下,不定义A()确实不行

#5


引用 3 楼 defonds 的回复:
在声明时就给它赋个值

如果自己不定义一个构造函数,只能通过赋值了,关键是我的问题出现在那里?

#6


引用 楼主 wanghb1989 的回复:
#include<iostream>
using namespace std;
class B
{
public:
  B()
  {
    b=2;
  }
  int b;
};
class A
{
public:
  A()
  {}
 int i;
  B a;
};
int main()
{
 
const A aa;
 //using A::B;
 cout<<sizeof(A)<<endl;
 // B b;
}

如果不定义A()
构造函数不行,这个不是编译器自动定义吗?

什么编译器,使用gcc没有问题啊。

#7


引用 楼主 wanghb1989 的回复:
#include<iostream>
using namespace std;
class B
{
public:
  B()
  {
    b=2;
  }
  int b;
};
class A
{
public:
  A()
  {}
 int i;
  B a;
};
int main()
{
 
const A aa;
 //using A::B;
 cout<<sizeof(A)<<endl;
 // B b;
}

如果不定义A()
构造函数不行,这个不是编译器自动定义吗?

噢,看错了,你是说不定义A()的情况,确实不行,编译器不是一定自动合成缺省构造函数,是当有需要的时候才自动定义一个,这里需要这样定义const A aa(),要加个括号。不然编译器以为你不需要这个缺省的构造函数。

#8


引用 7 楼 jerry_dqh 的回复:
Quote: 引用 楼主 wanghb1989 的回复:

#include<iostream>
using namespace std;
class B
{
public:
  B()
  {
    b=2;
  }
  int b;
};
class A
{
public:
  A()
  {}
 int i;
  B a;
};
int main()
{
 
const A aa;
 //using A::B;
 cout<<sizeof(A)<<endl;
 // B b;
}

如果不定义A()
构造函数不行,这个不是编译器自动定义吗?

噢,看错了,你是说不定义A()的情况,确实不行,编译器不是一定自动合成缺省构造函数,是当有需要的时候才自动定义一个,这里需要这样定义const A aa(),要加个括号。不然编译器以为你不需要这个缺省的构造函数。

const A aa();是定义一个函数了,你可以用cout<<aa.i<<endl;测试一下

#9


引用 8 楼 wanghb1989 的回复:
Quote: 引用 7 楼 jerry_dqh 的回复:

Quote: 引用 楼主 wanghb1989 的回复:

#include<iostream>
using namespace std;
class B
{
public:
  B()
  {
    b=2;
  }
  int b;
};
class A
{
public:
  A()
  {}
 int i;
  B a;
};
int main()
{
 
const A aa;
 //using A::B;
 cout<<sizeof(A)<<endl;
 // B b;
}

如果不定义A()
构造函数不行,这个不是编译器自动定义吗?

噢,看错了,你是说不定义A()的情况,确实不行,编译器不是一定自动合成缺省构造函数,是当有需要的时候才自动定义一个,这里需要这样定义const A aa(),要加个括号。不然编译器以为你不需要这个缺省的构造函数。

const A aa();是定义一个函数了,你可以用cout<<aa.i<<endl;测试一下

确实是,只能显式提供一个了

#10


class B{

public :B():b(0){};
int b;
};

class A{
public :
int a;
B b;
};

int main()
{
const A oa ={10,B()};应该没有问题。
}
Ps :
只从编译器考虑。
类不过是个定义了,一些函数的结构罢了。

//含有私有成员,保护成员,继承关系,虚函数的,构造析构函数的,
//不能直接初始化,要调用构造函数初始化;比如 
//函数外部定义 
const A oa; 这里oa.a =0,内置类型的外部变量初始化为0
//在函数内部
int main(){
const A oa; //这里oa.a 没有定义,因为是内置类型的成员变量。

//用编译器自动生成,可能不干任何事情的,构造函数初始化。


}

//没有私有成员,保护成员,继承关系,虚函数的,构造析构函数的。
//可以直接初始化,因为他就像C的结构。


#11


主楼的编译错误是 c++ 标准要求的,by c++11 8.5/6
If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class type  with a user-provided default constructor.

所以 A 必须提供用户自定义的构造函数,即便该构造函数只具有默认合成的功能。

#12


C++03没这条款吗

#13


有,8.5/9 说的。
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告