【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 ...
- python测试开发django-73.django视图 CBV 和 FBV
前言 FBV(function base views) 就是在视图里使用函数处理请求,这一般是学django入门的时候开始使用的方式. CBV(class base views) 就是在视图里使用类处 ...
- ZJOI2019赛季回顾
退役了. NOIP2018 day1没什么好说的. day2开考后看完题:这个T3 TM不是DDP吗? 考前刚学过这东西,还没去写过 当时不知道在想什么,胡了T1 60和T2 50分保底之后就去刚T3 ...
- 修改/etc/docker/daemon.json中的log-opts配置发现无效 docker 限制日志大小
https://colobu.com/2018/10/22/no-space-left-on-device-for-docker/ 在/etc/docker/daemon.json中修改或添加log- ...
- Scrapy笔记(1)- 入门篇
Scrapy笔记01- 入门篇 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取(更确切来说, ...
- ESA2GJK1DH1K基础篇: 移植源码中SmartConfig程序到自己的项目
前言: 说明两个地方 1.点击按钮启动SmartConfig的地方 2.最终跳转的地方 说明 这节说明一下,如何把本人源码里面的SmartConfig程序移植到自己的工程 我要把所有的全部拿出来讲,让 ...
- UDF——监测指定点的物理量
Fluent版本:2019 R1 Visual Studio版本:Visual Studio 2013 其他版本应该也是适用的 算例来源于:https://confluence.cornell.edu ...
- udev只能修改Linux 网口名称,无法修改/dev目录下的设备名称
NAME The name to use for a network interface. The name of a device node cannot be changed by udev, o ...
- Log4j之HelloWorld
在编写项目的时候,我们一般都会用到日志记录,方便出错查找原因.首先我们需要了解什么是Log4j 1.使用maven建立工程,在pom.xml中加入如下: <dependency> < ...
- ASP.NET Core使用Docker进行容器化托管和部署
一.课程介绍 人生苦短,我用.NET Core!今天给大家分享一下Asp.Net Core以Docker进行容器化部署托管,本课程并不是完完全全的零基础Docker入门教学,课程知识点难免有没覆盖全面 ...