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

wanghb1989 2013-10-01 01:55:36
#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()
构造函数不行,这个不是编译器自动定义吗?
...全文
243 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2013-10-02
  • 打赏
  • 举报
回复
有,8.5/9 说的。
iamnobody 2013-10-01
  • 打赏
  • 举报
回复
C++03没这条款吗
ri_aje 2013-10-01
  • 打赏
  • 举报
回复
主楼的编译错误是 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 必须提供用户自定义的构造函数,即便该构造函数只具有默认合成的功能。
lm_whales 2013-10-01
  • 打赏
  • 举报
回复
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的结构。
碼上道 2013-10-01
  • 打赏
  • 举报
回复
引用 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(),要加个括号。不然编译器以为你不需要这个缺省的构造函数。[/quote] const A aa();是定义一个函数了,你可以用cout<<aa.i<<endl;测试一下[/quote] 确实是,只能显式提供一个了
wanghb1989 2013-10-01
  • 打赏
  • 举报
回复
引用 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(),要加个括号。不然编译器以为你不需要这个缺省的构造函数。[/quote] const A aa();是定义一个函数了,你可以用cout<<aa.i<<endl;测试一下
碼上道 2013-10-01
  • 打赏
  • 举报
回复
引用 楼主 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(),要加个括号。不然编译器以为你不需要这个缺省的构造函数。
碼上道 2013-10-01
  • 打赏
  • 举报
回复
引用 楼主 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没有问题啊。
wanghb1989 2013-10-01
  • 打赏
  • 举报
回复
引用 3 楼 defonds 的回复:
在声明时就给它赋个值
如果自己不定义一个构造函数,只能通过赋值了,关键是我的问题出现在那里?
wanghb1989 2013-10-01
  • 打赏
  • 举报
回复
引用 1 楼 qq120848369 的回复:
把你所谓的不定义A()的代码贴一下, 恐怕你是声明了没实现吧.
我自己试了下,不定义A()确实不行
Defonds 2013-10-01
  • 打赏
  • 举报
回复
在声明时就给它赋个值
Binzo 2013-10-01
  • 打赏
  • 举报
回复
public:
	//A()
	//{}
	int i;
	B a;
这样应该也是没什么问题的。
public:
	A();
	int i;
	B a;
这样不行。因为你自己声明了A()构造函数,原本默认的就不会生成了。
qq120848369 2013-10-01
  • 打赏
  • 举报
回复
把你所谓的不定义A()的代码贴一下, 恐怕你是声明了没实现吧.

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧