C++ 手记

extern关键字

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。
当有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。通常用于当有两个或多个文件共享相同的全局变量或函数。

// 文件1
#include <iostream>
int count ;
extern void write_extern(); 
int main(){count = 5;   write_extern();
}// 文件2
#include <iostream>
extern int count; 
void write_extern(void){std::cout << "Count is " << count << std::endl
}

sizeof

返回变量内存占用的大小,单位为字节。

int a = 10;
sizeof(a);    // int 4个字节

指针运算符&*

&返回变量的地址。例如&a; 将给出变量的实际地址。
*指向一个变量。例如*var; 将指向变量 var。
举个例子:

int a = 10;
int* p = &a;
cout << "value of a = " << a << endl; // 10
// 输出在指针变量中存储的地址
cout << "value of p = " << p << endl; // 0x7ff7ba1fb368
// 访问指针中地址的值
cout << "value of *p = " << *p << endl; // 10int** pp = &p;
cout << "value of pp = " << pp << endl; // 0x7ff7bf660360
cout << "value of *pp = " << *pp << endl; // 0x7ff7bf660368

可以看到*p = a*pp = p

c++引用和指针

某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
引用很容易与指针混淆,它们之间有三个主要的不同:

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
// 声明简单的变量
int i = 5;
// 声明引用变量
int& r = i;  

函数参数

调用类型描述
传值调用该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
指针调用该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
引用调用该方法把参数的引用复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

c++中函数参数默认是传值调用

Lambda函数和表达式

C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。Lambda 表达式把函数看作对象。
基本语法:

[capture](parameters)->return-type{body}

在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。

[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

c++中c风格字符串

C 风格的字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello";

c++运算符重载

比如:

Timer operator+(const Timer& t);
Timer operator==(const Timer&, const Timer&);

虚函数

虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
举个例子

class Shape {
protected:int width, height;
public:Shape(int a = 0, int b = 0) {width = a;height = b;}void area() {cout << "Parent class area : NOTHING" << endl;}
};class Rectangle : public Shape {
public:Rectangle(int a = 0, int b = 0) : Shape(a, b) {}void area() {cout << "Rectangle class area :" <<  width * height << endl;}
};class Triangle : public Shape {
public:Triangle(int a = 0, int b = 0) : Shape(a, b) {}void area() {cout << "Triangle class area :" << width * height / 2 <<  endl;}
};

然后我们在调用的时候:

Shape* shape = new Rectangle(2, 3);
shape->area(); // NOTHING
Triangle triangle(2, 3);
shape = &triangle;
shape->area();   // NOTHING

造成这样的问题,就是因为调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态链接。

我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定
解决上边这个问题,加上virtual关键字:

virtual void area() {cout << "Parent class area : NOTHING" << endl;
}

另外我们上边在Shape中定义的area()函数完全没有意义,具体都由其子类去实现,那么这个时候,可以将其定义为纯虚函数

virtual void area() = 0;

c++ 动态内存

在 C++ 中,可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。这种运算符即new运算符。

如果您不需要动态分配内存,可以使用delete运算符,删除之前由new运算符分配的内存。

int* p = new int;
*p = 1;
cout << "value of p = " << *p << endl;
delete p;char* array = new char[1];
array[0] = 'a';
cout << "value of array = " << array << endl;
delete [] array;

函数模板和类模板

函数模板

模板函数定义的一般形式如下所示:

template <class type> ret-type func-name(parameter list){ // 函数的主体
}

在这里,type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。
比如一个返回比较大小值的函数:

template<typename T>
inline T const &Max(T const &a, T const &b) {return a < b ? b : a;
}

类模板

泛型类声明的一般形式如下所示:

template <class type> class class-name {...}

在这里,type 是占位符类型名称,可以在类被实例化的时候进行指定。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。

多线程

Linux POSIX

#include <pthread.h>
pthread_create (thread, attr, start_routine, arg)  //创建线程
pthread_exit (status)  // 退出线程
pthread_join(pthread_t , status) // 用于等待指定的线程终止,会阻塞调用它的线程
pthread_detach (threadid) // 用于将指定的线程标记为"可分离的",以便在线程终止时自动释放其资源

看一个例子:

void *thread_function(void *arg) {int *value = (int *)arg;int *result = new int;*result = *value + 5;pthread_exit(result);
}int main() {pthread_t thread;int value = 10;void *thread_result;pthread_create(&thread, NULL, thread_function, (void *)&value);pthread_join(thread, &thread_result);int* result = (int*)thread_result;printf("Thread returned: %d\n", *result);delete result;return 0;
}

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

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

相关文章

大数据学习之Redis,十大数据类型的具体应用(二)

目录 3.5 Redis 集合&#xff08;Set&#xff09; 单值多value&#xff0c;且无重复 sadd / smembers / sismember / srem / scard srandmember / spop smove 集合运算 应用场景 3.6 Redis有序集合Zset&#xff08;sorted set&#xff09; 有序有重复 zadd / zrange …

计算机设计大赛 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

Kafka 记录

推荐资源 官网http://kafka.apache.org/Githubhttps://github.com/apache/kafka书籍《深入理解Kafka 核心设计与实践原理》 Kafka 架构 Kafka使用ZooKeeper作为其分布式协调框架&#xff0c;其动态扩容是通过ZooKeeper来实现的。Kafka使用Zookeeper保存broker的元数据和消费者信…

代码随想录算法训练营29期Day35|LeetCode 860,406,452

文档讲解&#xff1a;柠檬水找零 根据身高重建队列 用最小数量的箭引爆气球 860.柠檬水找零 题目链接&#xff1a;https://leetcode.cn/problems/lemonade-change/description/ 思路&#xff1a; 很简单&#xff0c;模拟即可。统计五美元、十美元和十五美元的个数。给五美元…

cesium-加载地形图

废话不多说 直接代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-item>…

【Java万花筒】通信无限:构建强大的Java应用的电信与通信库

连接世界&#xff1a;发挥Java的电信与通信库的集成能力 前言 通信在现代社会中起着至关重要的作用&#xff0c;而在Java应用程序中集成通信功能可以为用户提供更好的体验。本文将介绍几个强大的电信与通信库&#xff0c;包括Java Communications API (javax.comm)、Apache C…

第3章-python深度学习——(波斯美女)

第3章 神经网络入门 本章包括以下内容&#xff1a; 神经网络的核心组件 Keras 简介 建立深度学习工作站 使用神经网络解决基本的分类问题与回归问题 本章的目的是让你开始用神经网络来解决实际问题。你将进一步巩固在第 2 章第一个示例中学到的知识&#xff0c;还会将学到的…

外汇监管牌照解析:确保交易安全与合规性

外汇交易中&#xff0c;资金安全与平台监管是大家最关心的话题。监管是评估外汇经纪商是否值得信赖、是否具备相关资质的关键依据&#xff0c;因此选择一家拥有海外合法监管的经济商至关重要。 那么&#xff0c;今天我们就来聊聊全球权威的几大监管机构 — FCA、ASIC、NFA、FSA…

【思科】 GRE VPN 的实验配置

【思科】GRE VPN 的实验配置 前言报文格式 实验需求配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN &#xff1a;&#xff08;Virtual Private Network&#xff09;&#xff0c;即“虚拟专…

多线程事务如何回滚?

背景介绍 1&#xff0c;最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一些其他修改操作&#xff0c;然后在执行插入操作&#xff0c;由于插入数据可能会很多&#xff0c;用到多线程去拆分数据并行处理来提高响应时间&#xff0c;如果有一个线程执行失败&am…

在Mixamo网站上,下载的动画导入unity给自己的模型添加后出错怎么解决

在Mixamo网站上&#xff0c;下载的动画导入unity给自己的模型添加后出错 一、在Mixamo下载的模型可以正常使用二、在自己的模型和unity自带模型上就出错1.解决方法2.解决成功 注意 一、在Mixamo下载的模型可以正常使用 二、在自己的模型和unity自带模型上就出错 1.解决方法 选…

C/C++ - 类的继承机制

目录 类继承 继承的本质 继承的作用 继承的语法 继承的权限 继承的构造析构 继承构造函数 继承析构函数 继承的基类调用 继承的对象赋值 继承与友元关系 继承与静态成员 不能被继承的类 构造函数 语法特性 单继承 单继承的特点 多继承 多继承概念 多继承语…

Linux ubuntu 20.4.6安装docker

这边需要在vm中使用docker&#xff0c;记录下 1.更新系统包列表 确保您的系统包列表是最新的 sudo apt update 2.安装依赖工具 sudo apt install apt-transport-https ca-certificates curl software-properties-common 3.添加Docker GPG密钥 curl -fsSL https://downloa…

Android Room数据库异常: Room cannot verify the data integrity.

文章目录 一、前言二、错误信息如下三、参考链接 一、前言 在Room数据库结构变动的情况下&#xff0c;如果没有进行Room数据库升级迁移&#xff0c;则会报错Room cannot verify the data integrity.。在实际开发过程中&#xff0c;数据库结构会经常变化&#xff0c;直到发版。…

Centos 7.9 在线安装 VirtualBox 7.0

1 访问 Linux_Downloads – Oracle VM VirtualBox 2 点击 ​the Oracle Linux repo file 复制 内容到 /etc/yum.repos.d/. 3 在 /etc/yum.repos.d/ 目录下新建 virtualbox.repo&#xff0c;复制内容到 virtualbox.repo 并 :wq 保存。 [rootlocalhost centos]# cd /etc/yum.rep…

【数据结构 05】双链表

一、原理 双链表又称双向链表&#xff0c;通常情况下是带头循环结构&#xff0c;在CSTL标准模板库中封装的<list.h>头文件就是带头双向循环链表。 特性&#xff1a;增删灵活且高效&#xff0c;支持随机增删但不支持随机访问 设计思路&#xff1a; 链表包含一个头节点h…

一维差分(c++题解)

题目描述 输入一个长度为n的整数序列。 接下来输入 个操作&#xff0c;每个操作包含三个整数 &#xff0c;表示将序列中 之间的每个数加上 。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数 n 和 m。 第二行包含n个整数&#xff0c;表示整数序列。 接下来…

【Linux】模拟实现一个简单的minishell

目录 从显示屏获取输入字符流 分割字符串 取出命令名称及选项 去除输入时多按的那个换行符 创建子进程&#xff0c;实现程序替换 如果替换失败&#xff0c;进程终止exit 查看子进程情况 实现echo $?功能 实现cd 最终代码 基本思路 让父进程创建一个子进程&#xff0c…

我用Java写了一个简单的二叉树算法

二叉树是一种常见的数据结构&#xff0c;它是由节点和连接节点的边组成的。每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。二叉树算法包括遍历、查找、插入、删除等操作。 class Node {int data;Node left, right;public Node(int item) {data item;left…

[NCTF2019]Fake XML cookbook(特详解)

先试了一下弱口令&#xff0c;哈哈习惯了 查看页面源码发现xml function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the usern…