1.类的定义
class为定义类的关键字,className为类的名字,{}中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员:类中的数据称为类的属性或着成员变量;类中的函数称为类的方法或者成员函数。
2.类的两种定义方式
1》 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当作内联函数处理。
2》 声明与定义分开——成员函数在类外定义时,必须要在成员函数前加:类名::
3》 一般情况下 建议将声明与定义分开——为了防止重复包含。
3.类的访问限定符:
1> public修饰的成员在类外可以直接被访问
2>protested和private修饰的成员在类外不能被直接访问。
3>访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止
4>class的默认访问限定符为private,struct为public(因为struct要兼容c语言)。
4.类对象的存储方式猜测:
一个类的大小,实际就是该类“成员变量之和”,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。
5.this指针:
1.this指针:this指针的类型:类类型* const
2.只能在成员函数中使用
3.this指针是成员函数第一个隐含的指针形参,一般情况下由编译器通过exc寄存器自动传递,不需要用户传递。
寄存器:eax ebx ecx edx ebp esp…
空间小 速度快 离cpu近的存储空间
一般情况下内存中的数据要进行计算,基本上都是先将数据放到寄存器中,然后再来进行运算
在程序中可以将寄存器理解成全局变量
6.构造函数:
1》概念:构造函数是一个特殊的成员函数,名字与类名相同,创建类对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。
2》特性:
函数名与类名相同
无返回值
对象实例化时自动调用对应的构造函数
构造函数可以重载
3》默认的构造函数:
1.用户定义的无参构造函数
2.用户定义带有全缺省的构造函数——所有参数都带有默认值
3.如果用户没有显示定义任何构造函数,编译器会自动生成一个无参的构造函数
注意:默认的构造函数只能存在一个
默认的构造函数
成员变量的命名风格:
避免与函数形参混淆,和参数区分开。
7.析构函数
概念:与构造函数功能相反,对象在销毁时,由编译器自动调用。
作用:完成对象中资源的清理工作。
特性:1. 析构函数名是在类名前加上字符“~”
2. 无参数 无返回值
3. 一个类有且只有一个析构函数,
4. 对象生命周期结束时,c++编译系统自动调用析构函数。
8.拷贝构造函数:
概念:只有单个形参,该形参是对本类类型对象的引用(一般由const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
特性:
1.拷贝构造函数是构造函数的一种重载形式‘
2.拷贝构造函数的形参只有一个,**且必须使用引用传参,**使用传值方式会引起无限递归
3.若未显式定义,系统生成默认的拷贝构造函数,默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或值拷贝。
浅拷贝:将一个对象中的内容原封不动的拷贝到另一个新对象中,将该种拷贝方式称为浅拷贝。
浅拷贝的后果:导致两个对象会使用同一份资源,在对象销毁的时候会导致一份资源释放多次而引起代码崩溃。
9.运算符重载:
为了提高代码的可读性引入了运算符重载 运算符重载是具有特殊函数名的函数,也具有其返回值类型 函数名字以及参数列表,其返回值类型与参数列表与普通函数类似。
注意:
不能通过链接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型或者枚举类型的操作数 用于内置类型的操作符,其含义不能变 比如+ ,不能改变其含义。 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参。
前置++和后置++的重载
date类:类中没有涉及到资源管理时,可以不用给出,如果用户需要做其他操作,根据需要给出。
string:类中涉及到资源管理,必须要给出。