C++学习笔记(十三)

一、C++对象模型和this指针

1.1 成员变量和成员函数分开存储

在C++中,类内的成员变量和成员函数分开存储

只有非静态成员变量才属于类的对象

#include <iostream>using namespace std;class a1
{};class a2
{int a;
};class a3
{int a;static int b;
};class a4
{int a;void func(){}
};class a5
{int a;static void func(){}
};void test1()
{	a1 a1;// 空对象占用内存空间为1// C++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置// 每个空对象也应该有一个独一无二的内存地址cout << "size of t:" << sizeof(a1) << endl;
}void test2()
{a2 a2;// 4,说明非静态成员变量属于类的对象cout << "size of t:" << sizeof(a2) << endl; 
}void test3()
{a3 a3;// 4,说明静态成员变量不属于类的对象cout << "size of t:" << sizeof(a3) << endl;
}void test4()
{a4 a4;// 4,说明非静态成员函数不属于类的对象cout << "size of t:" << sizeof(a4) << endl;
}void test5()
{a5 a5;// 4,说明静态成员函数不属于类的对象cout << "size of t:" << sizeof(a5) << endl;
}int main(int argc, char* argv[])
{test1();test2();test3();test4();test5();return 0;
}

1.2 this指针概念

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共同一块代码,那么问题是:这一块代码是如何区分是哪个对象调用自己的呢?

C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象

this指针是隐含每一个非静态成员函数内的一种指针

this指针不需要定义,直接使用即可

this指针的用途:

        1. 当形参和成员变量名同名时,可用this指针来区分

#include <iostream>using namespace std;class Person
{
public:Person(int age){// age = age; 报错this->age = age;}int age;
};void test()
{Person p(23);cout << "p1的年龄:" << p.age << endl;
}int main(int argc, char* argv[])
{test();return 0;
}

        2. 在类的非静态成员函数中返回对象本身,可使用return *this

#include <iostream>using namespace std;class Person
{
public:Person(int age){// age = age; 报错this->age = age;}int age;Person addAge1(Person& p){this->age += p.age;return *this;}Person& addAge2(Person& p){this->age += p.age;return *this;}
};void test()
{Person p1(23);cout << "p1的年龄:" << p1.age << endl;Person p2(20);// addAge1返回的值,p1加完p2返回的是拷贝构造函数创建的新的对象,和自身不同,并没有在p1上进行累加p1.addAge1(p2).addAge1(p2).addAge1(p2).addAge1(p2);cout << "p1的年龄:" << p1.age << endl;// addAge2返回的引用,p1加完p2,返回p2本身p1.addAge2(p2).addAge2(p2).addAge2(p2).addAge2(p2);cout << "p1的年龄:" << p1.age << endl;
}int main(int argc, char* argv[])
{test();return 0;
}

1.3 空指针访问成员函数

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针

如果用到this指针,需要加以判断保证代码的健壮性

#include <iostream>using namespace std;class Person
{
public:void showClassName(){cout << "this is Person class" << endl;}void showAge(){// 提高代码健壮性if (this == NULL){return;}// this指针指向的Person是一个空指针,对象没有实体,更不用说有age属性了cout << "age=" << this->age << endl;  // 在属性的前面都默认加了this}int age;
};void test()
{Person* p = NULL;p->showClassName(); // 可以运行p->showAge(); // 有问题
}int main(int argc, char* argv[])
{test();return 0;
}

1.4 const修饰成员函数

常函数:1. 成员函数加const后我们称这个函数为常函数

              2. 常函数内不可以修改成员属性

              3. 成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象:1. 声明对象前加const称该对象为常对象

              2. 常对象只能调用常函数 

二、友元

生活中家里有客厅(Public),有卧室(Private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你自己可以进去

但是,还有一些例外,比如你允许你的好朋友进去

在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术

友元的目的就是让一个函数或者类访问另一个类中的私有成员

友元的关机字为 friend

友元的三种实现:1. 全局函数做友元

                             2. 类做友元

                             3. 成员函数做友元

2.1 成员函数做友元

#include <iostream>
#include <string>using namespace std;class Building
{// 告诉编译器,goodfriend是全局函数,是Building类的好朋友,可以访问类中的私有内容friend void goodfriend(Building* building);public:Building(){this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";}public:string m_SittingRoom; // 客厅
private:string m_BedRoom; // 卧室
};void goodfriend(Building* building)
{cout << "正在访问:" << building->m_SittingRoom << endl;cout << "正在访问:" << building->m_BedRoom << endl;
}int main(int argc, char* argv[])
{Building building;goodfriend(&building);return 0;
}

2.2 类做友元

#include <iostream>
#include <string>using namespace std;class Building
{// 告诉编译器,goodfriend是Building类的好朋友,可以访问类中的私有内容friend class goodfriend;public:Building();
public:string m_SittingRoom; // 客厅
private:string m_BedRoom; // 卧室
};
// 类外写成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}class goodfriend
{
public:Building* building;goodfriend();void visit();
};
// 类外写成员函数
goodfriend::goodfriend()
{// 创建建筑物对象building = new Building;
}
void goodfriend::visit()
{cout << "正在访问:" << building->m_SittingRoom << endl;cout << "正在访问:" << building->m_BedRoom << endl;
}void test()
{goodfriend zz;zz.visit();
}
int main(int argc, char* argv[])
{test();return 0;
}

2.3 成员函数做友元

#include <iostream>
#include <string>using namespace std;class Building;
class GoodFriend
{
public:Building* building;GoodFriend();void visit1(); // 让visit1函数可以访问Building中私有属性void visit2(); // 让visit2函数不能访问Building中私有属性
};class Building
{// 告诉编译器,goodfriend是Building类的好朋友,可以访问类中的私有内容friend void GoodFriend::visit1();public:Building();
public:string m_SittingRoom; // 客厅
private:string m_BedRoom; // 卧室
};
// 类外写成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}// 类外写成员函数
GoodFriend::GoodFriend()
{// 创建建筑物对象building = new Building;
}
void GoodFriend::visit1()
{cout << "正在访问:" << building->m_SittingRoom << endl;cout << "正在访问:" << building->m_BedRoom << endl;
}
void GoodFriend::visit2()
{cout << "正在访问:" << building->m_SittingRoom << endl;// cout << "正在访问:" << building->m_BedRoom << endl;
}
void test()
{GoodFriend gf;gf.visit1();gf.visit2();
}
int main(int argc, char* argv[])
{test();return 0;
}

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

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

相关文章

基于ssm端游账号销售管理系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对端游账号销售信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

让你从此不再惧怕ANR

原文链接 让你从此不再惧怕ANR 这篇文章是基于官方的Diagnose and fix ANRs翻译而来&#xff0c;但也不是严格的翻译&#xff0c;原文的内容都在&#xff0c;又加上了自己的理解以及自己的经验&#xff0c;以译注的形式对原文的作一些补充。 当一个Android应用的UI线程被阻塞时…

[排序篇] 冒泡排序

目录 一、概念 二、冒泡排序 2.1 冒泡降序(从大到小排序) 2.2 冒泡升序(从小到大排序) 三、冒泡排序应用 总结 一、概念 冒泡排序核心思想&#xff1a;每次比较两个相邻的元素&#xff0c;如果它们不符合排序规则&#xff08;升序或降序&#xff09;则把它们交换过来。…

Linux内存管理(十七):percpu 机制(2)——动态分配

源码基于:Linux5.4 约定: 芯片架构:ARM64内存架构:UMACONFIG_ARM64_VA_BITS:39CONFIG_ARM64_PAGE_SHIFT:12CONFIG_PGTABLE_LEVELS :3关联博文: percpu机制(1)——框架实现 percpu机制(2)——动态分配 0. 前言 上一篇博文 我们剖析了 percpu 机制的整个框架,包括per…

大致人类应该是短时记忆和利用短时记忆控制利用周围环境达到长期记忆的吧

这里写目录标题 图代码代码解析图 代码 import timedef route_llm(route_text):passdef write_to_dask(one_sum, one_text, one_path

小程序嵌套H5

小程序嵌套H5 使用Hbuild x开发H5页面项目里面使用了js-sdk工具包H5发布完成之后生成URL。新建一个小程序空项目&#xff0c;填写小程序的appid。本地调试的时候如果报错无法打开该网页&#xff0c;那么需要勾选先的不校验。发布体验版本需要注意下面的两个配置点。 使用Hbuild…

中通快递单号查询入口,将指定某天签收的单号筛选出来

批量查询中通快递单号的物流信息&#xff0c;将指定某天签收的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左…

Spring Boot中JdbcTemplate多数据源配置

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

编译 Flink代码

构建环境 JDK1.8以上和Maven 3.3.x可以构建Flink&#xff0c;但是不能正确地遮盖某些依赖项。Maven 3.2.5会正确创建库。所以这里使用为了减少问题选择 Maven3.2.5版本进行构建。要构建单元测试&#xff0c;请使用Java 8以上&#xff0c;以防止使用PowerMock运行器的单元测试失…

云计算核心技术

1.1 云计算的定义 云计算是目前业内的热点概念&#xff0c;它以开放的标准和服务为基础&#xff0c;以互联网为中心&#xff0c;提供安全、快速、便捷的数据存储和网络计算服务&#xff0c;让互联网这片“云”上的各种计算机共同组成数个庞大的数据中心及计算中心。它可以被看成…

求职智能分析系统

本项目是一个基于Flask轻量级框架的计算机就业数据可视化分析平台。 采用echarts和ajax等技术进行数据展示和用户交互。

【电路笔记】-电位器

电位器 文章目录 电位器1、概述2、电位器类型2.1 旋转电位器2.2 滑块电位器2.3 预设和微调电位器2.4 变阻器 3、电位器示例14、电位器作为分压器5、电位器示例26、变阻器6、滑块变阻器7、线性或对数电位器8、总结 当连接的轴物理旋转时&#xff0c;电位计和变阻器的电阻值会发生…

一个简单的Wireshark和TCP三次握手,为什么能难住阿里6年测试?

之前写过一篇博客&#xff1a;用 Fiddler 来调试HTTP&#xff0c;HTTPS。 这篇文章介绍另一个好用的抓包工具wireshark&#xff0c; 用来获取网络数据封包&#xff0c;包括http,TCP,UDP&#xff0c;等网络协议包。 记得大学的时候就学习过TCP的三次握手协议&#xff0c;那时候…

Vue中 v-show 和 v-if 有什么区别

Vue中的 v-show 和 v-if 一.v-show 与 v-if 原理分析v-show 原理v-if 原理 二、v-show 与 v-if 的共同点三、v-show 与 v-if 的区别四、v-show 与 v-if 的使用场景使用 v-show 的场景&#xff1a;使用 v-if 的场景&#xff1a; 五、v-show 与 v-if 的优缺点v-show优点&#xff…

kafka rebalance(再均衡)导致的消息积压分析

起因&#xff1a; 某天&#xff0c;项目组收到大量的kafka消息积压告警。查看了kafka日志后&#xff0c;发现 kafka不断地 rebalance(再均衡)。 Rebalance (再均衡)&#xff1a; 分区的所有权从一个消费者转移到另一个消费者&#xff0c;这样的行为被称为Rebalance (再均衡)…

修改汽车的控制系统实现自动驾驶,基于一个开源的汽车驾驶辅助系统实现全自动驾驶

修改汽车的控制系统实现自动驾驶,基于一个开源的汽车驾驶辅助系统实现全自动驾驶。 自动驾驶汽车依靠人工智能、视觉计算、雷达、监控装置和全球定位系统协同合作,让电脑可以在没有任何人类主动的操作下,自动安全地操作机动车辆。 演示视频: Openpilot :一个开源的汽车驾…

Socks5代理与代理IP的技术创新

随着全球市场的开放和跨界电商的崛起&#xff0c;企业在出海过程中面临着复杂多变的网络环境和地域限制。在这一背景下&#xff0c;Socks5代理和代理IP等技术应运而生&#xff0c;成为助力企业突破网络壁垒、实现出海目标的重要工具。本文将深入探讨Socks5代理和代理IP在跨界电…

OpenSSL 3.x爆出漏洞,如何妥善应对?

10月25日&#xff0c;OpenSSL项目团队发布了OpenSSL 3.x版中一个关键安全漏洞的修复程序。该修复程序已于11月1日正式发布。 由于OpenSSL有着极为广泛的使用&#xff0c;该公告引起了很大反响。Akamai希望能通过本文帮助相关用户了解情况&#xff0c;介绍有关检测和缓解威胁的…

怎么消除视频中所有的声音?方法很简单

当我们想把视频中去掉声音&#xff0c;可能有多种原因&#xff0c;也许需要制作一个无声视频&#xff0c;或者想在视频中添加自己的音乐或解说&#xff0c;特别是一些搞笑解说&#xff0c;无论原因是什么&#xff0c;到底要怎么把视频中所有的声音都去除呢&#xff1f; 小编给…

计算机毕业设计 基于Web的网上购物系统(pc端仿淘宝系统)的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…