C++规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数--这句话对还是错?

lin_style 2006-12-14 02:32:22
C++规定,如果一个类没有提供任何的构造函数,则C++提供一个默认的构造函数(由C++编译器提供)”,这句话也是错误的,正确的是:
如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:
1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。
...全文
1432 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xvbn_2003 2006-12-18
  • 打赏
  • 举报
回复
领教了 高 学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!学习!
beautiful_good 2006-12-17
  • 打赏
  • 举报
回复
class Parent
{
protected:

int t;
};


class Child : public Parent
{
public:

void Hello(void)
{
cout << "Hello, world" << endl;
}

// 没有产生默认的构造函数及析构函数
};
----------------------------
Child cd;
如果没有构造函数我怎么创建对象啊?搞的有点晕了
zenny_chen 2006-12-17
  • 打赏
  • 举报
回复
To Upper:

编译器默认生成的构造函数莫名其妙地去初始化所有成员,那运行时开销岂不是很大?

如果真需要初始化成员也应该由用户显式地去定义构造函数。
a_b_c_abc2 2006-12-17
  • 打赏
  • 举报
回复
编译器会提供的情況,可以不必深究,因为编译器提供构造函数时,一定是正确的.
要注意的是简单成员不会象java那样初始化. C++要向java学习,由编译器生成的构造函数连成员都会给你默认初始化.

就算一个类中包含了许多其他类对象,如果你不提供构造函数而由编译器生成,也意味着所有成员对象的类都有无参构造函数,编译器会生成调用.

zenny_chen 2006-12-16
  • 打赏
  • 举报
回复
如果随便什么类都要生成构造函数的话那开销岂不是很大?
scofic 2006-12-16
  • 打赏
  • 举报
回复
是会默认生成构造的.看楼主你对文字的理解了
superxiaomm 2006-12-16
  • 打赏
  • 举报
回复
这句话当然是对的
keepRunning 2006-12-16
  • 打赏
  • 举报
回复
我知道简单的一种情况就时当类中没有其他的constructor时,可以不提供,但是如果有,而且只有你要调用default constructor 时则你应该要自己提供,否则会产生 compile error,因为没有match的 constructor,我想这也是一种安全,compiler will think you foget to give argument(s) to the constructor (just my own opinion).
yourtommy 2006-12-15
  • 打赏
  • 举报
回复
taodm&lin_style:你们是说在不构造类的对象情况下,不会提供默认的构造函数罗?如果你们说的正确的话,应该是“不使用原则”,你开始说的那些情况应该也包含在里面。那些情况的构造函数是为了构造成员对象或/和父结象,因为要使用,所以提供。

《Effective C++》我还没开始看,以后如果我发现有不同的见解的话,再拿上来讨论。
zenny_chen 2006-12-15
  • 打赏
  • 举报
回复
class Mask
{
public:

virtual void Mirage(void)
{
cout << "Oh, dear!" << endl;
}

// 产生了构造函数用于初始化虚函数表指针,但没有生成析构函数
};

void main(void)
{
Mask m;

m.Mirage();
}
zenny_chen 2006-12-15
  • 打赏
  • 举报
回复
给你一些例子吧:

#include <iostream>

using namespace std;


class Base
{

public:

Base(void)
{

}


~Base(void)
{

}

};


class Derived : public Base
{
// 自动生成了默认构造函数及析构函数
// 因为必须用构造函数来创建父类区域,析构函数来析构本类区域再调用父类析构函数
};


class Parent
{
protected:

int t;
};


class Child : public Parent
{
public:

void Hello(void)
{
cout << "Hello, world" << endl;
}

// 没有产生默认的构造函数及析构函数
};


class Test
{
private:

Derived d;

// 产生了公有的构造函数及析构函数来创建与析构Derived对象d

};


class Noodle
{
private:

Child ch;

public:

void Hello(void)
{
ch.Hello();
}

// 没有产生默认的构造函数及析构函数
};


void main(void)
{
Derived d; // 产生了Derived::Derived(void)以及Derived::~Derived(void)

Child ch;

ch.Hello();

Test t;

Noodle n;

n.Hello();
}

从以上例子可以得出:

如果一个类没有写构造函数和析构函数并不会自动生成额外的构造函数或析构函数,除非:
(1)它所继承的父类函有构造函数或析构函数,这时子类会产生默认的构造函数和析构函数
以调用父类的构造函数和析构函数。

(2)它的成员中含有具有构造函数或析构函数类的对象。这时会产生构造函数及析构函数来创建及析构该成员。


lann64 2006-12-15
  • 打赏
  • 举报
回复
编译器不就是生成可执行代码的嘛。需要时就生成一段用来构造的代码,如果不需要就是你自己写的代码也会被优化掉,编译器更不会画蛇添足给你硬要加一段代码。
理解那段话,重点在c++有提供默认构造函数的机制,但这个机制启动的前提是,你自己没有提供任何构造函数。但启动了这个机制,是不是生成代码,还要看具体情况下是否需要。
v2002750 2006-12-15
  • 打赏
  • 举报
回复
哈哈 我都觉得我说的有点矛盾了! 小弟菜鸟,见笑了!
v2002750 2006-12-15
  • 打赏
  • 举报
回复
看你怎么理解"提供"这个词了
我觉得这句话的意思是,为了保证“每个可实例化的类都拥有构造函数”这样一个语义,当一个类没有提供构造函数的时候,会有一个构造函数被声明出来,仅仅是放在那里,一般情况下它没有任何用处,你创建对象的时候甚至都没有去调用它。
但有的时候,编译器会觉得它有用--也就是你说的那几种情况。这个时候编译器会把这个构造函数拿来,并且加上一些代码来保证“类被实例化的时候都会调用构造函数”这个语义。

lin_style 2006-12-14
  • 打赏
  • 举报
回复
to yourtommy() ( ) 信誉:100 Blog
怎么说了, 以前没深究过这个问题,认为会默认提供个空的构造函数

to taodm(taodm)
谢谢正在看
healer_kx 2006-12-14
  • 打赏
  • 举报
回复
嗯,就是那么三四种情况。
Dallas_Rockets 2006-12-14
  • 打赏
  • 举报
回复
比较深奥啊,不过,既然c++ 本身提供的话,而且如果便于程序的易读的话,为什么不使用呢?
taodm 2006-12-14
  • 打赏
  • 举报
回复
C++规定,如果一个类没有提供任何的构造函数,则“在需要的时候”C++编译器自动提供一个默认的构造函数。
你说的1、2、3就是所谓的“需要的时候”。可看Effective C++。
yourtommy 2006-12-14
  • 打赏
  • 举报
回复
你这话什么意思?
如果我有一个类没有基类,没有聚合,有一个光秃秃的class A{};
实例化一个对象,A a; 要不就定义一个A的数组:A a[100];
你觉得它的构造函数在哪??

64,648

社区成员

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

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