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
感谢 u010165006 指教。
我有构造函数,但是没有默认构造函数,此时,编译器还会创建默认构造函数吗?
ps:我理解的默认构造函数,要么没有形参,要么形参全部有默认参数,不知道这样理解是否正确?
恳请指教,谢谢哈。
#3
ik ee = ik(8); //语句2
改成:
ik ee;
试试能不能编译通过。
改成:
ik ee;
试试能不能编译通过。
#4
我使用vs2015,编译不能通过。如下图:
#5
那就是了。字数~
#6
非常感谢大神指教。
#7
在没有显示定义时,编译器会自动生成一个默认拷贝构造函数,默认拷贝构造函数会将原对象中的内容拷到创建的对象中。
ik ee = ik(8); //语句2
应该是拷贝构造。
ik ee = ik(8); //语句2
应该是拷贝构造。
#8
没有构造函数的时候,编译器会创建一个默认构造函数。
#9
语句2是先调用有参的构造函数实例化一个临时对象,再通过默认的拷贝构造函数用这个临时对象来实例化对象ee。
#10
#11
1、没有默认构造函数,你确实不能构造无参数的对象,但你可以构造与你构造函数符合的对象,你写ik a; 将会导致编译出错
#12
除非你写成如下才是赋值:
ik ee;
ee = ik(8);
#13
#14
把你的默认构造函数声明为private 就清楚了
#15
感谢版主指教。
大概我明白一些了。
也就是说,这里的=不是赋值,而是采用拷贝构造函数,而这里拷贝构造函数是由编译器自动完成的。
看来,编译器“默默”完成的事情还真不少啊。
ps:c++是新手,不是很懂,版主见笑了(之前写过c,对c稍微了解一些)。
#1
没有构造函数的时候,编译器会创建一个默认构造函数。
#2
感谢 u010165006 指教。
我有构造函数,但是没有默认构造函数,此时,编译器还会创建默认构造函数吗?
ps:我理解的默认构造函数,要么没有形参,要么形参全部有默认参数,不知道这样理解是否正确?
恳请指教,谢谢哈。
#3
ik ee = ik(8); //语句2
改成:
ik ee;
试试能不能编译通过。
改成:
ik ee;
试试能不能编译通过。
#4
我使用vs2015,编译不能通过。如下图:
#5
那就是了。字数~
#6
非常感谢大神指教。
#7
在没有显示定义时,编译器会自动生成一个默认拷贝构造函数,默认拷贝构造函数会将原对象中的内容拷到创建的对象中。
ik ee = ik(8); //语句2
应该是拷贝构造。
ik ee = ik(8); //语句2
应该是拷贝构造。
#8
没有构造函数的时候,编译器会创建一个默认构造函数。
#9
语句2是先调用有参的构造函数实例化一个临时对象,再通过默认的拷贝构造函数用这个临时对象来实例化对象ee。
#10
#11
1、没有默认构造函数,你确实不能构造无参数的对象,但你可以构造与你构造函数符合的对象,你写ik a; 将会导致编译出错
#12
除非你写成如下才是赋值:
ik ee;
ee = ik(8);
#13
#14
把你的默认构造函数声明为private 就清楚了
#15
感谢版主指教。
大概我明白一些了。
也就是说,这里的=不是赋值,而是采用拷贝构造函数,而这里拷贝构造函数是由编译器自动完成的。
看来,编译器“默默”完成的事情还真不少啊。
ps:c++是新手,不是很懂,版主见笑了(之前写过c,对c稍微了解一些)。