一.类的定义
1.类格式定义
class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省
略。
类体中内容称为类的成员:
类中的变量称为类的属性或成员变量;
类中的函数称为类的⽅法或者成员函数。
定义在类中的函数默认为inline
2.访问限定符
c++通过访问限定的方式来选择性的将函数接口提供给予用户使用
public修饰的成员在类外可以直接被访问;
protected和private修饰的成员在类外不能直接被访问(class定义成员没有被访问限定符修饰时默认为private,struct默认为public)
3.类域
类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤::作⽤域操作符指明成员属于哪个类域。
二.实例化
⽤类类型在物理内存中创建对象的过程,称为类实例化出对象
类只是一种声明,类中存在的变量只是声明,没有空间,实例化之后才会分配空间。
和结构体类似,类的存储也符合内存对齐规则
三.this指针
编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this
指针。
成员函数中访问成员变量,利用的就是this指针
四.类的默认成员函数
1.构造函数
构造函数特点:
1.函数名与类名相同
2.无需返回值
3.实例化时编译器自动调用构造函数
4.可以重载
5.如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个无参的默认构造函数,⼀旦用户显式定义编译器将不再生成。
2.析构函数
析构函数特点:
1.析构函数名是在类名前加上字符~
2.无参数无返回值;
3一个类只有一个析构函数,若无自定义析构函数,系统自动生成默认的析构函数;
4.对象生命周期结束自动调用析构函数;
5.跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定类型成员会调用他的析构函数。
3.拷贝构造函数
拷贝构造函数特点:
1.拷贝构造函数实际就是构造函数的重载;
2.拷贝构造函数的参数只有⼀个且必须是类类型对象的引用;
3.C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造,所以这⾥⾃定义类型传值传参和传值返回都会调⽤拷⻉构造完成;
五.运算符重载
概念:当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。C++规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错;
重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元
运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数;
运算符重载是具有特名字的函数,他的名字是由operator和后面要定义的运算符共同构成。和其他
函数⼀样,它也具有其返回类型和参数列表以及函数体;
重载操作符⾄少有⼀个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int
operator+(int x, int y);
注:以下五个运算符不可重载;
六.初始化列表
和构造函数类似,之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种方式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以分号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式;
对于没有显⽰在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构造会编译错误;
初始化列表中按照成员变量在类中声明顺序进⾏初始化,跟成员在初始化列表出现的的先后顺序⽆
关。建议声明顺序和初始化列表顺序保持⼀致;
七.static成员
1.⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进⾏初始化;
2.静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区;
3.⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针;
4.静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针;
5.突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量和静态成员函数;
6.⾮静态的成员函数,可以访问任意的静态成员变量和静态成员函数;
7.静态成员也是类的成员,受public、protected、private访问限定符的限制;
8.静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不⾛构造函数初始化列表;
八.友元
友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类
声明的前面加friend,并且把友元声明放到⼀个类的里面;
友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制;
友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元;
友元也没有传递关系;
⼀个函数可以是多个类的友元函数;
目录
类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤::作⽤域操作符指明成员属于哪个类域。
二.实例化
5.如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个无参的默认构造函数,⼀旦用户显式定义编译器将不再生成。2.析构函数
3.C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造,所以这⾥⾃定义类型传值传参和传值返回都会调⽤拷⻉构造完成;