day2: 类 对象 this指针 构造函数
1 封装--》打包--》包装
定义:指的是把一类事物的通用属性和操作该属性的方法绑定在一起。
人:属性+行为
属性:姓名 年龄 性别 身高 体重---》静态
struct peraon
{char name[50];
int age;
bool flag;
float height;
float weight;
}
行为:eat(struct person per) --->eat(zhangsan)
study()
sleep()
walk()
c语言:用结构体来表现人的静态属性;在结构体外用函数来实现人的动态行为。
通过函数入参将人的属性和他的行为关联起来。
c++语言:用封装思想将人的属性和行为绑定在一起。
{
char name[50];
int age;
bool flag;
float height;
float weight;
eat()
study()
sleep()
walk()
}
2 类
定义:是把一类事物的通用属性和操作该属性的方法绑定在一起的一个集合,是封装 思想的体现,类是一种复合数据类型。
如何定义类?和定义结构体一样
struct 结构体名
{
属性1;---》成员数据(变量)
属性2;
。。。
};
class 类名
{
访问限定符:
属性1;---》成员变量
属性2;
。。。
行为1;---》成员函数
行为2;
。。。。
};--->数据类型--》不占内存
访问限定符:用来约束成员的访问权限的
有三种访问限定符:public protected private
public(公有访问限定符):可以被类中的成员函数、子类的函数和其友元 函数访问,也可以被该类的对象访问。
protected(保护访问限定符):可以被类中的成员函数、子类的函数和其 友元函数访问,但不能被该类的对象访问
private(私有访问限定符):只能由该类中的成员函数和其友元函数访问, 不能被子类函数访问,也不能被该类的对象访问
类和结构体的区别?
1 结构体中一般只有成员变量,没有成员函数,并且成员变量默认是公有的
2 类中一般既有成员变量,又有成员函数,在成员变量和成员函数前都有访 问限定符约束,如果没有写访问限定符,则该成员默认是私有的(private )
3 对象--->c++一切皆对象
定义:是类的实例化
如何定义一个对象?(class) 类名 对象名;
对象如何访问它的成员?用“.”
对象指针如何访问它指向的对象成员?用“->”
对象的引用如何访问对象的成员?用“.”
注意:类中的成员函数的定义和声明可以一起写,也可分开写,若分开写,在类外定 义成员函数时需要加上类名这个作用域
4 this指针
说明:当程序中的一个类定义了多个对象,多个对象都调用类中的同一个成员函数时 ,怎么区分这个成员函数作用的是哪个对象?C++提供了this指针,this指 针在哪?操作的就是哪个对象。
this指针:指代当前对象的首地址
谁是当前对象?谁调用函数谁就是当前对象
this指针的使用场合:
1 在类的非静态成员函数中想返回类对象本身的时候,
直接使用return *this ;
2 当类中的成员函数的入参和成员变量名相同时,使用this区分成员变量
this->y=y;
5 构造函数(是类中的成员函数)
作用:给类对象的成员变量初始化
什么时候会调用构造函数?当用类创建对象时,系统会自动调用构造函数去初始化
类对象的成员变量,而且只会被调用一次。
特点:1 函数名与类名相同
2 无返回值
3 构造函数是类中的一个成员函数
4 如果一个类中没有显示定义构造函数,则系统会提供一个默认的构造函数, 默认构造函数无参,函数为空
5 如果自定义了构造函数,系统将不会调用默认的构造函数,而只会调用自定 义的构造函数
6 构造函数无需用户主动调用,在创建对象的时候,系统会自动调用构造函数 ,而且只会调用一次
7 构造函数可以重载
8 构造函数可以用初始化列表的方式对成员变量进行初始化,或者通过构造函 数函数体赋值方式初始化
9 构造函数如果定义成非公有,则该类无法创建对象
10 构造函数没有this指针,因为构造函数才是创建对象的,还未创建对象就 不会有对象的地址
5.1普通构造函数
无参构造函数
有参构造函数
有默认参数的构造函数
5.2默认构造函数
如果类中没有显示定义一个构造函数,编译器会自动提供一个默认的构造函 数(无参)
5.3限制构造函数
构造函数非公有,就叫限制构造函数
如果类中有限制构造函数,该类将无法实例化对象
5.4拷贝构造函数
作用:用一个已经存在的对象给新建对象初始化
什么时候调用拷贝构造函数?当用一个已经存在的对象去初始化新定义的对象时,系统会自动调用拷贝构造函数。
5.4.1默认拷贝构造函数
如果类中没有显示定义拷贝构造函数,那么编译器会给该类提供一个默认的 拷贝构造函数
5.4.2自定义拷贝构造函数-->demo(demo &obj)
特点:1 如果没有自定义拷贝构造函数,系统会使用默认的拷贝构造函数
2 如果自定了拷贝构造函数,系统就会使用自定义的拷贝构造函数
3 没有返回值,函数名与类名相同,函数一般只有一个入参,而且
入参必须是对象的引用(如果有多个入参,那么其他参数只能是 默认参数)
5.5深拷贝&浅拷贝
浅拷贝:不复制数据,只复制指向数据的指针,因此多个指针指向同一份数 据
深拷贝:会复制数据,每个指针指向独立的空间
6对象的大小测试
总结:1类中既有成员函数又有成员变量,那么该类对象的大小=所有成员变量大小之 和(考虑字节对齐)
2 类中只有成员函数,没有成员变量,那么该类对象的大小=1
7 析构函数
作用:在对象的生命周期结束时,释放对象占用的内存资源
特点:1 析构函数是类中的成员函数
2 函数名与类名相同,函数名前加~
3 没有入参,没有返回值
4 有默认的析构函数,如果没有自定义析构函数,就会调用默认的析构函数
5 如果有自定义的析构函数,将只会调用自定义的析构函数
6 不需要用户主动调用析构函数,在对象生命周期结束时,系统会自动调用析 构函数
7 用户可以主动调用析构函数,但此时只是执行函数体,不会释放内存,只有 当对象的生命周期结束时,才会释放内存(建议不要显示调用析构函数)
8 如果对象在栈中存放,先构造的后析构
9 如果对象在堆中存放,delete时调用析构函数
10如果构造函数中或其他函数中使用了new申请了空间,就需要在析构函数 中用delete将其释放
day2作业:
1 练习今日所有课堂代码
2 测试对象的大小(1类中既有成员函数又有成员变量 2 类中只有成员函数)
3 预习析构函数 友元 运算符重载