【C++深度剖析教程2】C++经典问题解析之二 this指针与成员函数

隐藏的this指针,所有对象共享类的成员函数

写一篇博客花费时间虽然长,但是却让你对内容的记忆尤为深刻,尤其是你对它的态度。记录菜鸟的成长日记,也希望同为菜鸟的你们与我一起共同进步!!现在分享的是C++的学习笔记,后面会同时分享数据结构学习笔记,以及我目前手中项目的制作流程!!忘记说了,目前手中正在做的是 基于Imx6的一个linux操作系统的移植,主要做驱动的移植与系统的移植,后期可能会移植QT,这些我都希望记录在我的博客中,相信几年后,我也有可能会成为了博客专家了呢?哈哈哈!!!

好,今天的主题依然接着上一篇博客的线路,来探讨一下目前我所学到的C++中的一些经典问题的 探讨!
1.成员函数和成员变量都是隶属于具体的对象么?
从面相对象的角度

  • 对象由属性(成员变量)和方法(成员函数)构成

从程序运行角度

  • 对象由数据和函数构成
    *数据可以位于栈,堆和全局数据区
    *函数只能位于代码段

直接上代码吧,文字的描述总是很枯燥!!!

#include <stdio.h>class Test
{int mi;
public:int mj;Test(int i);Test(const Test& t);int getMi();void print();
};Test::Test(int i)
{mi = i;
}Test::Test(const Test& t)
{mi = t.mi;   //mi 为private 类型,为何可以调用?
}int Test::getMi()
{return mi;
}void Test::print()
{printf("this = %p\n", this);
}int main()
{Test t1(1);Test t2(2);Test t3(3);printf("t1.getMi() = %d\n", t1.getMi());printf("&t1 = %p\n", &t1);t1.print();printf("t2.getMi() = %d\n", t2.getMi());printf("&t2 = %p\n", &t2);t2.print();printf("t3.getMi() = %d\n", t3.getMi());printf("&t3 = %p\n", &t3);t3.print();return 0;
}

先运行一下,我还是将它放到linux中运行,输出结果为:

t1.getMi() = 1
&t1 = 0xbfcc3d68
this = 0xbfcc3d68
t2.getMi() = 2
&t2 = 0xbfcc3d60
this = 0xbfcc3d60
t3.getMi() = 3
&t3 = 0xbfcc3d58
this = 0xbfcc3d58

以上输出可以看出每一个对象以及this所指的地址都是一样的,这说明了一些问题:
可以得出一下四条结论:
-每一个对象拥有自己独立的属性(成员变量)(学了虚拟内存部分不之后,这些概念变的很清晰)
-所有的对象共享类的方法(成员函数)
-方法能够直接访问对象的属性
-方法中的隐藏参数 this 指针用于指代当前对象

程序中的问题mi = t.mi; //mi 为private 类型,为何可以调用?,因为拷贝构造函数Test::Test(const Test& t)本身也属于一种成员函数,能够直接访问对象的属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uml 类图整理

1.五分钟读懂UML类图 http://www.cnblogs.com/shindo/p/5579191.html 2.UML类关系&#xff08;依赖&#xff0c;关联&#xff0c;聚合&#xff0c;组合的区别&#xff09; https://www.jianshu.com/p/eefa0b5b4922 2.1 关联 1、关联关系 关联关系又可进一步分为单向关联、…

web控件开发系列(四) 自定义控件属性(下)

控件在WEB开发时经常要用到&#xff0c;虽然有部分已经存在工具箱里&#xff0c;但有时总需要根据自己的要求&#xff0c;开发一些合适自己的控件。接上一节,已经说过了控件的属性, 例如&#xff0c;我们需要一组属性的集合时&#xff0c;这时我们需要用到的就是复杂属性了&…

【C++深度剖析教程3】C++中类的静态成员变量

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 以一个简单的例子来引入C中类的静态成员变…

前端学习(46):页面导入样式时,使用link和@import有什么区别?

用法 import的写法 <style type”text/css”> import url&#xff08;“a.css”&#xff09;&#xff1b; </style> link的写法 <link rel"stylesheet" href"index.csss"> 区别 1. 来源&#xff1a;link属于XHTML标签&…

静态变量加载时间,静态代码块加载时间

当类加载器将类加载到JVM中的时候就会创建静态变量&#xff0c;这跟对象是否创建无关。静态变量加载的时候就会分配内存空间。静态代码块的代码只会在类第一次初始化的时候执行一次。一个类可以有多个静态代码块&#xff0c;它并不是类的成员&#xff0c;也没有返回值&#xff…

关于linux系统中无法识别某一命令问题的解决方案

问题描述&#xff1a; [XXXX~]$ su - root 口令&#xff1a; [XXXX:]~# gedit /etc/profile Command gedit is available in /usr/bin/gedit The command could not be located because /usr/bin is not included in the PATH environment variable. -su: gedit&#xff1a;找…

FarMap诞生了!

今天&#xff0c;注册完成的FarMap网站最简版正式上线&#xff0c;开辟了一片我的作品发布空间。www.farmap.cn准备修改各个博客网址和下载地址。FarMap2009 使用说明 关键字&#xff1a;基站定位&#xff0c;CPS&#xff0c;GPS&#xff0c;CPS&GPS&#xff0c;短信通讯&a…

23设计模式学习

1.什么设计模式 1.1模式是解决相似问题的核心1.2设计模式软件设计过程中解决一类问题的方案总结来说&#xff1a;设计模式 &#xff1a;软件设计过程中解决一类问题的一种方案&#xff1b; 2.什么是面向对象的设计模式 面向对象设计模式描述了面向对象设计过程中、特定场景下…

修改linux的最大文件句柄数限制

修改linux的最大文件句柄数限制 对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象squid、mysql、java等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值&#xff0c;就会提到“too many files open”的…

人工智能课程

清华大学计算机博士联合智能社创始人年末巨献&#xff0c;【机器学习】大型线上公开课&#xff0c;报名人数超过2800人&#xff0c;课程观看地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1nv66ywD 密码&#xff1a;9bv3想看更多课程的联系:qq:1126137994微信&…

Makefile工程管理语法与使用技巧

使用GNU Make工具来管理程序是每个Linux工程师必须掌握的技能。Make能够使整个程序的编译、链接只需要一个命令(make)就可以完成。 Make的工作主要依赖于一个叫为Makefile的件。Makefile文件描述了整个程序的编译&#xff0c;连接等规则。其中包括&#xff1a;工程中的哪些源文…

JUC 知识总结

在 ThreadPoolExecutor 里面定义了 4 种 handler 策略&#xff0c;分别是 1. CallerRunsPolicy &#xff1a;这个策略重试添加当前的任务&#xff0c;他会自动重复调用 execute() 方法&#xff0c;直到成功。 2. AbortPolicy &#xff1a;对拒绝任务抛弃处理&#xff0c;并且…

C# java 有关“字节序”的描述 .

有关“字节序”的描述 收藏 BIG-ENDIAN&#xff08;大字节序、高字节序&#xff09; LITTLE-ENDIAN&#xff08;小字节序、低字节序&#xff09; 主机字节序 网络字节顺序 JAVA字节序 1&#xff0e;BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关的比如int,short,long型&…

移植u-boot-2012.04.01到jz2440开发板

今天我给大家分享一下如何移植一个纯净的uboot到jz2440开发大版&#xff0c;通过记录学习分享&#xff0c;与大家一起进步&#xff01;&#xff01;&#xff01; 1.首先我们在uboot官网下载u-boot-2012.04.01.tar.bz2&#xff0c;建立source insight工程。将下载好的uboot通过…

温习了一下java线程状态方面的知识总结一

好长时间没有复习线程状态这块&#xff0c;读并发编程实战正好看着这块&#xff0c;顺便复习一下&#xff1a; 1.线程的五种状态&#xff1a; 2.线程五种状态的转换图&#xff1a; wait()会立刻释放synchronized(obj)中的锁以便其它线程可以执行obj.notify 但是notify() 不会立…

WinForm:进度条的实现(异步)

在WinForm中经常遇到一些费时的操作界面&#xff0c;比如统计某个磁盘分区的文件夹或者文件数目&#xff0c;如果分区很大或者文件过多的话&#xff0c;处理不好就会造成“假死”的情况&#xff0c;或者报“线程间操作无效”的异常&#xff0c;为了解决这个问题&#xff0c;可以…

移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动

上一篇文章我们已经修改了uboot源码使其能够正常打印输出了&#xff0c;但是输出停到了nand启动那里&#xff0c;所以这篇文章就来记录如何修改源码使uboot支持NAND启动。 原来的代码在链接时加了”-pie”选项, 使得u-boot.bin里多了”(.rel)”, “*(.dynsym)”使得程序非常大…

XMLHttpRequest() 请求 返回结果JSON 对象与JSON 字符串处理

好久没有看JavaWEB项目了突然拿起来&#xff0c;而且是原生的项目&#xff0c;中JSON 字符串的处理 json.stingfy() 将对象&#xff0c;数组转换为字符串&#xff0c;json.parse() 将字符串转成json 对象JSON.stringify&#xff08;数组或者对象&#xff09; JSON.parse(字符串…

【C++深度剖析教程4】C++的二阶构造模式

今天学习的是C中的二阶构造模式&#xff0c;二阶构造模式只是设计模式中的简单的模式&#xff0c;是一种软件设计的方法&#xff0c;并没有我们想象的那么高深&#xff0c;设计模式也是一样&#xff0c;只不过是一系列的设计方法&#xff0c;只要我们懂得了原理&#xff0c;那么…