淘先锋技术网

首页 1 2 3 4 5 6 7

一.

先补充一个比较容易遗忘的知识点:同一个类的对象A和B,我先定义A后定义B,那么对象A和对象B的构造函数和析构函数的调用顺序如下:
1.调用A的构造函数
2.调用B的构造函数
···
3.调用B的析构函数
4.调用A的析构函数

其实可以这样理解,想像一下A和B是两个循环体,那么构造函数就像循环体的{,析构函数就像循环体的},那么可以类比内嵌循环的左右大括号匹配顺序来判别调用先后。

二.

特殊对象的生命周期:
1.全局对象的生命周期:在main函数之前构造,在main函数结束或者调用exit函数时结束。
2.局部自动(auto)对象的生命周期:函数调用,建立对象时构造。函数结束时析构。存在的周期相当于调用函数的时长,多次调用就多次构造析构。
3.局部静态(static)对象的生命周期:函数调用时构造,整个程序结束的时候析构,期间不构造也不析构。

三.

对象数组:
构建对象所属的类必须有无参构造函数或者形参皆有缺省值

// 一个小练习:
class Student
{
    private:
        int num;
    public:
        Student(int a = 10):num(a){};
        void display();
};

void Student::display()
{
    cout << num << endl;
}

Student stu[15];

int main()
{
    int i,j;
    int n;
    
    for(i = 1; i <= 5; i++)
    {
        scanf("%d",&n);
        
        Student s(n); //前五个数组元素通过输入的值进行初始化,后面五个不进行操作
        stu[i] = s;
    }
    
    for(i = 1; i <= 10; i++)
    {
        stu[i].display();
    }
    
    return 0;
}
输入:1 2 3 4 5
输出:
1
2
3
4
5
10
10
10
10
10

对象数组的标准定义方式:在定义时初始化。

Student stu[15] = {Student(0),Student(1),Student(2),Student(3),Student(4),Student(5)}; //对对象元素进行初始化

动态创建对象数组:

int main()
{
    Student *p = new Student[15]; //指向对象数组的指针
    p[1] = Student(1);
    p[2] = Student(2);
    p[3] = Student(3);
    p[4] = Student(4);
    p[5] = Student(5);
    
    for(int i = 1; i <= 10; i++)
    {
        p[i].display();
    }
    
    delete []p; //删除释放空间
    
    return 0;
}

关键点:类内必须有无参或者缺省构造函数。

四.

指向对象的指针和this指针

指向对象成员(public)的指针:顾名思义。
定义方法:类型 * 指针名 = &对象.对象成员

指向函数成员(public)的指针:指向类中的函数成员。
定义方法:数据类型名 ( 类名 :: *指针变量名 )( 参数列表 )

#include <iostream>
using namespace std;

class Student
{
    private:
        int num;
    public:
        Student(int a):num(a){};
        void display();
};

void Student::display()
{
    cout << num << endl;
}

int main()
{
    Student stu(10);
    void (Student:: *p)(); //指向成员函数的指针 
    
    p = &Student::display; //获得地址 
    
    (stu.*p)(); //调用成员函数
    
    //相当于下面的语句:
    stu.display();
    
    return 0;
}

this指针:指向类对象的首地址。成员函数通过this指针知道自己当前被哪一个对象所用。
它是一个隐含在成员函数的指针。
比如下面这串代码:

class Student
{
    private:
        int num;
    public:
            ··· 
        void display(); // void display(Student *this)
};

void Student::display() // void Student::display(Student *this)
{
    cout << num << endl; // cout << this -> num << endl;
}

注释处编译器自动处理函数的定义和声明。

注意:1.this指针可以显示使用。2.this指针是const指针,不能修改其值。3.当形参和数据成员同名时,操作时需要在数据成员前加上this指针。this -> x = x