this指针
-
避免形参名和数据成员同名,通指一个类所有对象的地址,是一个值
-
充当函数返回值,返回对象自身,用*this表示对象本身
-
静态成员函数中不能使用this指针,因为函数调用不需要对象,没有对象时this指针指向未知
-
类外无this指针
class GG
{
public:
//构造函数中解决同名问题: 1.用初始化参数列表 2.用类名限定的方式去访问
GG(string name, int age) :name(name), age(age) {}
//报错:普通成员函数不存在初始化参数列表
void initData(string name, int age)
{
//1.类名限定 帮助计算机去识别 2.this指针标识 对象的地址用->访问
GG::name = name;
this->age = age;
}
void print()
{
cout << this->name << " " << this->age << endl;
}
void printThis() //哪个对象调用这个函数this就代表哪个对象的地址
{
cout << this << endl;
}
GG& returnGG()
{
return *this; //对象的地址是this,*this是对象本身
}
void printGG2(GG& gg){} //void printGG2(GG& gg=*this){} 报错:不能缺省
static void printStatic()
{
//报错:this只能用于非静态成员函数内部
cout << this->name << " " << this->age << endl;
GG gg("GG", 19); //构建对象或者传入对象的方式
cout << gg.name << "\t" << gg.age << endl;
}
protected:
string name;
int age;
};
int main()
{
GG gg("大白", 28);
gg.print();
gg.initData("大白", 38);
gg.print();
cout << &gg << endl;
gg.printThis();
GG boy("大白", 32);
cout << &boy << endl;
boy.printThis();
//套娃 gg.returnGG()==gg
gg.returnGG().returnGG().returnGG().returnGG().returnGG().returnGG().print();
//报错:类外无this指针
gg.printGG2(*this);
GG::printStatic(); //调用不需要对象
return 0;
}
/*输出*/
大白 28
大白 38
007DFEA0
007DFEA0
大白 32
007DFE78
007DFE78
大白 38
GG 19
explicit(修饰词)
-
explicit只能用来修饰构造函数,不让隐式转换构造,只能用显示调用的方式
-
没有隐式转换后,不能把数据转换为对象
class MM
{
public:
explicit MM(int age) :age(age) {} //用explicit说明即可
void print()
{
cout << age << endl;
}
protected:
int age;
};
int main()
{
//MM mm = 12; 构造对象可以直接用=赋值,也是调用构造函数过程,explicit限制这种隐式转换
//MM temp = 1.33; 写成小数也能用,自动把1.33隐式转换为整型1,从而构造对象
MM temp(12); //显示调用
temp.print();
}
/*输出*/
1