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++ 多重继承和虚拟继承对象模型、效率分析
一.多态 C++多态通过继承和动态绑定实现.继承是一种代码或者功能的传承共享,从语言的角度它是外在的.形式上的,极易理解.而动态绑定则是从语言的底层实现保证了多态的发生--在运行期根据基类指针或者引用指向的真实对象类型确定调用的虚函数功能!通过带有虚函数的单一继承我们可以清楚的理解继承的概念.对象模型的分布机制以及动态绑定的发生,即可以完全彻底地理解多态的思想.为了支持多态,语言实现必须在时间和空间上付出额外的代价(毕竟没有免费的晚餐,更何况编译器是毫无感情): 1.类实现时增加了virtual
-
C++对象模型和this指针详解
目录 对象模型 一. 二. 三. 四. 五. this指针 一. 二. 总结 对象模型 成员变量和成员函数分开存储 一. 只有非静态成员变量才属于类的对象上 空对象占用字节为1 class Person { }; void test01() { Person p; cout << "size of = " << sizeof(p) << endl; } int main() { test01(); system("pause");
-
C++ 中的this指针详解及实例
C++ this 指针详解 学习 C++ 的指针既简单又有趣.通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的. 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. this指针是类的一个自动生成.自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象. 全局仅有一个this指针,当一个对
-
带你了解C++this指针的用法及其深究
目录 前言 一.this指针是个什么东东,重要吗? 二.案例理解 主要的用途 总结 前言 今天,码神像一个新车手一样,尝试着用模板来更新一下,不要建议哦,毕竟没有放弃爱情的拓海也不是真正的车神,哈哈,发车了 一.this指针是个什么东东,重要吗? 首先,我以码神的名义起誓,this指针绝对重要,尤其是对于c++这个面向对象编程的语言来说! 有的码手可能要说了:你说重要就重要?那我还说不重要呢? 这个么,空口无凭,我现在来举一个例子: 我们知道对于一个类来说,要有很多工作要做,其中类的成员函数可以
-
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(
随机推荐
- 正则表达式匹配任意字符(包括换行符)的写法
- 初学JavaScript第二章
- 详解vue 中使用 AJAX获取数据的方法
- JS鼠标拖拽实例分析
- Vista系统下Bt和迅雷下载慢的解决方案第1/2页
- asp.net中Datalist使用数字分页的实现方法
- javascript 删除select中的所有option的实例
- 基于JS实现类似支付宝支付密码输入框
- bootstrap导航、选项卡实现代码
- javascript数组去重常用方法实例分析
- 使两个iframe的高度与内容自适应,且相等
- C#实现windows form拷贝内容到剪贴板的方法
- JavaScript基本类型值-Undefined、Null、Boolean
- sqlserver 比较两个表的列
- jQuery入门 构造函数
- C++中对象的赋值与复制操作详细解析
- 简述Matlab中size()函数的用法
- php中函数前加&符号的作用分解
- CentOS环境中MySQL修改root密码方法
- vue将对象新增的属性添加到检测序列的方法