首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++】C++ 类 this 指针用法 ① ( C++ 类 this 指针引入 | this 指针用法 | 代码示例 )

一、C++ 类 this 指针 1、C++ 类 this 指针引入 在 C++ 类 , this 指针 是一个特殊指针 , 由系统自动生成 , 不需要手动声明定义 , 在类每个 非静态成员函数... , 都可以调用 this 指针 ; this 指针 是指向 调用对象 自身 指针 , 也就是调用 该成员函数 实例对象 内存地址 ; 由于 this 指针只能在 非静态成员函数内部使用..., 因此 this 指针是类内部使用指针 , 使用 this 可以访问 实例对象 所有 公有 public / 保护 protected / 私有 private 成员 ; 2、C++ 类...this 指针用法 C++ 类 this 指针用法 : 使用 this 作为指针 : 在 非静态成员函数 , 直接使用 this 作为 本实例对象 指针 ; this 使用 this-> 访问成员变量...访问成员变量 : 在 非静态成员函数 , 直接使用如下语法 , 访问 本实例对象 非静态成员变量 ; 先获取指针指向数据 然后访问数据成员变量 ; (*this).成员变量名 在 C++

25620

C++this指针本质

一直以来对C++this不理解,只知道在构造函数,如果构造函数参数和类成员名字一样的话,就可以用this指针来区分,如: this->a = a; 一直以来都有这个疑问:this究竟是什么?...从刚才代码,我们用”this->”而不是”this.”就说明this是一个指针,而我们知道,在CC++指针就是地址,因此很容易想到,this也是一个地址。但是问题来了,this是谁地址呢?...我们看下面这个很简单C++程序: #include class A { public: A(); }; A::A() { std::cout << "this...::endl; } int main() { A a; std::cout << "&a " << &a << std::endl; return 0; } 大家先在自己脑袋运行一下这个程序...我们可以看到,this和&a结果是一样。由此可以看出,this就是a地址,而a是类A一个对象,占用了sizeof(A)内存空间。

74230
您找到你想要的搜索结果了吗?
是的
没有找到

浅析C++this指针

看call 3那行C++代码汇编代码就可以看到this指针跟一般函数参数区别:一般函数参数是直接压入栈(push 0Dh),而this指针却被放到了ecx寄存器。...在类非成员函数如果要用到类成员变量,就可以通过访问ecx寄存器来得到指向对象this指针,然后再通过this指针加上成员变量偏移量来找到相应成员变量。...ret 下面对上面的汇编代码重点行进行分析: 1、ecx寄存器值压栈,也就是把this指针压栈。...2、ecx寄存器出栈,也就是this指针出栈。 3、ecx值放到指定地方,也就是this指针放到[ebp-8]内。 4、取this指针值放入eax寄存器内。...通过上面的分析,我们可以从底层了解了C++this指针实现方法。虽然不同编译器会使用不同处理方法,但是C++编译器必须遵守C++标准,因此对于this指针实现应该都是差不多

72910

C++指针用法汇集

1、指向对象指针   定义:对象空间起始地址就是对象指针。   ...说明:在建立对象时,编译系统就为每个对象分配一定存储空间以存放其成员,不过注意,在一般情况下不同对象数据存储单元存放数据成员是不相同,而不同对象函数代码却是相同,也就是说,它们函数代码是共享...这时我们可以定义一个指针变量用来存放对象指针。   ...定义指向类对象指针变量一般形式是:   类名 *对象指针名;   如对于与个Time类对象,我们可以有: Time t; Time *p; p=&t;   我们就可以通过对象指针访问对象和对象成员...指向对象成员函数gettime(),相当于t.gettime()   也可以用如下形式: p->hour 和 p->gettime()和上面是等价

11810

C++this指针理解和用法

大家好,又见面了,我是你们朋友全栈君。 关于this指针一个精典回答: 当你进入一个房子后, 你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。...对于一个类实例来说, 你可以看到它成员函数、成员变量, 但是实例本身呢? this是一个指针,它时时刻刻指向你这个实例本身。...在非静态成员函数,编译器在编译时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。...例如a.fun(1)fun(&a,1) this使用:1)在类非静态成员函数返回对象本身时候,直接用return *this(常用于操作符重载和赋值、拷贝等函数)。...,即将point1对象地址传递给了this指针 b.编译器编译后原型应该是void MovePoint(Point *this, int a, int b) c.在函数体可以写成{this->x

64630

C++this指针使用方法.

this指针仅仅能在一个类成员函数调用,它表示当前对象地址。...由此可见,this在成员函数開始前构造,在成员结束后清除。 这个生命周期同任一个函数參数是一样,没有不论什么差别。 当调用一个类成员函数时,编译器指针作为函数this參数传递进去。...#4:this指针怎样訪问类变量/? 假设不是类,而是结构的话,那么,怎样通过结构指针来訪问结构变量呢?假设你明确这一点的话,那就非常好理解这个问题了。...在C++,类和结构是仅仅有一个差别的:类成员默认是private,而结构是public。 this是类指针,假设换成结构,那this就是结构指针了。...也有很多C语言写程序,模拟了类实现。如freetype库等等。 事实上,实用过C语言的人,大多都模拟过。仅仅是当时没有明白概念罢了。

1.2K20

macOS下利用dSYM文件crash文件内存地址转换为可读符号

macOS下symbolicatecrash也具备相应功能。对应于Windows下pdb文件,macOS下crash文件解析需要用到dSYM文件。...当程序崩溃时,通过symbolicatecrash对crash文件和dSYM文件符号进行映射,即可将crash文件内存地址转换为可读字符串。以前博文中也进行过总结,但是并没有具体实践。...而是解析我们感兴趣内存地址符号。其方法是:先找到Imageload address,如下: ?    ...这里我程序在内存加载位置为0x10c680000(尖括号字符串是程序UUID)。再次找到我们感兴趣内存地址,如下: ?      再次运行命令: ?    ...stackoverflow.com/questions/40056263/symbolicate-crash-log-xcode-8-macos-app 2. https://gist.github.com/bmatcuk/c55a0dd4f8775a3a2c5a

2.5K100

详解 C++ 11 智能指针

C/C++ 语言最为人所诟病特性之一就是存在内存泄露问题,因此后来大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言使用者屏蔽了内存指针这一概念。...正因为 std::auto_ptr 设计存在如此重大缺陷,C++11 标准在充分借鉴和吸收了 boost 库智能指针设计思想,引入了三种类型智能指针,即 std::unique_ptr、std:...正因为存在上述设计上缺陷,在 C++11及后续语言规范 std::auto_ptr 已经被废弃,你代码不应该再使用它。...C++ 新标准各种智能指针是如此实用与强大,在现代 C++ 项目开发,读者应该尽量去使用它们。...); ~Test(); private: std::unique_ptr m_spA; }; C++ 新标准智能指针我想介绍就这么多了,Modern C/C++ 已经变为 C

2.7K31

C++this指针作用以及用法详解

当我们在类定义了一个变量,同时又在类成员函数定义了同一个变量时,也就是变量名重复时,但是我们要想使用类定义变量,此时就需要this指针了。...1.this指针作用 指针存在于类成员函数,指向被调用函数类实例地址。 一个对象this指针并不是对象本身一部分,不会影响sizeof()结果。...this指针作用域是在类内部,当在类非静态成员函数访问类非静态成员时候,编译器会自动将对象本身地址作为一个隐含参数传递给函数。...2.this指针使用 (1)在类非静态成员函数返回类对象本身时候,直接使用 return *this; (2)当参数与函数成员变量名相同时,应使用 this.age = age; 3.this指针特点...当调用一个类成员函数时,编译器指针作为函数this参数传递进去。

39430

《挑战30天C++入门极限》CC++字符指针数组及指向指针指针含义

C/C++字符指针数组及指向指针指针含义   就指向指针指针,很早以前在说指针时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针指针。   ...,定义以后a[]其实内部有三个内存位置,分别存储了abc\0,cde\0,fgh\0,三个字符串起始地址,而这三个位置内存地址却不是这三个字符串起始地址,在这个例子a[]是存储在栈空间内,而三个字符串却是存储在静态内存空间内...cde fgh   可以看出每一次内存地址+1操作事实上是一次加sizeof(char*)操作,我们在32位系统sizeof(char*)长度是4,所以每加1也就是+4,实际上是*a[]...答案是这样,在c++,输出字符指针就是输出字符串,程序会自动在遇到\0后停止.   ...fp=test;//函数test地址赋给函数学指针fp cout<<fp(5)<<"|"<<(*fp)(10)<<endl; //上面的输出fp(5),这是标准c++写法

1.3K20

理解对C++裸指针释放后重用问题

strcmp(argv[0], c->getCommand())) { //调用FrameworkCommand虚函数 if (c->runCommand...假设其中一个FrameworkCommand对象所在内存地址是0x12345678,这个地址值,用户进程可以在参数以字符串形式提供,即\x78\x56\x34\x12,这里要考虑到字节序,内存低地址存放小端字节...前15个参数处理过程argv数组元素都是正常从strdup返回指向堆指针值,即指向参数字符串指针。...当p指针指向p16这个参数值,argv[16]=strdup(“p16”),这时argv[16]已经超出了argv数组范围,此时&argv[16]=&tmp[0],这个参数值覆盖tmp数组头4字节...继续调用*q = *p++,此时tmp开头4字节即为\x78\x56\x34\x12,同时也是argv[16]元素值,注意到这个值有别于argv数组其它元素值,其它元素值都是strdup动态分配返回指针

1.7K90

c给字符数组,字符串指针赋值方法总结

2、char a[10]; a=”hello”; 这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配10个字符空间,现在这个情况a又指向数据区hello常量,这里指针a出现混乱...C语言运算符根本无法操作字符串。在C语言中把字符串当作数组来处理,因此,对字符串限制方式和对数组一样,特别是,它们都不能用C语言运算符进行复制和比较操作。...; C语言把这些语句解释为一个指针与另一个指针之间(非法)赋值运算。...但是,使用=初始化字符数组是合法: char str1[10] = “abc”; 这是因为在声明,=不是赋值运算符。...试图使用关系运算符或判等运算符来比较字符串是合法,但不会产生预期结果: if (str1==str2) … 这条语句把str1和str2作为指针来进行比较,而不是比较两个数组内容。

5.3K30

C++关于指针初始化和使用NULL理解

1、严禁使用未被初始化指针C++创建指针时候,只分配存储地址内存,并不会分配存储数据内存,所以指针可能指向任何位置。   ...首先看一下百科中一段关于NULL描述: NULL出现是一种约定俗成,事实上它不是C语言中关键字;把一个指针赋值为NULL,通常说法是“指针悬空”。这样,指针就无法再进行任何数据访问了。...引用网友win_hate在话题“关于NULL不严谨”的话来说:“如果说有谁不严谨了,那必定是读取0位置程序员,而不是C。...也就是说指针赋值成NULL有些编译器是不能往里边填值,所以要使用new来分配一段合适内存才可以填值,而且使用new申请内存还可以使用delete进行配对删除,可以防止内存泄露。...所以NULL就像安全带,指针悬空,避免程序员因为大意而犯下一些不必要错误。

2.7K100

C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 值 | 在函数 间接修改 指针变量 值 | 在函数 间接修改 外部变量 原理 )

文章目录 一、直接修改 和 间接修改 指针变量 值 二、在函数 间接修改 指针变量 值 三、在函数 间接修改 外部变量 原理 一、直接修改 和 间接修改 指针变量 值 ---- 直接修改 指针变量...值 , 就是为其赋值一个地址值 , 使用 & 取地址符 , 变量地址赋值给指针变量 , 或者使用 malloc 函数分配内存赋值给 指针变量 ; // 变量地址赋值给一级指针 p...= &a; 间接修改 指针变量 值 , 首先要 指针变量 地址值 , 赋值给 1 个 二级指针 变量 , 通过 * 符号 , 间接修改 一级指针变量值 ; // 一级指针地址赋值给二级指针...return 0; } 执行结果 : 二、在函数 间接修改 指针变量 值 ---- 在 函数 间接修改 指针变量 值 , 指向一级指针 二级指针 变量 , 传递到 函数形参 ,...在 函数 , 使用 * 符号 , 修改 二级指针 指向 一级指针 变量值 ; 注意 : 如果要 修改 一级指针 值 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量

20.8K10

4.Block类型

其操作方式类似于数据结构栈,即后进先出、先进后出原则。 例如:在函数申明一个局部变量int b;系统自动在栈为b开辟空间。 堆区(heap):一般由程序员申请并指明大小,最终也由程序员释放。...对于堆区管理是采用链表式管理,操作系统有一个记录空闲内存地址链表,当接收到程序分配内存申请时,操作系统就会遍历该链表,遍历到一个记录内存地址大于申请内存链表节点,并将该节点从该链表删除,然后将该节点记录内存地址分配给程序...分别举3个列子 typedef void (^blk_t) (); int main(int argc, const char * argv[]) { blk_t block = ^{ printf("...Block赋值给附有__strong修饰符id类型类或Block类型成员变量时是在堆上 Block作为函数返回值时是在堆上 Blockcopy,retain,release操作 对block retain...容易犯 错误是[[mutableAarry addObject:stackBlock],在函数出栈后,从mutableAarry取到stackBlock已经被回收,变成了野指针

47250
领券