C++ 中this指针的用途详解
目录
- 1.区分形参和变量同名时:
- 2.return *this返回函数本身
- 总结
先说结论:
1.形参和变量同名时,可用this指针来区分
2.在类的非静态成员函数中返回本身,可用return *this
1.区分形参和变量同名时:
#include <iostream> using namespace std; class Person { public: Person(int age) { age = age; } int age; }; void test01() { Person p1(18); cout << "年龄为: " << p1.age << endl; } int main() { test01(); system("pause"); return 0; }
上述代码运行结果多少呢? 答案是-858993460 当然这个答案毫无意义
为什么呢 将上述代码中的age选中 然后会有下面这种情况 相信大家知道什么意思 就是编译器不会像人脑一样将左边的age看成类的属性age,所以就导致编译器认为上述3个age是一回事,所以再编译器中相当于Person类的属性age没有赋值,所以进行输出的时候就会用0xCCCCCCCC来进行填充,就有了输出是-858993460的答案
那怎么解决上述问题呢?如下图:
在第一个age前面加上this,什么意思呢看看官方解释:
this指针指向被调用的成员函数所属的对象!
大白话来讲就是谁调用这个类,this就指向谁,上述这个this指向的就是p1
当然这种错误的解决方法还有一种最简单的:在类中起属性名字的时候,尽量别和形参名取一样就好了
2.return *this返回函数本身
#include <iostream> using namespace std; class Person { public: Person(int age) { m_age = age; } Person& PersonAddAge(Person &p) { this->m_age += p.m_age; return *this; } int m_age; }; void test02() { Person p1(18); Person p2(18); p1.PersonAddAge(p2).PersonAddAge(p2).PersonAddAge(p2); cout << p1.m_age << endl; } int main() { test02(); system("pause"); return 0; }
下面的块代码中:这块代码中有两个点
1.返回值类型使用了Person的引用
2.return *this
Person& PersonAddAge(Person &p) { this->m_age += p.m_age; return *this; }
A1:为什么要使用Person&的返回值
return *this就是返回函数本身,但是得注意返回值类型,记得做引用传递!!!
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
相关推荐
-
深入理解C++的对象模型
何为C++对象模型? C++对象模型可以概括为以下2部分: 1. 语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 引言 现在有一个Point类,声明如下: class Point { public: Point(float xval); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream& print(ostream &os) const; fl
-
C++ 中的this指针详解及实例
C++ this 指针详解 学习 C++ 的指针既简单又有趣.通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的. 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. this指针是类的一个自动生成.自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象. 全局仅有一个this指针,当一个对
-
C++ 多重继承和虚拟继承对象模型、效率分析
一.多态 C++多态通过继承和动态绑定实现.继承是一种代码或者功能的传承共享,从语言的角度它是外在的.形式上的,极易理解.而动态绑定则是从语言的底层实现保证了多态的发生--在运行期根据基类指针或者引用指向的真实对象类型确定调用的虚函数功能!通过带有虚函数的单一继承我们可以清楚的理解继承的概念.对象模型的分布机制以及动态绑定的发生,即可以完全彻底地理解多态的思想.为了支持多态,语言实现必须在时间和空间上付出额外的代价(毕竟没有免费的晚餐,更何况编译器是毫无感情): 1.类实现时增加了virtual
-
带你了解C++this指针的用法及其深究
目录 前言 一.this指针是个什么东东,重要吗? 二.案例理解 主要的用途 总结 前言 今天,码神像一个新车手一样,尝试着用模板来更新一下,不要建议哦,毕竟没有放弃爱情的拓海也不是真正的车神,哈哈,发车了 一.this指针是个什么东东,重要吗? 首先,我以码神的名义起誓,this指针绝对重要,尤其是对于c++这个面向对象编程的语言来说! 有的码手可能要说了:你说重要就重要?那我还说不重要呢? 这个么,空口无凭,我现在来举一个例子: 我们知道对于一个类来说,要有很多工作要做,其中类的成员函数可以
-
C++对象模型和this指针详解
目录 对象模型 一. 二. 三. 四. 五. this指针 一. 二. 总结 对象模型 成员变量和成员函数分开存储 一. 只有非静态成员变量才属于类的对象上 空对象占用字节为1 class Person { }; void test01() { Person p; cout << "size of = " << sizeof(p) << endl; } int main() { test01(); system("pause");
-
C++ 中this指针的用途详解
目录 1.区分形参和变量同名时: 2.return *this返回函数本身 总结 先说结论: 1.形参和变量同名时,可用this指针来区分 2.在类的非静态成员函数中返回本身,可用return *this 1.区分形参和变量同名时: #include <iostream> using namespace std; class Person { public: Person(int age) { age = age; } int age; }; void test01() { Person p1
-
C语言中二级指针的实例详解
C语言中二级指针的实例详解 用图说明 示例代码: #include <stdio.h> int main(int argc, const char * argv[]) { // int a = 5; int *p1 = &a; //-打印地址-----地址相同--------------- printf("&a = %p\n", &a);// printf("p1 = %p\n", p1);// int **p2 = &p
-
C++中auto_ptr智能指针的用法详解
智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限.本文总结的8个问题足以涵盖auto_ptr的大部分内容. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有
-
C++中回调函数及函数指针的实例详解
C++中回调函数及函数指针的实例详解 如何获取到类中函数指针 实现代码: //A类与B类的定义 class A { public: void Test() { cout << "A::Test()" << endl; } }; class B : public A { public: void Test() { cout << "B::Test()" << endl; } }; //定义类的成员函数指针 typedef
-
C语言中枚举与指针的实例详解
C语言中枚举与指针的实例详解 总结一下, 定义枚举,用typedef enum关键字, 比如 typedef enum{Red,Green,Blue} Color3; 枚举到数值的转换,如果没有指定代表数值就是从0开始算, 比如 Color3 c=Red; printf("%d",c);会显示0, 除非指定 如typedef enum{Red=3,Green=5,Blue=10} Color3; 关于类型指针的定义, 定义的时候在变量名左边加*代表此变量只是一个空指针而已, 若需要赋
-
C语言中 值传递和指针传递实例详解
C语言中 值传递和指针传递实例详解 在C语言中,函数的参数和返回值的传递方式有两种:值传递和指针传递. 值传递和指针传递初学者总会有一种朦胧的感觉,所以建议把指针传递的概念摸透,才能熟练应用. 值传递示例:x其实是n的一份临时拷贝,所以并不会改变n的值. #include <stdio.h> #include <windows.h> void Fun(int x) { x = 1; } int main() { int n = 2; Fun(n); printf("%d\
-
Tomcat中catalina.out 和 catalina.log的区别和用途详解
目录 catalina.out cataliana.{yyyy-MM-dd}.log和localhost.{yyyy-MM-dd}.log 总结 catalina.out catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stderr会重定向到这里.所以我们在应用里使用System.out打印的东西都会到这里来.另外,如果我们在应用里使用其他的日志框架,配置了向Console输出的,
-
Java语言中的内存泄露代码详解
Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo
-
C++ STL 四种智能指针的用法详解
0.前言 C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr.unique_ptr.shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr.虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述.shared_ptr 和 weak_ptr 则是
-
C++中浅拷贝与深拷贝的详解及其作用介绍
目录 概述 对象的赋值 对象的复制 对象复制的用途 建立一个新对象 函数的参数为类对象 函数的返回值为类对象 浅拷贝 深拷贝 概述 浅拷贝 (shallow copy) 只是对指针的拷贝, 拷贝够两个指针指向同一个内存空间. 深拷贝 (deep copy) 不但对指针进行拷贝, 而且对指针指向的内容进行拷贝. 经过深拷贝后的指针是指向两个不同地址的指针. 对象的赋值 同类对象之间可以相互赋值. 对象赋值的一般形式: 对象名1 = 对象名2; 举个栗子: int main() { Time t1(
随机推荐
- YII动态模型(动态表名)支持分析
- Javascript生成json的函数代码(可以用php的json_decode解码)
- 服务器防arp欺骗批处理 ARP双绑脚本 无临时文件(LZ-Myst版)
- java 数据结构中栈和队列的实例详解
- Asp.net开发常用的51个非常实用的代码
- Android中通过Notification&NotificationManager实现消息通知
- SQL 四种连接-左外连接、右外连接、内连接、全连接详解
- 跟我学Java Swing之游戏设计(1)
- C++ 中字符串操作--宽窄字符转换的实例详解
- mysql 5.7.16 winx64安装配置方法图文教程
- Lost connection to MySQL server at 'reading authorization packet', system error: 0
- 3分钟快速搭建nodejs本地服务器方法运行测试html/js
- 一个新的CSS菜单代码
- Node.js中流(stream)的使用方法示例
- jquery图片轮播特效代码分享
- mysql日期date型和int型互换的方法
- Three.js利用顶点绘制立方体的方法详解
- apache You don't have permission to access /test.php on this server解决方法
- Java中常见的陷阱题及答案
- Android view更改背景资源与padding消失的问题解决办法