与类有关的各种初始化方法及问题

Posted Aline2021-yxz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与类有关的各种初始化方法及问题相关的知识,希望对你有一定的参考价值。

class test0

private:
	int _x;
	int _y;
public:
;


class test1

private:
	int _data;
	int * _pointer;
	test0 n0;//嵌套一个类对象
public:

	
;

我们将使用上面的两个简单类完成本次实验,它们的成员函数没有写,是为了更好的演示。

默认构造函数初始化对象的偏心处理

当我们没有显式的给出构造函数的时候,编译器将为我们提供一个默认构造函数,这个构造函数将对类成员变量进行偏心处理,将只调用自定义类成员变量的构造函数初始化对象,而不初始化内置类型变量(int ,char…);


还是上面的代码,可以看到,test1中默认的构造函数好像没有“偏心”啊,不管是自定义的n0变量还是内置类型的变量都是随机值啊?


还是上面的两个类,我这次在test0中显式的给出构造函数,可以看到test1中默认的构造函数初始化了自定义类型,而内置类型依然没有初始化,由此可见偏心处理。

其实偏心处理是早期C++设计的不足之处,所以为了填补这个不足,C++又支持这种写法:

在声明变量的时候给它一个缺省值,这样就解决偏心处理的问题,注意这里仍然是声明,不是定义,千万不要搞混了。

默认构造函数既然会调用test0的构造函数初始化对象,那我能这样写吗?

运行结果告诉我:

没有合适的默认构造函数可用,默认构造函数应该是无参数的,那么我们显式给出的构造函数也应该无参数,那难道我就不能写一个带参数的吗?
不然!我们可以写一个全缺省的构造函数。

❗❗❗重点总结

  • 默认的构造函数会对对象成员偏心处理,将调用自定义成员的无参/全缺省构造函数初始化自定义成员,对内置类型成员不初始化。

  • 通过在内置类型声明时给缺省值的方法可以解决偏心处理问题。

默认拷贝构造函数初始化的浅拷贝

拷贝构造函数是在使用一个已知类初始化一个新类的时候调用的,如果没有显式的给出拷贝构造函数,编译器将提供一个默认的拷贝构造函数,它将使新类中的成员变量完成对已知类成员变量的字节序拷贝。


默认的构造函数看起来完成了我们的想法,将n2初始化为与n1一样的对象,但是细心的博友可以看到,我new了空间但是没delete,这是不合理的,那么我加上。

加上析构函数后,居然报错了,其实报错的原因很简单,之前说默认的拷贝构造是字节序的拷贝,那么在拷贝指针时应该是这样的:

this->_pointer=n1._pointer;(this指向n2,n1其实是引用,我就使用n1,好理解)

这样拷贝有一个问题,两个对象的指针指向同一个内存区域,那么在析构的时候就会对同一片空间delete两次,这明显是不合理的。

❗❗❗重点总结

  • 默认的拷贝构造函数没有偏心处理
  • 默认的拷贝构造函数将完成字节序拷贝(浅拷贝),在某些类里面是没问题的,但是在使用了额外空间的类中是有问题的。
  • 浅拷贝最常见的问题就是使多个对象中的成员指向同一空间,在析构的时候往往会对这片空间多次析构,导致报错。

核心::初始化列表(成员变量定义初始化的地方)

我们都知道类中的成员变量都是在实例化对象的时候定义的,那到底是在哪定义的呢,也许很多人会猜是在构造函数内部完成的,其实不然;

上面暂时的就是一个初始化列表,可以看到它不在构造函数里,在构造函数函数名的后面,它的结构是:

: 变量名()
,变量名()
,变量名()
,变量名()

那么既然这里完成了对成员变量的定义,那么我们需要注意,有几种变量是必须在这里完成定义的:

1:const变量
2:引用
3:没有默认构造函数的自定义类型成员

前两个很好理解,第三个可能不好理解
这样理解:在类定义的时候都会调用构造函数初始化,如果没在初始化列表写,那么默认会调用无参/全缺省的构造函数,要是类中没有,就会报错。

初始化列表可以很大,只要你需要初始化的参数够多。

❗❗❗重点总结

  • 初始化列表是对象变量定义的地方。
  • 变量在初始化列表中只能出现一次(因为初始化只有一次)。
  • 记住有些特殊变量必须在初始化列表初始化。

static成员变量初始化问题

static成员变量是属于类的,被所有的对象共享,那么我们结合上面的知识可以推测,static成员变量绝不可能在初始化列表处定义,不然实例化n个对象就会将static成员变量初始化n次,这明显是不合理的。


static成员变量必须在类外初始化,注意在定义时不能使用static。

C++的知识点纷繁复杂,如果还有其他未写进博客的初始化问题,还请读者将其留在评论区。

以上是关于与类有关的各种初始化方法及问题的主要内容,如果未能解决你的问题,请参考以下文章

与类有关的各种初始化方法及问题

与类有关的各种初始化方法及问题

与类有关的魔术常量

Java的构造器

Java的构造器

Java|static关键字实例变量与类变量实例方法与类方法