【8】学习C++之this指针
在学习类的时候,我们可以考虑到一种情况:
class Array
{
public:
Array(int len);
~Array();
void setLen(int len)
{
len=len;//此时,左边的len是形参的len,右边的是成员变量的len,这部操作相当于把里面什么都没有的成员变量赋值给形参
};
int getLen()
{
return len;
};
void printInfo()
{
cout<<"len = "<<len;
}; private:
int len;
}
所以这样写是错误的,当然我们可以把其中一个len修改一下,例如可以修改成m_len。
当然肯定会有一些人头铁,不想换变量的名字,所以这时候就需要this指针登场:
class Array
{
public:
Array(int len)
{
this->len=len;
};
~Array();
void setLen(int len)
{
this->len=len;
};
int getLen()
{
renturn len;
};
void printInfo()
{
cout<<"len = "<<len;
}; private:
int len;
}
在这里this指针完美的解决了这个问题,这是因为this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。
this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。
其中this指针有几点注意事项:
- this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
- this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。
- 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用。
一个关于this指针的骚气用法:
#include <iostream>
using namespace std; class Array
{
public:
Array(int len)
{
this->len = len;
};
~Array() {};
Array setLen(int len)
{
this->len = len;
return *this;
};
int getLen()
{
return len;
};
Array printInfo()
{
cout << "len = " << len << endl;
return *this;
}; private:
int len;
};
int main()
{
Array arr1();
arr1.printInfo().setLen().printInfo();//这种连续的点的使用,觉得超级骚气
cout << "len = " << arr1.getLen() << endl;
return ;
}
输出结果为:
len = 10
len = 5
len = 10
第一个和第三个printInfo输出的是10,第二个printInfo输出的则是5,正常来讲,第三个printInfo应该输出是5,这是因为在printInfo最后返回的并不是arr1,而是另外一个对象,所以我可以使用引用来避免这种情况。
#include <iostream> using namespace std; class Array
{
public:
Array(int len)
{
this->len = len;
};
~Array() {};
Array setLen(int len)
{
this->len = len;
return *this;
};
int getLen()
{
return len;
};
Array& printInfo()//在这里加了一个引用符号,传递出去的是arr1的引用
{
cout << "len = " << len << endl;
return *this;
}; private:
int len;
};
int main()
{
Array arr1();
arr1.printInfo().setLen().printInfo();
cout << "len = " << arr1.getLen() << endl;
return ;
}
这样输出就会变成正常。但是为什么在第一种不带引用的写法中,第二个printInfo输出却是正常的,这个我也不太清楚,我在之后的学习中如果发现了原因的话,会对本篇随笔进行更改,如果有哪位大佬懂的话,希望留言交流下。
【8】学习C++之this指针的更多相关文章
- iOS学习09C语言函数指针
本次主要学习和理解函数指针 1.函数指针 void printValue(int number) { printf("number = %d\n", number); } int ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- C++学习笔记之this指针
为了说明这个问题,首先来建立一个简单的类 #include <iostream> #include <string> using namespace std; class Bo ...
- Qt 智能指针学习(7种指针)
Qt 智能指针学习 转载自:http://blog.csdn.net/dbzhang800/article/details/6403285 从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ ...
- C++学习笔记: 智能指针
c++ 智能指针学习新的 class Simple { public: Simple() { number = param; std::cout << "Simple: &quo ...
- C++学习之普通函数指针与成员函数指针
函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...
- 我的c++学习(11)数组和指针
使用数组显示斐波那契数列 #include "stdafx.h" using namespace std; #include<iostream> int _tmain( ...
- C语言学习004:数组与指针
在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的
- iOS学习之C语言指针
访问数据的两种方式: 1.直接访问: 2.间接访问:先找到内存地址,根据地址访问存储单元.(内存地址 被称为指针) 定义指针变量: 类型修饰符 *指针变量名 = NULL; NULL表示空指针,相当 ...
随机推荐
- 第一部分day03-元组、字典、字符串
-----元组-----元组查询 a = (1,2,3,4) print(a[1:2]) #(2,) 购物车练习(列表方法练习) product_list=[ ['Mac',9000], ['kind ...
- 嵌入式linux开发uboot启动过程源码分析(一)
一.uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段.BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言 ...
- centos curl安装
二.安装 1.解压 下载到的压缩包为curl-7.51.0.tar.gz,使用命令 tar -zxvf curl-7.51.0.tar.gz 解压. 2.进入解压出的目录curl-7.51.0, ...
- 第09节-使用BTStack编写蓝牙程序
Bluetooth LE Exploer(微软提供的)可以读取BLE蓝牙设备,可以读写它的值.本篇博客将使用BTStack写出一个精简版的Bluetooth LE Exploer. 涉及文件: bts ...
- nginx 请求文件 进行用户认证/鉴权: internal(限制为内部调用)
在进行WEB开发时, 必然会遇到向用户返回文件的场景(如图片, 文档等等), 当返回的文件较小时, 我们可以直接通过接口以数据流的形式向前台返回, 因为文件较小, 因此也不会太过于影响响应速度及服务器 ...
- springtask 基本使用和 cron 表达式
springtask 的基本使用和 cron 表达式 spring 容器依赖 <dependency> <groupId>org.springframework</gro ...
- echarts x轴标签文字过多导致显示不全
原文电梯:https://blog.csdn.net/kebi007/article/details/68488694 echarts x轴标签文字过多导致显示不全 如图: 解决办法1:xAxis.a ...
- emacs第二天
setq 和setq-default的区别 cursor-type是一个buffer local 变量 在每一份buffer中都有一份值 如果变量是buffer local 里面的变量 setq-de ...
- 剑指offer:机器人的运动范围(回溯法DFS)
题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...
- Shell脚本之二 变量、字符串和数组
一.Shell 变量 1.1 定义变量 定义变量时,变量名不加美元符号($),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的 ...