c++this指针与explicit
2022/1/28 14:04:53
本文主要是介绍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
这篇关于c++this指针与explicit的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享