C++快速入门5

188 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

this指针

this 是 C++ 中的一个关键字,也是一个 const 指针

在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。

友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。

成员函数的调用实际会由stu.print();变成print(&stu);

struct student
{
    string name;
    double score;
    void print(){
        cout << this->name << ' ' << score << endl;
    }
};

通过一个例子看下它的作用

struct student
{
    string name;
    double score;
    void setName(string name){
        this->name = name;
    }
};

本例中成员函数的参数和成员变量重名,只能通过 this 区分。如果直接写name=name,就是给形参name赋值,而不是给成员变量name赋值。而写作this -> name = name;后,=左边的name就是成员变量,右边的name就是形参。

this 虽然用在类的内部,但是只有在对象被创建以后才会给 this 赋值,并且这个赋值的过程是编译器自动完成的,不需要用户干预,用户也不能显式地给 this 赋值。

this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。
this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。

访问控制

#include<iostream>

using namespace std;

struct student
{
    string name;
    double score;
    void print(){
        cout << name << ' ' << score << endl;
    }
};

int main(){
    student s1;
    s1.name = "aa";
    return 0;
}

这里这样写没问题,但如果换成class就出错了

原因前面说过,class成员变量默认是private私有的,struct默认是public公有的

为了数据的安全性一般这样定义:

class student
{
private:
    string name;
    double score;
public:
    void print(){
        cout << name << ' ' << score << endl;
    }
    string getName(){
        return name;
    }
    double getScore(){
        return score;
    }
    void setName(string name){
        this->name = name;
    }
    void setScore(double score){
        this->score = score;
    }
};

构造函数

在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)

如果不定义构造函数,C++会生成一个默认的构造函数,内容是空的。

有了构造函数就能方便的初始化了

#include<iostream>

using namespace std;

class student
{
private:
    string name;
    double score;
public:
    student(string name, double score){
        this->name = name;
        this->score = score;
    }
    void print(){
        cout << name << ' ' << score << endl;
    }
    string getName(){
        return name;
    }
    double getScore(){
        return score;
    }
    void setName(string name){
        this->name = name;
    }
    void setScore(double score){
        this->score = score;
    }
};

int main(){
    student s1("aa", 56);
    return 0;
}

这时候有了构造函数,C++就不会再给我们创建默认构造函数,也就是不带参数的构造函数(或者参数带有默认值),所以如果定义变量不带参数就会报错

可以定义多个构造函数,所以可以自己定义一个默认构造函数。