构造函数

jy01807853 2011-07-24 10:42:42
原文"If an initializer is not provided for a class member, then the compiler implicitly uses the default constructor for the member's type. If that class does not have a default constructor, then the attempt by the compiler to use it will fail. In such cases, an initializer must be provided in order to initialize the data member."


我举的列子..
class first
{
int ival;
};

class second
{
first obj;
};

如果根据他的话,,如果没有为类成员提供初始化,编译器要调用类型成员的默认构造函数,,如果没有默认构造函数,,
就会报错...
但是first没有,,却没有提示错误,,
这段仍然可以通过编译,运行 ,,请问我的列子举错了??
还是我的理解有问题,,,麻烦大家帮下...谢了...
...全文
134 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jy01807853 的回复:]

引用 5 楼 pathuang68 的回复:
在first中,你没有给其定义构造函数,这时候编译器会自动为first提供一个默认的构造函数。如果你自己给first定义了一个构造函数,那么编译器就不会再为first提供缺省了构造函数了。

所以如果你要进行这样的实验,最好自己给first定义一个构造函数,这样就会抑制编译器为first生成缺省的构造函数,同时,把你自己定义的构造函数设为pri……
[/Quote]
你把:
first(int ival);
改为:
first(int ival)
{
this->ival = ival;
}
或者改为:
first()
{
}
这样做的目的就是为抑制编译器为first提供默认的构造函数。

”改成first() {} //我把默认构造函数变成这样就没有错误提示了...“,请问这时的first()是private的吗?如果是,那么肯定会报错,否则,就相当于你自己提供了一个缺省构造函数了,那自然就不会报错了。

不信就运行试试。
Michael_Xie 2011-07-25
  • 打赏
  • 举报
回复
看看深度探索C++对象模型,里边有对默认构造函数进行深入的探讨。
Xomic 2011-07-25
  • 打赏
  • 举报
回复
你的例子:
class first
{
int ival;
};

class second
{
first obj;
};


是聚合的概念,跟类的继承相似!

c++运算符重载里面还没见过友元吗?

jy01807853 2011-07-25
  • 打赏
  • 举报
回复
那位兄弟有空看下我的理解有问题吗?
jy01807853 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pathuang68 的回复:]
再多一句嘴,如果楼主不知道friend的用途,但又确实想知道friend有什么用,可以参考拙作:
友元函数和友元类

对不起,我没注意看到你8楼的代码加了个friend,否则也不会有那几个红色的字。
[/Quote]


/* 谢谢你的文章,明白了友元。

去掉friend后,我发现,first() {} 设置为private后,在创建second对象时,因为first obj是类类型成员,所以编译器尝试调用它的默认构造函数,因为构造函数私有所以失败,编译器又不没有合成,所以提示错误,这样理解对吗?

另外: first(int ival);
或者
first(int ival)
{
this->ival = ival;
}

在创建second对象是,编译器也尝试调用默认构造函数,发现构造函数是私有的,并且形参和实参个数不匹配,所以提示没有合适的构造函数。这样理解对吗?

我8楼给出的代码,加上friend class second后。
class second
{
first obj;

public:
void print()
{
obj.print();
}

};

second类的所有成员函数,可以访问first的所有成员,但是first() {}这个是私有的,

first obj这个obj应该不能创建吧?

不可能是因为,obj在void print()这个函数中,当obj调用first的print成员函数的时候,
才调用first的构造函数创建的对象?

我单独first object这样就提示不能访问私有数据。


再次谢谢你,多次的帮助我!

pathuang68 2011-07-25
  • 打赏
  • 举报
回复
再多一句嘴,如果楼主不知道friend的用途,但又确实想知道friend有什么用,可以参考拙作:
友元函数和友元类

对不起,我没注意看到你8楼的代码加了个friend,否则也不会有那几个红色的字。
pathuang68 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jy01807853 的回复:]

引用 11 楼 pathuang68 的回复:
引用 8 楼 jy01807853 的回复:

引用 5 楼 pathuang68 的回复:
在first中,你没有给其定义构造函数,这时候编译器会自动为first提供一个默认的构造函数。如果你自己给first定义了一个构造函数,那么编译器就不会再为first提供缺省了构造函数了。

所以如果你要进行这样的实验,最好自己给first定义……
[/Quote]
加了friend又另当别论,但这应该不是你做这个实验的初衷吧?讨论问题总得有个语境吧,呵呵。

请问你家friend的目的是什么?就为我那几个红色的字么?
我想楼主对这个问题已经有很好的了解了,无需俺再多说啦。
jy01807853 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pathuang68 的回复:]
引用 8 楼 jy01807853 的回复:

引用 5 楼 pathuang68 的回复:
在first中,你没有给其定义构造函数,这时候编译器会自动为first提供一个默认的构造函数。如果你自己给first定义了一个构造函数,那么编译器就不会再为first提供缺省了构造函数了。

所以如果你要进行这样的实验,最好自己给first定义一个构造函数,这样就会抑制编译器为first生成缺省……
[/Quote]


/*这就是我改后的情况,,,确实没报错...

但是如果改成,
first(int ival);
或者
first(int ival)
{
this->ival = ival;
}
就会报错,,请问这是什么情况?? 麻烦你再帮下我.谢勒..*/

class first
{
private:
first() {}
int ival;

public:
friend class second;
void print()
{
cout << ival << endl;
}
};

class second
{
first obj;

public:
void print()
{
obj.print();
}

};
brk1985 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pathuang68 的回复:]
在first中,你没有给其定义构造函数,这时候编译器会自动为first提供一个默认的构造函数。如果你自己给first定义了一个构造函数,那么编译器就不会再为first提供缺省了构造函数了。

所以如果你要进行这样的实验,最好自己给first定义一个构造函数,这样就会抑制编译器为first生成缺省的构造函数,同时,把你自己定义的构造函数设为private,这样,实际上,就让first类在类的外部……
[/Quote]

+++++++++++++正解。。。
woaizhangpeipei 2011-07-24
  • 打赏
  • 举报
回复
正解[Quote=引用 5 楼 pathuang68 的回复:]

在first中,你没有给其定义构造函数,这时候编译器会自动为first提供一个默认的构造函数。如果你自己给first定义了一个构造函数,那么编译器就不会再为first提供缺省了构造函数了。

所以如果你要进行这样的实验,最好自己给first定义一个构造函数,这样就会抑制编译器为first生成缺省的构造函数,同时,把你自己定义的构造函数设为private,这样,实际上,就让first类在类的外……
[/Quote]
jy01807853 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pathuang68 的回复:]
在first中,你没有给其定义构造函数,这时候编译器会自动为first提供一个默认的构造函数。如果你自己给first定义了一个构造函数,那么编译器就不会再为first提供缺省了构造函数了。

所以如果你要进行这样的实验,最好自己给first定义一个构造函数,这样就会抑制编译器为first生成缺省的构造函数,同时,把你自己定义的构造函数设为private,这样,实际上,就让first类在类的外部……
[/Quote]

class first
{
private:
first(int ival);改成first() {} //我把默认构造函数变成这样就没有错误提示了...
这是???
int ival;

public:
friend class second;
void print()
{
cout << ival << endl;
}
};

class second
{
first obj;

public:
void print()
{
obj.print();
}

};

int main(void)
{
second s;

return 0;
}
盛放的烟火 2011-07-24
  • 打赏
  • 举报
回复
编译器为之提供的默认构造函数
pathuang68 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jy01807853 的回复:]

引用 2 楼 pathuang68 的回复:
first有编译器为之提供的默认构造函数,所以不会报错。


他说的编译器会尝试调用默认构造函数,,但是没有的话,,尝试使用就会失败,,
所以在这种情况下,为了初始化数据成员,必须提供初始化式。
我理解成,,编译器会给警告或者错误..

member object
base class
virtual function
virt……
[/Quote]

你搞得太复杂了:)
只要你没有给一个类自己定义构造函数,编译器就会在合适的时候为该类提供缺省的构造函数。反过来,如果你自己只要自定义了一个或多个构造函数,编译器就不再为那个类生成缺省的构造函数了。就这么简单。
pathuang68 2011-07-24
  • 打赏
  • 举报
回复
在first中,你没有给其定义构造函数,这时候编译器会自动为first提供一个默认的构造函数。如果你自己给first定义了一个构造函数,那么编译器就不会再为first提供缺省了构造函数了。

所以如果你要进行这样的实验,最好自己给first定义一个构造函数,这样就会抑制编译器为first生成缺省的构造函数,同时,把你自己定义的构造函数设为private,这样,实际上,就让first类在类的外部没有构造函数可用,这样就会看到有错误了。

比如这样:

#include <iostream>
using namespace std;

class first
{
private:
first(int ival);
int ival;
public:
void print()
{
cout << ival << endl;
}
};

class second
{
first obj;
public:
void print()
{
obj.print();
}
};

int main(void)
{
second s;
s.print();
return 0;
}
jy01807853 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pathuang68 的回复:]
first有编译器为之提供的默认构造函数,所以不会报错。
[/Quote]

他说的编译器会尝试调用默认构造函数,,但是没有的话,,尝试使用就会失败,,
所以在这种情况下,为了初始化数据成员,必须提供初始化式。
我理解成,,编译器会给警告或者错误..

member object
base class
virtual function
virtual base
是不是有这4种情况,,编译器就会自动合成默认构造函数了??
至善者善之敌 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pathuang68 的回复:]
first有编译器为之提供的默认构造函数,所以不会报错。
[/Quote]

++1就是这样
pathuang68 2011-07-24
  • 打赏
  • 举报
回复
first有编译器为之提供的默认构造函数,所以不会报错。
jy01807853 2011-07-24
  • 打赏
  • 举报
回复
自己定下,,,等代..

64,642

社区成员

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

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