c++(类) this指针
this指针的相关概念:
this只能在成员函数中使用。全局函数,静态函数都不能使用this。实际上,成员函数默认第一个参数为T* const register this。
为什么this指针不能再静态函数中使用?
大家可以这样理解,静态函数如同静态变量一样,他不属于具体的哪一个对象,静态函数表示了整个类范围意义上的信息,而this指针却实实在在的对应一个对象,
所以this指针当然不能被静态函数使用了,同理,全局函数也一样,我是这样理解的,不知道大家怎样理解,大家可以评论交流下。
(1)this指针是什么时候创建的?
this在成员函数的开始执行前构造的,在成员的执行结束后清除。
(2)this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?
this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。
自从类的函数定义完成后,它就在那儿,不会跑的。
(3)this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数
里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。
this指针的使用:
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,我们可以使用圆点运算符(*this).,箭头运算符this->,另外,我们也可以返回
关于*this的引用,这样我们可以像输入输出流那样进行“级联”操作。
示例如下:
1:(普通)
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class Stu_Info_Mange
{
int sno;
string sname;
int age;
int grade;
public:
Stu_Info_Mange(int s = , string n = "none", int a = , int g = )
{
sno = s;
sname = n;
age = a;
grade = g;
}
void Setsname(std::string sn) //使用this指针进行赋值
{
this->sname = sn;
}
int Setage(int a)
{
this->age = a;
return (*this).age; //使用this指针返回该对象的年龄
}
void show()
{
cout << "the sname is " << this->sname << endl; //显式this指针通过箭头操作符访问
cout << "the sno is " << sno << endl;//隐式使用this指针打印
cout << "the age is " << (*this).age << endl;//显式使用this指针通过远点操作符
cout << "the grade is " << this->grade << endl << endl;
} };
int main()
{
Stu_Info_Mange p1(, "张三", , );
p1.show(); //输出信息
p1.Setage(); //使用this指针修改年龄
p1.Setsname("王五");
p1.show(); //再次输出
return ;
}
2:(使用类)
Stu_Info_Mange.h
#pragma once
#include<string>
using std::string;
class Stu_Info_Mange
{
private:
int sno;
string sname;
int age;
int grade;
public:
Stu_Info_Mange(int s = , string n = "none", int a = , int g = );
void Setsname(string sn) { this->sname = sn; }
int Setage(int a);
void show()const;
~Stu_Info_Mange();
};
Stu_Info_Mange.cpp
#include "stdafx.h"
#include "Stu_Info_Mange.h"
#include<iostream>
#include<string>
using namespace std;
Stu_Info_Mange::Stu_Info_Mange(int s, string n, int a, int g)
{
sno = s;
sname = n;
age = a;
grade = g;
} int Stu_Info_Mange::Setage(int a)
{
this->age = a;
return (*this).age;
} void Stu_Info_Mange::show() const
{
cout << "the sname is " << this->sname << endl;
cout << "the sno is " << sno << endl;
cout << "the age is " << (*this).age << endl;
cout << "the grade is " << this->grade << endl << endl;
} Stu_Info_Mange::~Stu_Info_Mange()
{
}
ConsoleApplication.cpp
#include "stdafx.h"
#include "Stu_Info_Mange.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
Stu_Info_Mange p1(, "张三", , );
p1.show(); //输出信息
p1.Setage(); //使用this指针修改年龄
p1.Setsname("王五");
p1.show(); //再次输出
return ;
}
输出结果:
c++(类) this指针的更多相关文章
- delete 类对象指针的注意事项]
http://blog.csdn.net/infoworld/article/details/45560219 场景:1. C++类有构造和析构函数,析构函数是在类对象被delete时(或局部变量自动 ...
- c++中的类的对象与类的指针
以上内容来自:http://wenku.baidu.com/link?url=haeRBhswlEcqddk48uW8YVMsdFNWsllimn_dzUYchb6G9NdT4pqgluCpnLQId ...
- C++ 虚基类表指针字节对齐
下面博客转载自别人的,我也是被这个问题坑了快两天了,关于各种虚基类,虚继承,虚函数以及数据成员等引发的一系列内存对齐的问题再次详细描述 先看下面这片代码.在这里我使用了一个空类K,不要被这个东西所迷惑 ...
- C++ Primer 有感(管理类的指针成员)
C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理. 我现在分析一下为什么要管理指针成员. 有如下Student类,Student.h如下: [cpp] view ...
- C/C++基础----特殊工具和技术 (重载new和delete,RTT,限定作用域的枚举类型,类成员指针,嵌套类,局部类,volatile,链接指示 extern “C”)
重载new和delete 1调用operator new( 或new[])标准库函数分配足够大的.原始的.未命名的内存空间以便存储特定类型的对象 2编译器运行相应地构造函数以构造这些对象,并为其传入初 ...
- C++中的类成员指针
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- mfc 类对象指针
类对象指针 一.类对象指针定义 Tdate d1; Tdate *p1=&d1; Tdate *p2=(Tdate *)malloc(sizeof(Tdate)); 二.类对象指针使用 int ...
- 【c++】类管理指针成员
c++编程提倡使用标准库,一个原因是标准库大胆减少对指针的使用.但是许多程序是离不开指针的.包含指针的类需要特别注意复制控制,原因是复制指针时只复制指针中的地址,而不复制指针所指向的对象.这样当把一个 ...
- YTU 2636: B3 指向基类的指针访问派生类的成员函数
2636: B3 指向基类的指针访问派生类的成员函数 时间限制: 1 Sec 内存限制: 128 MB 提交: 433 解决: 141 题目描述 领导类(Leader)和工程师类(Engineer ...
- MFC中获取App,MainFrame,Doc和View类等指针的方法
From: http://hi.baidu.com/wxnxs/item/156a68f5b3b4ed18e3e3bd03 MFC中获取App,MainFrame,Doc和View类等指针的方法 ...
随机推荐
- angularjs post data
//post json 时收不到数据,目前只找到方法post form形式的key-value值 //关键是设置 headers: { 'Content-Type': 'application/x- ...
- struts2官方 中文教程 系列十一:使用XML进行表单验证
在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...
- 责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析
本文来自网易云社区 作者:乔安然 1. Chain of Responsiblity 定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链 ...
- mysql 导入CSV数据 [转]
转自: http://blog.chinaunix.net/uid-23284114-id-3196638.html MYSQL LOAD DATA INFILE命令可以把csv平面文件中的数据导 ...
- 『JavaScript』封装
封装可以被定义为对对象的内部数据表现形式和实现细节进行隐藏.通过封装可以强制实施信息隐藏. 在JavaScript中,并没有显示的声明私有成员的关键字等.所以要想实现封装/信息隐藏就需要从另外的思路出 ...
- svn资源库url问题
今天连接svn资源库的时候一直出现 RA layer request failedsvn: Unable to connect to a repository at URL http://... sv ...
- selenide 自动化UI测试中Configuration全局配置项目
selenide 在测试过程中需要设置许多的默认值,方便在测试过程中进行和很好的使用.下面我们在selenide中的api引用过来看看! static Configuration.AssertionM ...
- ssh以bash登录的配置
因ssh登录时不会加载.bashrc而是加载.bash_profile,所以以ssh的默认登录不会是bash,只要在.bash_profile中添加以下代码即可: if [ -f ~/.bashrc ...
- 剑指offer-二叉树的镜像18
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- ORACLE和SQL语法区别归纳
数据类型比较类型名称 Oracle SQLServer 比较字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb ...