一、构造函数
1.首先我们知道一个常用的编码规范:声明变量赋初值。就是说我们在声明一个变量的时候,可以对它进行初始化,如果不对自己定义的变量进行初始化,一般编译器会指定一个随机值对它进行初始化,例如:
int i = 0;
int *p = NULL;
mallo 申请到的内存区域使用memset进行设置。
说白了,初始化就是给变量让它处于一个特定的状态、
同理,成员函数在进行定义的时候,也需要进行初始化,这就需要借助构造函数来进行实现
建立对象的时候,编译器会自动调用构造函数,如果需要指定,来完成对象的初始化
类对象的定义涉及到一个类名和一个对象名
由于类的唯一性和对象的多样性,用类名而不是对象名来作为构造函数名是比较合适的。
2.默认构造函数:就相当于是默认值。C++规定,每一个类都必须有一个构造函数,编译器会自动生成一个默认的构造函数
构造函数也是可以重载的,也是可以进行赋初始值,如果定义了构造函数,编译器也就不会在进行提供构造函数,和变量的定义是非常类似的,在用默认构造函数创建对象的时候,如果创建的是全局的对象或者是静态的对象,则对象的位模式全为0,否则,对象的值是随机的。
构造函数负责对象的初始化工作,将数据成员进行初始化。
创建对象的时候,其类的构造函数确保:在用户操作对象之前,系统保证初始化的进行。
(1)建立对象,必须有一个有意义的初始值。
(2)C++建立和初始化对象的过程专门由该类的构造函数来完成。
(3)构造函数给对象分配空间和初始化。
(4)如果一个类设有专门定义构造函数,那么C++就仅仅创建对象而不做任何的初始化。
3.构造方法满足以下的语法规则:
(1)构造方法与类名相同。
(2)没有返回类型
(3)方法实现主要为字段赋初值
(4)放在外部定义的构造函数,其函数名要加上“类名::”
构造函数的另一个特殊之处就是它没有返回类型,函数体中也不允许返回值,但是可以有无值返回语句“return ;”
因为构造函数专门用于创建对象和为其初始化,所以它是在定义对象时自动调用的。
如果建立一个对象数组:Desk dd[5] ,则构造函数会被调用5次,都是调用的是默认的构造函数。
构造函数的初始化列表:
4.构造函数的初始化列表中数据的初始化顺序和声明的顺序相同
构造函数用于隐式类型转换
二、析构函数
一个类可能在构造函数里面分配资源(内存,打开的文件等等),这些资源需要在对象不复存在以前被释放。
析构函数也是特殊类型的成员,它没有返回类型,没有参数,不能随意调用,也没有重载,只是在类对象生命周期结束的时候,由系统自动调用。
析构函数名,就是在构造函数名前面加上取逻辑非的符号~,表示“逆构造函数”
如果类没有自定义析构函数,则编译器提供一个默认的析构函数
析构函数只有一个,不能重载
三、C++标准库里面提供的string类:
C++提供的抽象数据类型(ADT),用于进行字符串的操作,
字符串是软件系统中最常见的数据结构之一
中文的字符编码标准为GB18030,一般一个汉字占用的内存为两个字节,生僻字一般占四个字节。
字符串的初始化方法:
初始化方法 代码解释
string s1; 默认的构造函数,s1为空的字符串
string s2(s1); 将s2初始化为s1的一个副本
string s3(“value”); 将s3初始化为字符串的一个副本
string s4(n,’c’); 将字符串初始化为字符c的n个副本。
string的操作:
s.empty() 如果字符串为空,返回true,否则返回false
s.size() 返回字符串中字符的个数
s[n] 返回字符串中的第n个字符,下标从0开始
s1+s2 将s1和s2连接成一个新的字符串,返回新生成的字符串
s1=s2 将s2赋值给s1
v1 == v2 比较v1和v2的内容,相等则返回true,否则返回false
!= , < ,<= ,> ,>= 保持这些操作符惯有的含义