C++this指针详情
还是Stock
股票这个类,假设我们要实现一个方法,比较一下当前股票和传入的股票, 返回价格高的那个股票。在我们实现的时候,会遇到一点问题。
const Stock & Stock::topVal(const Stock &s) const { if (s.total_val > total_val) { return s; }else { return ????; } }
这段代码当中有一些问题,我们一个一个来说。
首先说函数签名,前面都没有问题,问题出现在签名末尾的const
。这是我们第一次在函数的末尾看到const
,这个用法只能用在类或结构体的成员函数中,而不能用在普通函数里。
它表示这个函数不会修改任何成员变量的值,末尾加上const
的函数称为常量成员函数。
常量函数有一些特殊的性质:
能被任何函数调用,只能调用常量函数
能被任何对象调用,但const
对象只能调用const
函数
性质不是非常复杂,但有些像是绕口令,需要从const
常量的性质角度出发理解一下。
代码当中第二个问题就是一堆问号的地方,这里我们想要return
当前对象,但是我们不知道如何表示。为了解决这个问题,C++当中创建了一个特殊的指针叫做this
,它用来指向调用成员函数的对象,也就是当前对象。
所以有了this之后,这段代码可以写成:
const Stock & Stock::topVal(const Stock &s) const { if (s.total_val > total_val) { return s; }else { return *this } }
另外,this
指针也可以拿来访问当前对象当中的成员变量,比如我们想要访问当前的total_val
,可以写成this->total_val
,我们直接用total_val
本质上是一样的,是编译器替我们做了优化。
到此这篇关于C++this指针详情的文章就介绍到这了,更多相关C++this指针内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C++ this指针和空指针的具体使用
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码那么问题是:这-块代码是如何区分那个对象调用自己的呢? C++通过提供特殊的对象指针,this指针,解决上述问题.this指针指向被调用的成员函数所属的对象 this指针是隐含每一个非静态成员函数内的-种指针 this指针不需要定义,直接使用即可 this指针的用途: 当形参和成员变量同名时,可用this指针来区分 在类的非静态成员函数中返回对象本身,可使用return this 一.this指针 1 this指针解
-
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++静态成员函数和this指针详解
目录 静态成员 1.静态成员变量 2.静态成员函数 成员变量和成员函数分开存储 this 指针 空指针访问成员函数 总结 静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为: 1.静态成员变量 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 示例: #include<iostream> using namespace std; class Person { public: static int m; // 所有对象共享同一份数据 }
-
带你了解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++ const和指针详情
目录 1.指针和const 1.1 指向常量的指针 1.2 const指针 1.3 指针和内容都不可变 1.指针和const 我们知道const关键字修饰的是不可变量,将它和指针一起使用,会有很多微妙的地方. 关于使用const来修饰指针,有两种不同的方式.第一种是让指针指向一个常量对象,这样可以防止使用该指针进行修改指向的值.第二种则是将指针本身声明为常量,可以防止改变指针指向的位置.下面我们来看下细节. 1.1 指向常量的指针 首先是指向常量的指针,含义是指针的类型是一个常量类型.所以写成:
-
C++this指针详情
还是Stock股票这个类,假设我们要实现一个方法,比较一下当前股票和传入的股票, 返回价格高的那个股票.在我们实现的时候,会遇到一点问题. const Stock & Stock::topVal(const Stock &s) const { if (s.total_val > total_val) { return s; }else { return ????; } } 这段代码当中有一些问题,我们一个一个来说. 首先说函数签
-
Linux的文件描述符、文件指针、索引节点详情
目录 Linux--文件描述符.文件指针.索引节点 一.Linux -- 文件描述符 1.文件描述符 Fd 2.系统级的文件描述符表 3.文件系统的inode表 二.文件指针 *FILE 三.索引节点 Inode 1.Inode特殊作用 四.拓展 1.磁盘结构 Linux--文件描述符.文件指针.索引节点 一.Linux -- 文件描述符 1.文件描述符 Fd 当进程打开文件或创建新文件时,内核会返回一个文件描述符(非负整数),用来指向被打开的文件,所有执行I/O操作的系统调用(read.wri
-
C++数组指针和二维数组详情
目录 1.二维数组 2.数组指针和二维数组 1.二维数组 对于一维数组,int arr[10]; arr是数组名,也是首元素的地址,&arr是数组的地址,那么对于二维数组 int arr[3][3], arr可以肯定是数组名,那么他是不是首元素的地址呢?如果是首元素的地址,那么arr[0]又该是什么呢?通过以下代码进行验证: #include <stdio.h> #define ROW 3 #define COLUMN 3 int main() { int arr[ROW][COLUM
-
C++智能指针实例详解
本文通过实例详细阐述了C++关于智能指针的概念及用法,有助于读者加深对智能指针的理解.详情如下: 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_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对象拥
-
详情解析TCP与UDP传输协议
目录 一.什么是 socket ? 二.Socket 编程的重要概念 ① IP 地址 ② TCP/IP 端口 ③ 协议 三.socket 编程的 API 接口 ① Linux 下的 socket API 接口 ② windows 下的 socket API 接口 ③ TCP.UDP 通信的 socket 编程流程图 四.socket 的应用实例 ① 基于 TCP 的本地客户端.服务端信息交互实例 ② 基于 UDP 的本地客户端.服务端信息交互实例 一.什么是 socket ? Socket 的英
-
C/C++内存管理详情
目录 C/C++内存管理 1. C/C++内存分布 2. C语言中动态内存管理方式 2.1 malloc/calloc/realloc和free 3. C++内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4. operator new与operator delete函数 5. new和delete的实现原理 5.1.new 5.2.delete 5.3.new 数组 5.4.delete 数组 C/C++内存管理 内存管理是C++最令人切齿痛
-
C++ 轻量级对象JSON序列化实现详情
目录 1.设计思路 2.匹配基本类型的Unmarshal模板 3.匹配stl容器/其他第三方类库的Unmarshal模板 4.匹配自定义struct/class的Unmarshal模板 5.测试 背景: 在项目里经常遇到对象和json字符串的相互转换这类问题,在大多数程序里,一般这个问题都比较有比较好的解决方法,往往一个函数搞定.但是到了c++这边却需要我们手撸json库一个一个字段初始化/序列化.如果这时候有一个函数 可以一行代码 unmarshal /marshal 对象岂不是很方便?本文以
-
C++编程语言实现单链表详情
目录 一.单链表简单介绍 二.下面我们先实现单链表的初始化. 三.实现单链表的插入与删除数据 一.单链表简单介绍 首先,我们再回顾一下线性表的两种存储方式--顺序存储与链式存储 上图左边为顺序存储,右边为链式存储 之前我们利用数组来实现顺序表,对于顺序表的优点缺点,总结来说就是,查找方便,增删复杂. 线性表之顺序存储的优缺点 而链表特点可以说恰恰相反,增删方便,查找复杂. 今天实现的是链表中最简单的一种--单链表(每个结点中只含有一个指针域) 对于链表我们只知道它每个结点的存储的物理地址是不连续
随机推荐
- AngularJS之自定义服务详解(factory、service、provider)
- 理解Javascript_12_执行模型浅析
- sql server 2008 用户 NT AUTHORITY\IUSR 登录失败的解决方法
- 一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
- Extjs4中的分页应用结合前后台
- JS日程管理插件FullCalendar简单实例
- Windows系统下nodejs、npm、express的下载和安装教程详解
- 浅谈virtual、abstract方法和静态方法、静态变量理解
- asp.net获取SQL所有数据库名、所有表名、所有字段名
- Android 使用 ViewPager循环广告位的实现
- C#解析JSON实例
- 平衡二叉树的实现实例
- 如何取回已忘记的密码?
- ASP页面随机添加字符实现防复制的代码
- 基于JQuery的抓取博客园首页RSS的代码
- node.js中的http.response.end方法使用说明
- Linux中利用Vim对文件进行密码保护的方法详解
- PHP模块化安装教程
- 利用原生js实现html5小游戏之打砖块(附源码)
- 详解PHP序列化和反序列化原理