智能家居项目实训笔记(华清远见)(三)

构造函数

特殊的成员函数,名字与类名相同,无返回值,创建类对象时自动调用,对象生命周期内只能调用一次。保证每个数据成员都有一个合适的初试值。可以重载

如果未写构造函数,则编译器会自动添加一个无参的构造函数。

创建对象时,给构造函数传递参数:

Student::Student(const string &name = "",int age = 0, int score = 0){

}

Student other("xiaoming",10,100);//对象给构造函数传参,适用于函数重载,若不带参数,则会寻找无参的构造函数。

不能用const修饰,不能是虚函数。

初始化成员

智能家居项目实训笔记(华清远见)(三)_第1张图片

:name(name),左边的是成员变量名,右边的是参数名
继承理论上是不继承构造函数的,想要使用基类的构造函数,就得在初始化列表调用。

智能家居项目实训笔记(华清远见)(三)_第2张图片

在堆区创建对象

Student *pstu = new Student(“abc”,20,100);

c_str()是string类的成员函数,返回字符串的首地址。

构造函数调用顺序

  • 基类构造函数
  • 对象成员构造函数
  • 派生类本身的构造函数

构造函数调用顺序相反

析构函数

特殊成员函数,名字和类名相似 ~类命,没有返回值没有参数,对象销毁的时候自动调用。只能调用一次,保证每个对象的资源都能释放掉,一个类只有一个析构函数,无重载。

static

静态成员变量

如果需要所有的对象共享一个变量,那么这个类的成员变量应该使用static修饰。

  • 定义时用static

  • 必须在类外初始化

    int Test::b = 10;

  • 可以通过类名直接访问

  • 不可以跨文件使用,全局变量可以跨文件使用

静态成员函数

一切不需要创建对象就可以有确定行为的函数都应该设计成静态的。比如说排序的算法,可以直接使用,不需要对象。

静态成员函数直接是类调用,所以没有this指针,而非静态成员函数是对象创建才调用,所以存在this指针。

总结

静态的属于类,只要类存在静态就存在,静态可以通过类直接调用

非静态属于对象,必须在有对象的时候,才可以调用非静态的

静态的是所有对象共享的,非静态每个对象相互之间独立

静态部分只能直接访问静态部分,非静态部分可以访问所有部分

智能家居项目实训笔记(华清远见)(三)_第3张图片

虚函数

父类和子类有同名成员函数时,用父类指针指向子类对象,调用的是父类的成员函数,若父类函数为虚函数,则调用子类成员函数

但是构成多态还有两个条件:

  1. 调用函数的对象必须是指针或者引用。
  2. 被调用的函数必须是虚函数,且完成了虚函数的重写。

const

常成员变量

用const修饰,只能在构造函数的参数列表中初始化

智能家居项目实训笔记(华清远见)(三)_第4张图片

常成员函数

用const修饰,常成员函数和非常成员函数是重载模式。常成员函数不能修改成员变量的值。但可以访问。

void showStudent() const;//声明

void showStudent() const{

}//实现

常对象

**一个对象被const修饰,他就不能调用非常成员函数,只能调用常成员函数。**因为编译器不知道成员函数是否有修改变量的情况,所以只判断成员函数是否有修改变量的权限(是否有const修饰)。

你可能感兴趣的:(实训笔记)