类的初始化
一般情况下,对于类的初始化操作,使用构造函数来完成类的初始化操作。要想理解和学习类的初始化,主要要弄明白如下几个问题:
(1)C++提供了哪些初始化类的方法?
(2) 为什么要构造函数来初始化类?
(3) 使用构造函数初始化类具体做什么?
C++提供了哪些初始化类的方法
C++提供两类对于类的初始化方法:
第一类:从C语音继承来的显示初始化列表;
class Data
{
public:
int ival;
char *pstr;
};
Data local2 = { 1024, "Anna Livia Plurabelle" };
缺点:
- 只能被应用在所有数据成员都是共有的类对象上(public);
- 不支持使用数据封装和抽象数据类型;
优点:
- 当像一个数据结构中注入大量常量值的时候
第二类:构造函数
构造函数的概念从很多地方都可以找到,我的理解为,构造函数是C++为程序员提供的自动的初始化类的工具(需要程序员显示的指定)。
那么既然是C++为我们提供的工具,那么我们该如何使用,并且应该注意什么呢?
(1)如何定义构造函数
构造函数是类中有类同名的函数,是没有返回值的函数,具体的功能为实现类成员变量的初始化。对于初学者来说,很容易有如下误解:
- 缺省构造函数(无参数的构造函数)为系统默认提供的,即具体的开发的同学不用实现,系统会自动调用。这样的想法是十分错误的,默认情况下,如果一个类没有实现任何构造函数,那么当定义一个类的时候,相当于该类没有被初始化。
- 只能有一个构造函数;构造函数和其他函数一样,满足函数的一些特质,比如说函数的重载,只是要注意,构造函数没有任何函数类型和返回值类型;
(2)系统不会默认的为一个类提供默认构造函数,如果一个类没有定义相关的构造函数,那么再使用这个类的时候,类的成员变量是没有初始化的(上面已经说了,这里着重所一下;
第三类:缺省按成员初始化
第四类:缺省按成员赋值
为什么要初始化
一般情况下,使用类的构造函数对于类的来进行初始化操作。个人觉得,类的初始化操作,主要是由于如下两个层面的部分考虑;
1:方便程序员高效编程;
举例一(一般情况下的使用):
class Demo
{
public:
char *pneed_new_str1;
char *pneed_new_str2;
};
class DemoUser
{
public:
Demo *use_demo1;
Demo *use_demo2;
};
类定义如上,DemoUser类包含多个Demo类的成员,如果Demo类有需要从堆上面申请空间的变量等初始化操作,那么需要在DemoUser类中分别实现,并且由于Demo类的类型相同,且有多个Demo的成员变量,需要重复写很多代码,复杂、效率低、容易出问题且出现了问题不好定位,但是如果有Demo类的相关的构造函数的话,那么就可以将程序员从这些复杂又无用的操作中解放出来。
带构造函数的版本如下:
#define DEFAULT_STR_LEN 10240 //默认的字符串长度 class Demo
{
public:
Demo()
{
pneed_new_str1 = new char[DEFAULT_STR_LEN];
pneed_new_str2 = new char[DEFAULT_STR_LEN];
}
public:
char *pneed_new_str1;
char *pneed_new_str2;
};
class DemoUser
{
public:
DemoUser()
{
use_demo1 = new Demo();
use_demo2 = new Demo();
}
public:
Demo *use_demo1;
Demo *use_demo2;
};
注: (1)作为demo,这里省去了new的合法性判断,默认new不会出错,每次都成功; (2)本例在构造函数中直接进行了空间的申请,意在说明方便性,考虑到一般情况下构造函数中只会对变量置NULL,在init函数中申请相关的空间,特在此处说明。 (就算是置NULL,也能重复体现出构造函数的方便性,只是new更容易让大家理解);
举例2(继承层面的使用):
2:类的使用的安全性;
未完待续
原文链接: https://www.cnblogs.com/mr-sunny/archive/2013/01/28/2879980.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/77078
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!