关于类默认构造函数的一些有关问题,

关于类默认构造函数的一些问题,求助。
本帖最后由 freeangel_aqs 于 2014-06-04 16:48:13 编辑
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 类似于
“你不定义初始化构造函数,系统会自动地为你定义一个默认的构造函数"
“你不定义复制构造函数,系统会自动地为你定义一个复制构造函数"
...
的话是不严谨的