关于类默认构造函数的一些有关问题,
关于类默认构造函数的一些问题,求助。
C++primer这本书中说的:为类定义了构造函数后,程序员就必须为它提供默认构造函数怎么理解?
假如你写一个有参数的构造函数,那么编译器就不会生成无参的构造函数
你定义数组也就不行
1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。
2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。
3.只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数。
4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。
注意看第3条,这个时候就不存在默认构造函数了。test类就没有默认构造函数。
这个情况说法下:自定义构造函数情况下,还必须要有一个默认构造函数。
但是 下面这个列子
然而这个例子可以只定义够着函数而不定义默认构造函数。
那么这两种说法到底哪个正确。
------解决方案--------------------
根据第3条,得不出“自定义构造函数情况下,还必须要有一个默认构造函数”这个结论。
没有无参构造函数时,只是不能定义该类型的数组而已。如果需要定义该类型的数组,则在自定义有参构造函数时,还需要显示定义无参构造函数。
------解决方案--------------------
如果你不定义构造函数,系统会自动地为你定义一个默认的构造函数。
一旦你定义了构造函数,系统便不会再为你定义默认的构造函数。
如果你定义了一个带参数的构造函数,此时,系统不再提供无参的默认构造函数,在这种情况下,如果你自己不定义无参的构造函数,便不能使用诸如test x;这样的语句,因为此时,系统无法构造对象x。
你举的例子中,Animal myAnimal("hello");这种用法是没有关系的,因为它会调用相应的构造函数去构造对象。
------解决方案--------------------
你定义了一个类 A 后,关于构造函数你可以做以下选择:
1、如果你不需要通过其他参数来构造该类的对象,那么你无须定义它的构造函数,此时编译器会给你默认生成一个无参的构造函数public A(){};当你用 A a 或者 new A() 创建A的对象的时候就调用该函数来创建,所以没有问题;
2、如果你需要根据自己的参数来创建对象,那么你可以重新写一个带参数的构造函数,比如public A(string str){……},此时,你可以用A a = new A("abc")的形式来创建对象,但是一旦你自己写了构造函数,编译器就不会默认给你生成无参的构造函数public A(){};也就是说你不能用A a 或者 new A() 来创建对象或者其数组,如果要使用该方式,你必须在类中自己写一个无参的构造函数后才能调用。
而且,你即使只需要无参的构造函数,但你需要在构造函数中做一些自己的动作,也是要自己写这个函数的,编译器生成的是一个空函数,什么也不会做,只负责分配空间,初始化对象。
总之,你如果需要在构造函数中做什么操作,或者需要传参数给构造函数,你都得自己写构造函数,否则达不到你预期的效果。
------解决方案--------------------
1 构造函数的问题, 构造函数有三类 默认构造、带参构造、复制构造,其中任意一个出现,都会抑制系统生成默认构造
2 类似于
“你不定义初始化构造函数,系统会自动地为你定义一个默认的构造函数"
“你不定义复制构造函数,系统会自动地为你定义一个复制构造函数"
...
的话是不严谨的
C++primer这本书中说的:为类定义了构造函数后,程序员就必须为它提供默认构造函数怎么理解?
假如你写一个有参数的构造函数,那么编译器就不会生成无参的构造函数
你定义数组也就不行
class test
{
public:
test(int x){};
};
int main()
{
test x[10];//error
}
1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。
2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。
3.只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数。
4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。
注意看第3条,这个时候就不存在默认构造函数了。test类就没有默认构造函数。
这个情况说法下:自定义构造函数情况下,还必须要有一个默认构造函数。
但是 下面这个列子
#include <iostream>
using namespace std;
class Animal
{
private:
char* name;
public:
//Animal()
//{
// name = "Unknown";
//}
Animal(char *temp)
{
name = temp;
}
void showName()
{
cout<<name<<endl;
}
};
void main()
{
//Animal anAnimal;
Animal myAnimal("hello");
//anAnimal.showName();
myAnimal.showName();
}
然而这个例子可以只定义够着函数而不定义默认构造函数。
那么这两种说法到底哪个正确。
------解决方案--------------------
根据第3条,得不出“自定义构造函数情况下,还必须要有一个默认构造函数”这个结论。
没有无参构造函数时,只是不能定义该类型的数组而已。如果需要定义该类型的数组,则在自定义有参构造函数时,还需要显示定义无参构造函数。
------解决方案--------------------
如果你不定义构造函数,系统会自动地为你定义一个默认的构造函数。
一旦你定义了构造函数,系统便不会再为你定义默认的构造函数。
如果你定义了一个带参数的构造函数,此时,系统不再提供无参的默认构造函数,在这种情况下,如果你自己不定义无参的构造函数,便不能使用诸如test x;这样的语句,因为此时,系统无法构造对象x。
你举的例子中,Animal myAnimal("hello");这种用法是没有关系的,因为它会调用相应的构造函数去构造对象。
------解决方案--------------------
你定义了一个类 A 后,关于构造函数你可以做以下选择:
1、如果你不需要通过其他参数来构造该类的对象,那么你无须定义它的构造函数,此时编译器会给你默认生成一个无参的构造函数public A(){};当你用 A a 或者 new A() 创建A的对象的时候就调用该函数来创建,所以没有问题;
2、如果你需要根据自己的参数来创建对象,那么你可以重新写一个带参数的构造函数,比如public A(string str){……},此时,你可以用A a = new A("abc")的形式来创建对象,但是一旦你自己写了构造函数,编译器就不会默认给你生成无参的构造函数public A(){};也就是说你不能用A a 或者 new A() 来创建对象或者其数组,如果要使用该方式,你必须在类中自己写一个无参的构造函数后才能调用。
而且,你即使只需要无参的构造函数,但你需要在构造函数中做一些自己的动作,也是要自己写这个函数的,编译器生成的是一个空函数,什么也不会做,只负责分配空间,初始化对象。
总之,你如果需要在构造函数中做什么操作,或者需要传参数给构造函数,你都得自己写构造函数,否则达不到你预期的效果。
------解决方案--------------------
1 构造函数的问题, 构造函数有三类 默认构造、带参构造、复制构造,其中任意一个出现,都会抑制系统生成默认构造
2 类似于
“你不定义初始化构造函数,系统会自动地为你定义一个默认的构造函数"
“你不定义复制构造函数,系统会自动地为你定义一个复制构造函数"
...
的话是不严谨的