本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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++就不会再给我们创建默认构造函数,也就是不带参数的构造函数(或者参数带有默认值),所以如果定义变量不带参数就会报错
可以定义多个构造函数,所以可以自己定义一个默认构造函数。