与类有关的各种初始化方法及问题
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++的知识点纷繁复杂,如果还有其他未写进博客的初始化问题,还请读者将其留在评论区。
以上是关于与类有关的各种初始化方法及问题的主要内容,如果未能解决你的问题,请参考以下文章