c++ 没有默认构造函数,为什么还能创建对象呢?

时间:2021-01-26 19:29:53
class ik
{
public:
ik(int f) { fuss = f; }; //语句1
void view_ik(void) const;
private:
int fuss;
};

void ik::view_ik(void) const
{
std::cout << fuss << std::endl;
}

int main()
{
ik ee = ik(8); //语句2
ee.view_ik();

std::cin.get();
return 0;
}

如上代码,小弟有个疑问,恳请大神帮指教,不胜感激...

问题描述:
语句1:因为显示定义一个带int参数的构造函数(并且没有默认参数),按照我的理解,编译器不会再创建默认构造函数。
语句2:ik(8)会创建一个无名的ik类的对象。= 在这里我理解为使用编译器默认的赋值方式(对应的类成员一一赋值)。
请问,ik ee,这里ee如何被创建呢?ee没有给出任何参数,而构造函数中明确要求需要一个int形参啊?恳请指教...

15 个解决方案

#1


没有构造函数的时候,编译器会创建一个默认构造函数。

#2


引用 1 楼 u010165006 的回复:
没有构造函数的时候,编译器会创建一个默认构造函数。


感谢 u010165006 指教。

我有构造函数,但是没有默认构造函数,此时,编译器还会创建默认构造函数吗?
ps:我理解的默认构造函数,要么没有形参,要么形参全部有默认参数,不知道这样理解是否正确?

恳请指教,谢谢哈。

#3


ik ee = ik(8); //语句2
改成:
ik ee;
试试能不能编译通过。

#4


我使用vs2015,编译不能通过。如下图:
c++ 没有默认构造函数,为什么还能创建对象呢?

#5


那就是了。字数~

#6


非常感谢大神指教。 c++ 没有默认构造函数,为什么还能创建对象呢?

#7


在没有显示定义时,编译器会自动生成一个默认拷贝构造函数,默认拷贝构造函数会将原对象中的内容拷到创建的对象中。
ik ee = ik(8); //语句2
应该是拷贝构造。

#8


没有构造函数的时候,编译器会创建一个默认构造函数。

#9


语句2是先调用有参的构造函数实例化一个临时对象,再通过默认的拷贝构造函数用这个临时对象来实例化对象ee。

#10


c++ 没有默认构造函数,为什么还能创建对象呢?

#11


1、没有默认构造函数,你确实不能构造无参数的对象,但你可以构造与你构造函数符合的对象,你写ik a; 将会导致编译出错

#12


本帖最后由 paschen 于 2018-01-04 14:35:39 编辑
2、ik ee = ik(8);执行的就是你的int参数的构造函数直接构造对象,这里不是赋值

除非你写成如下才是赋值:

ik ee;
ee = ik(8);

#13


该回复于2018-01-04 14:32:09被版主删除

#14


把你的默认构造函数声明为private 就清楚了

#15


引用 12 楼 paschen 的回复:
2、ik ee = ik(8);执行的就是你的int参数的构造函数直接构造对象,这里不是赋值

除非你写成如下才是赋值:

ik ee;
ee = ik(8);


感谢版主指教。

大概我明白一些了。
也就是说,这里的=不是赋值,而是采用拷贝构造函数,而这里拷贝构造函数是由编译器自动完成的。
看来,编译器“默默”完成的事情还真不少啊。
ps:c++是新手,不是很懂,版主见笑了(之前写过c,对c稍微了解一些)。

#1


没有构造函数的时候,编译器会创建一个默认构造函数。

#2


引用 1 楼 u010165006 的回复:
没有构造函数的时候,编译器会创建一个默认构造函数。


感谢 u010165006 指教。

我有构造函数,但是没有默认构造函数,此时,编译器还会创建默认构造函数吗?
ps:我理解的默认构造函数,要么没有形参,要么形参全部有默认参数,不知道这样理解是否正确?

恳请指教,谢谢哈。

#3


ik ee = ik(8); //语句2
改成:
ik ee;
试试能不能编译通过。

#4


我使用vs2015,编译不能通过。如下图:
c++ 没有默认构造函数,为什么还能创建对象呢?

#5


那就是了。字数~

#6


非常感谢大神指教。 c++ 没有默认构造函数,为什么还能创建对象呢?

#7


在没有显示定义时,编译器会自动生成一个默认拷贝构造函数,默认拷贝构造函数会将原对象中的内容拷到创建的对象中。
ik ee = ik(8); //语句2
应该是拷贝构造。

#8


没有构造函数的时候,编译器会创建一个默认构造函数。

#9


语句2是先调用有参的构造函数实例化一个临时对象,再通过默认的拷贝构造函数用这个临时对象来实例化对象ee。

#10


c++ 没有默认构造函数,为什么还能创建对象呢?

#11


1、没有默认构造函数,你确实不能构造无参数的对象,但你可以构造与你构造函数符合的对象,你写ik a; 将会导致编译出错

#12


本帖最后由 paschen 于 2018-01-04 14:35:39 编辑
2、ik ee = ik(8);执行的就是你的int参数的构造函数直接构造对象,这里不是赋值

除非你写成如下才是赋值:

ik ee;
ee = ik(8);

#13


该回复于2018-01-04 14:32:09被版主删除

#14


把你的默认构造函数声明为private 就清楚了

#15


引用 12 楼 paschen 的回复:
2、ik ee = ik(8);执行的就是你的int参数的构造函数直接构造对象,这里不是赋值

除非你写成如下才是赋值:

ik ee;
ee = ik(8);


感谢版主指教。

大概我明白一些了。
也就是说,这里的=不是赋值,而是采用拷贝构造函数,而这里拷贝构造函数是由编译器自动完成的。
看来,编译器“默默”完成的事情还真不少啊。
ps:c++是新手,不是很懂,版主见笑了(之前写过c,对c稍微了解一些)。