当前位置: 首页 > news >正文

c++学习第十三

1)循环引用的案例及解决办法:

#include <iostream>
#include <memory>
using  namespace std;
class A;class B
{
public:B(){cout<<"B constructor---"<<endl;}~B(){cout<<"B deconstructor----"<<endl;}std::weak_ptr<A> pA; //如果是std::shared_ptr,则会造成引用计数永远无法归0,资源不会被释放;
};class A
{
public:A(){cout<<"A constructor---------"<<endl;}~A(){cout<<"A deconstructor----------------"<<endl;}std::shared_ptr<B> pB;
};int main()
{std::shared_ptr<A> pAA = make_shared<A>();std::shared_ptr<B> pBB = make_shared<B>();pAA->pB = pBB;pBB->pA = pAA;return 0;
}

2)emplace紧调用一次构造函数,push_back调用一次构造,一次拷贝,测试代码如下:
所以:优先使用emplace成员函数。

#include<iostream>
#include<vector>
#include<algorithm>
#include<set>using namespace std;struct SBook
{
public:SBook() : bookName(""), price(0){std::cout << "default construct: " << bookName << std::endl;}SBook(std::string bookName_, int price_) : bookName(bookName_), price(price_){std::cout << "construct: " << bookName << std::endl;};SBook(const SBook& rhs) : bookName(rhs.bookName), price(rhs.price){std::cout << "copy construct: " << bookName << std::endl;}~SBook(){std::cout << "deconstruct: " << bookName << std::endl;}bool operator <(const SBook& rhs) const{return bookName < rhs.bookName;}public:std::string bookName;int price;
};int main(int argc, char *argv[])
{// 测试vectorvector<SBook> books;// 预先分配,否则整个vector在容量不够的情况下重新分配内存books.reserve(100);std::cout << "test push_back:" << endl;books.push_back(SBook("C++从入门到放弃", 1));std::cout << endl;std::cout << "test emplace_back:" << endl;books.emplace_back("水浒传", 2);std::cout << endl;std::cout << "test emplace_back default:" << endl;books.emplace_back();auto& book = books.back();book.bookName = "红楼梦";book.price = 5;std::cout << endl;std::cout << "test emplace:" << endl;auto it = books.emplace(books.end());it->bookName = "西游记";it->price = 3;std::cout << endl;std::cout << "output all books: " << endl;for_each(books.begin(), books.end(), [](const SBook& book)->void{std::cout << book.bookName << endl;});std::cout << endl;// 测试setset<SBook> bookSet;std::cout << "test bookSet insert:" << endl;bookSet.insert(SBook("十万个为什么", 1));std::cout << endl;std::cout << "test bookSet emplace:" << endl;bookSet.emplace("新华字典", 2);std::cout << endl;std::cout << "output bookset: " << endl;for_each(bookSet.begin(), bookSet.end(), [](const SBook&book)->void{std::cout << book.bookName << endl;});std::cout << endl;return 0 ;
}

3)unordered_map的使用

#include <iostream>
#include <unordered_map>
using  namespace std;template<class K,class V>
using umap = std::unordered_map<K,V>;int main(void)
{umap<string,string> m{{"111","bbb"},{"222","ddd"}};cout<<m["111"]<<endl;  //显示key为"111"的value;return 0;
}

4)利用模板类的参数,自动生成友元函数;
芙蓉楼送辛渐
王昌龄
寒雨连江夜入吴,
平明送客楚山孤。
洛阳亲友如相问,
一片冰心在玉壶;

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。template<class T1, class T2>
class AA    
{T1 m_x;T2 m_y;
public:AA(const T1 x, const T2 y) : m_x(x), m_y(y) { }// 非模板友元:友元函数不是模板函数,而是利用模板类参数生成的函数,只能在类内实现。// 本质:编译器利用模板参数,帮我们生成了一个友元函数,但是这个函数不是模板函数friend void show(const AA<T1, T2>& a){cout << "x = " << a.m_x << ", y = " << a.m_y << endl;}
};int main(void)
{AA<int,string> a(44,"abcde");show(a);return 0;
}

5)模板类与函数的组合使用(包括:普通函数,函数模板特化版本,函数模板泛化版本)
模板类可以用于函数的参数和返回值!

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。template<class T1, class T2>
class AA    // 模板类AA。
{
public:T1 m_x;T2 m_y;AA(const T1 x, const T2 y) : m_x(x), m_y(y) { }void show() const { cout << "show()  x = " << m_x << ", y = " << m_y << endl; }
};// 采用普通函数,参数和返回值是模板类AA的实例化版本。
AA<int, string> func(AA<int, string>& aa)
{aa.show();cout << "调用了func(AA<int, string> &aa)普通函数。\n";return aa;
}// 函数模板,参数和返回值是的模板类AA。
template <typename T1,typename T2>
AA<T1, T2> func(AA<T1, T2>& aa)
{aa.show();cout << "调用了func(AA<T1, T2> &aa)特化函数。\n";return aa;
}// 函数模板,参数和返回值是任意类型。
template <typename T>
T func(T &aa)
{aa.show();cout << "调用了func(AA<T> &aa)任意类型泛化函数。\n";return aa;
}int main()
{AA<int, string> aa1(3, "我是一只傻傻鸟。"); //以上三个函数,优先调用普通函数,再次调用特化版本,最后是泛化版本!func(aa1);AA<double,string> aa2(3.4,"5555"); //特化版本func(aa2);
}

6)模板类继承普通类范例:

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。
class aa
{
public:int a_;aa(int a) :a_(a) { cout << "调用了AA的构造函数。\n"; }void func1() { cout << "调用了func1()函数:m_a=" << a_ << endl;; }};template<class T1,class T2>
class bb : public aa
{
public:T1 x_;T2 y_;	bb(T1 x,T2 y,int a): aa(a),x_(x),y_(y){ cout << "调用了BB的构造函数"<<endl;}void func2() const { cout << "调用了func2()函数:x = " << x_ << ", y = " << y_ << endl; }
};int main(void)
{bb<int, string> bb(8, "我是一只傻傻鸟。",3);bb.func2();bb.func1();	return 0;
}

学习知识tips:
引用是指针常量的伪装
构造函数一般有两个执行阶段:初始化阶段和赋值阶段;
成员指针运算符 .* 或者 ->* c++特有的
std::is_same //类型萃取相关的函数
integral 美 [ˈɪntɪɡrəl] adj 完整的,n积分
typeid跟sizeof用法意义,有两种写法 typeid(int);
typeid(变量名或者表达式);

7)匿名共用体一般是写在结构体中的

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。struct st_girl       // 定义超女结构体。
{int no;             // 超女编号。union              // 定义匿名共同体udata。{int        a;double b;char     c[21];};
};int main()
{st_girl girl;cout<<sizeof(girl)<<endl; //输出是32 = 4 + 4 + 24; 空的union占1个字节;那为什么4个呢,因为得字节对齐return 0;
}

8)共用体使用方法:

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。union udata         // 定义共同体udata。
{int        a;double b;char     c[21];
};int main()
{udata data;cout << "sizeof(data)="<< sizeof(data) << endl;cout << "data.a的地址是:" << (void*) & data.a << endl;	//输出地址相同cout << "data.b的地址是:" << (void*) & data.b << endl;//输出地址相同cout << "data.c的地址是:" << (void*) & data.c << endl;//输出地址相同data.b = 30; cout << "data.a=" << data.a << endl;cout << "data.b=" << data.b << endl;cout << "data.c=" << data.c << endl;
}

输出结果:
sizeof(data)=24
data.a的地址是:0x7ffd02aa4860
data.b的地址是:0x7ffd02aa4860
data.c的地址是:0x7ffd02aa4860
data.a=0
data.b=30
data.c=

相关文章:

c++学习第十三

1)循环引用的案例及解决办法: #include <iostream> #include <memory> using namespace std; class A;class B { public:B(){cout<<"B constructor---"<<endl;}~B(){cout<<"B deconstructor----"<<endl;}std::weak_…...

java复习-线程的同步和死锁

线程的同步和死锁 同步问题引出 当多个线程访问同一资源时&#xff0c;会出现不同步问题。比如当票贩子A&#xff08;线程A&#xff09;已经通过了“判断”&#xff0c;但由于网络延迟&#xff0c;暂未修改票数的间隔时间内&#xff0c;票贩子B&#xff08;线程B&#xff09;…...

Qt指示器设置

目录 1. 样式设置 2. 行为设置 3. 交互设置 创建一个进度指示器控件 在Qt中设置指示器&#xff08;Indicator&#xff09;的外观和行为通常需要操作相关部件的属性和样式表。以下是如何在Qt中设置指示器的一些常见方式&#xff1a; 1. 样式设置 你可以使用样式表&#xf…...

计算机网络第四节 数据链路层

一&#xff0c;引入数据链路层的目的 1.目的意义 数据链路层是体系结构中的第二层&#xff1b; 从发送端来讲&#xff0c;物理层可以将数据链路层交付下来的数据&#xff0c;装换成光&#xff0c;电信号发送到传输介质上了 从接收端来讲&#xff0c;物理层能将传输介质的光&…...

Vue.js not detected解决方法

扩展程序》管理扩展程序》详情》允许访问文件地址打开...

Window10安装PHP7.4

1. 下载PHP 7 首先需要下载PHP 7的安装包&#xff0c;可以从PHP官网&#xff08;https://www.php.net/downloads.php&#xff09;或者Windows下的PHP官网&#xff08;http://windows.php.net/download/&#xff09;下载Windows版本的PHP 7安装包。根据自己的系统架构&#xff…...

【C++刷题】二叉树进阶刷题

根据二叉树创建字符串 class Solution { public:/** ()的省略有两种情况* 1.左右都为空&#xff0c;省略* 2.左子树不为空&#xff0c;右子树为空&#xff0c;省略*/string tree2str(TreeNode* root){string s;if(root nullptr){return s;}s to_string(root->val);if(root…...

有效的数独

有效的数独 题目: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。示例 1&#xff1a; 输…...

Vue导航守卫beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave

Vue导航守卫以我自己的理解就是监听页面进入,修改,和离开的功能。每个守卫接受三个参数 to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。 next(): 进行…...

小红书《乡村振兴战略下传统村落文化旅游设计》中南大许少辉八一新著

小红书《乡村振兴战略下传统村落文化旅游设计》中南大许少辉八一新著...

Android13 下拉菜单栏中添加快捷截图按钮

Android 13 原生系统下拉状态栏中是没有快捷截图按钮,现在需要添加快捷截图功能。 添加快捷截图功能后的效果图: 涉及修改的文件如下: modified: vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml modified: vendor/mediatek/proprietary/…...

GFS文件系统

GFS 分布式文件系统 GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。 由存储服务器、客户端以及NFS/Samba 存储网关&#xff08;可选&#xff0c;根据需要选择使用&#xff09;组成。 没有元数据服务器组件&#xff0c;这有助于提升整个系统的性能、可靠性和稳定性。 …...

22 相交链表

相交链表 题解1 快慢双指针改进 (acb bca)题解2 哈希表(偷懒) 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 题目数据 保证 整个链式结构中不存在环。 注意&#xff…...

简历(快速上手)

简历 文章目录 简历简历模板:排版上:内容上:沟通上: 简历在面试中起到关键作用 网申,HR只会花10秒多来看一下 内推,如果简历没优势就只能pass 简历模板: ⽊及简历&#xff08;推荐! &#xff09; &#xff1a; https://resume.mdedit.online 排版上: 尽量简洁&#xff0c;…...

wpf复制xaml及其cs窗体到其他项目 添加现有项,选 .xaml.cs,点添加即可。VS2022

添加现有项&#xff0c;选 LoadingWindow.xaml.cs&#xff0c;点添加即可。...

在线旅游平台步入新时代,携程如何走出自己的路?

今年旅游从线下到线上全方位火了。有统计数据&#xff0c;一季度&#xff0c;光是抖音&#xff0c;旅游达人发布视频数量就高达175万条&#xff0c;播放量1350亿次&#xff0c;收获27亿次点赞。在这一趋势下&#xff0c;许多“不出名”的景区和酒店借势抖音达人完成“出圈”。短…...

java中feign远程调用底层是用Hystrix作为熔断器吗?

在较新的版本中&#xff0c;Feign 默认使用 OpenFeign 作为远程调用的底层实现&#xff0c;并且集成了 Netflix Hystrix 作为熔断器。然而&#xff0c;需要注意的是&#xff0c;自 Feign 10.x 版本开始&#xff0c;默认已不再集成 Hystrix。 在 Feign 中&#xff0c;Hystrix 被…...

Web安全——穷举爆破下篇(仅供学习)

Web安全 一、常见的端口服务穷举1、hydra 密码穷举工具的使用2、使用 hydra 穷举 ssh 服务3、使用 hydra 穷举 ftp 服务4、使用 hydra 穷举 mysql 服务5、使用 hydra 穷举 smb 服务6、使用 hydra 穷举 http 服务7、使用 hydra 穷举 pop3 服务8、使用 hydra 穷举 rdp 服务9、使用…...

强大的JTAG边界扫描(5):FPGA边界扫描应用

文章目录 1. 获取芯片的BSDL文件2. 硬件连接3. 边界扫描测试4. 总结 上一篇文章&#xff0c;介绍了基于STM32F103的JTAG边界扫描应用&#xff0c;演示了TopJTAG Probe软件的应用&#xff0c;以及边界扫描的基本功能。本文介绍基于Xilinx FPGA的边界扫描应用&#xff0c;两者几乎…...

苍穹外卖集成 Apache POI Java实现Excel文件的读写下载

苍穹外卖 day12 Echats 营业台数据可视化整合_软工菜鸡的博客-CSDN博客 Apache POI - the Java API for Microsoft Documents Project News 16 September 2022 - POI 5.2.3 available The Apache POI team is pleased to announce the release of 5.2.3. Several dependencies …...

医疗预约小程序实战:从Axure原型到低代码开发的完整避坑指南

医疗预约小程序实战&#xff1a;从Axure原型到低代码开发的完整避坑指南 在医疗行业数字化转型的浪潮中&#xff0c;一个流畅、可靠的线上预约系统&#xff0c;早已不是锦上添花的“加分项”&#xff0c;而是提升服务效率、优化患者体验的“必答题”。然而&#xff0c;从一张精…...

突破远程文件壁垒:sshfs核心功能与多线程技术解析

突破远程文件壁垒&#xff1a;sshfs核心功能与多线程技术解析 【免费下载链接】sshfs File system based on the SSH File Transfer Protocol 项目地址: https://gitcode.com/gh_mirrors/ssh/sshfs sshfs是一款基于SSH文件传输协议&#xff08;SFTP&#xff09;的文件系…...

EasyAnimateV5-7b-zh-InP参数详解:Sampling Method(Flow算法)原理与选型

EasyAnimateV5-7b-zh-InP参数详解&#xff1a;Sampling Method&#xff08;Flow算法&#xff09;原理与选型 1. 理解Sampling Method在视频生成中的重要性 当你使用EasyAnimateV5-7b-zh-InP模型生成视频时&#xff0c;Sampling Method&#xff08;采样方法&#xff09;可能是…...

Spring Boot 3.5.x 实战:SpringDoc 2 与 Swagger3 的深度集成与配置优化

1. 为什么在Spring Boot 3.5.x时代&#xff0c;我坚定地选择了SpringDoc 2 如果你和我一样&#xff0c;是从Spring Boot 2.x时代一路升级上来的老开发者&#xff0c;那你肯定对Swagger 2.x和它的老朋友springfox-boot-starter不陌生。当年&#xff0c;它几乎是Spring Boot项目生…...

利用快马平台快速构建资源下载器原型,验证核心下载逻辑与界面设计

最近在做一个资源下载工具的小项目&#xff0c;想快速验证一下核心的下载逻辑和界面设计是否可行。如果从零开始&#xff0c;光是搭建环境、处理网络请求和构建界面就得花不少时间。这次我尝试用InsCode(快马)平台来快速生成一个原型&#xff0c;整个过程比预想的要顺畅很多。 …...

猎头是什么意思?

简单来说&#xff0c;“猎头”是“高级人才寻访”的通俗说法&#xff0c;专门帮助企业寻找和招聘高端人才。 它和你理解的普通“招聘”确实有很大不同&#xff0c;核心区别在于&#xff1a; 服务对象&#xff1a;猎头服务于企业&#xff08;客户&#xff09;&#xff0c;免费为…...

Android毕设开题报告效率提升指南:从选题到技术方案的标准化流程

作为一名经历过毕业设计“洗礼”的过来人&#xff0c;我深知开题报告是横在项目启动前的一道坎。选题新颖怕实现不了&#xff0c;选题保守又怕缺乏亮点&#xff0c;技术选型更是让人眼花缭乱。今天&#xff0c;我想分享一套经过实践检验的标准化流程&#xff0c;希望能帮你把开…...

变参函数之最大值函数

...

第三章 第一性原理:从零到一的完整思考方法论

第三章 第一性原理:从零到一的完整思考方法论 一、开篇:为什么你懂了原理,还是不会用 前两章讲了第一性原理的哲学源头和底层结构。很多读者反馈:道理明白了,但面对真实问题时,还是不知道怎么下手。 这是正常的。从"知道"到"做到",中间隔着方法论…...

浏览器提示“代理服务器可能有问题”?三步排查法帮你快速解决

1. 问题初现&#xff1a;当浏览器突然“罢工” 相信不少朋友都遇到过这种情况&#xff1a;正想打开浏览器查个资料、看个视频&#xff0c;结果页面没刷出来&#xff0c;反而弹出一个让人心头一紧的提示——“代理服务器可能有问题”。那一瞬间&#xff0c;感觉就像开车时突然亮…...