c++this指针与explicit

​​​​​​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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值