第24课经典问题解析(下)--------类的成员函数和成员变量隶属某个具体对象吗
关于类成员的疑问
成员函数和成员变量都是隶属于具体对象吗?
成员变量必然是隶属具体对象的,那成员函数呢?
是不是每个对象都有自己的一套成员函数呢?答案否
从面向对象的角度
对象由属性(成员变量)和方法(成员函数)构成
从程序运行的角度
对象是由数据和函数构成
数据可以位于栈,堆和全局数据区
函数只能位于代码段
代码段是只读的,在程序运行阶段是不可以改变的。当编译器将最终的可执行程序编译好之后,代码段就确定了,不可以再进行更改。
对象可以动态的创建,动态的删除,对于数据而言,当然可以做到。
对于代码,这是不可能的。也就是说,在面向对象里面由于程序的特性,天生的决定了成员函数不可能每个对象都有一套的。只可能是所有的对象共享一套成员函数。就是因为代码段,不可能动态的添加和删除的。
结论:
-每一个对象都拥有自己独立的属性(成员变量)
-所有的对象共享类的方法(成员函数)
-方法能够直接访问对象的属性
-方法中的隐藏参数this用于指代当前对象
问题:如果所有的对象都共享一套成员函数,那么我们在调用成员函数的时候,函数本身它如何知道是哪个对象调用的呢?
方法中的隐藏参数this用于指代当前调用成员函数的对象。
用实例来证明:
#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;
}
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;
}
该实例说明:
在类的成员函数中,有一个隐藏的参数,这个参数它是一个指针,并且这个指针的值就是调用这个函数所对应的对象的地址。
成员函数和普通函数是不一样的,成员函数有一个隐藏的参数this。
现在可以回答上篇博客中的那个问题了。
Test::Test(const Test& t)
{
mi = t.mi;
}
成员函数只有一套,成员函数能直接访问对应类的成员变量。拷贝构造函数是一种特殊的成员函数,因此就可以直接访问类的成员变量。因此t.mi是合法的。
原文地址:https://www.cnblogs.com/-glb/p/11873881.html
- 三封报警邮件的分析(r6笔记第95天)
- HCTF2017 部分 Web 出题思路详解
- 基于springboot+kotlin+gradle构建的框架的坑
- 创建Task的多种方法
- 运行map()后,报:<map object at 0x02629E50>解决方法与原因分析
- Gradle的快速入门
- Python笔记从html中提取字段
- 一条细小的报警短信的处理(r6笔记第96天)
- 1.react的基础知识
- 防火墙设置的小问题(r6笔记第94天)
- 有没有必要把机器学习算法自己实现一遍?
- python中从str中提取元素到list以及将list转换为str
- 简单易学的机器学习算法——线性回归(2)
- Java基础-26(01)总结网络编程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Selenium4 IDE新特性:弹性测试、循环和逻辑判断
- Go 字符串处理
- Golang 特殊类型
- IntelliJ中基于文本的HTTP客户端
- Pytorch转Msnhnet模型思路分享
- Go socket实现多语言间通信
- Golang不同类型比较
- 牛逼!Intellij IDEA竟然有个功能可自动生成代码,你用过没?
- 导出mysql表结构生成grpc需要的proto文件工具
- 尤大 3 天前发在 GitHub 上的 vue-lit 是啥?
- 微信小程序客服消息功能 php
- CVPR 2020 在频域中学习的DCTNet
- 微信小程序发送模板消息
- Golang 下载文件
- layui省市区三级联动插件