C++学习概述
1.c++ 为啥需要头文件
如果您刚开始使用 C++,您可能想知道为什么C++需要 #include 头文件,以及为什么一个程序要拥有多个 .cpp 文件。 原因很简单:
a) 减少编译时间
随着程序的增长,您的代码也会增长,如果所有内容都在一个文件中,那么每次进行任何微小更改时都必须完全重新编译所有内容。对于小程序来说,这似乎没什么大不了的(实际上也不是),但是当您有一个合理大小的项目时,编译整个程序可能需要几分钟的时间。
你能想象在每次小改动之间都要等那么久吗?就像下面的情况:
编译/等待 8 分钟/“我靠,忘记分号”/编译/等待 8 分钟/调试/编译/等待 8 分钟/。。。。。。
b) 使代码更有条理
如果您将不同的功能模块分离到不同的文件中,那么在您想要进行修改时,更容易找到您正在寻找的代码。
(否则你需要盯着它并记住它是如何使用的、以及它是如何工作的)
c) 接口与实现分离
如果您不明白这意味着什么,请不要担心,我们将在本文中看到它的实际应用。
以上都是优点,但很明显缺点是,如果您不了解它是如何工作的,这反而会给你带来麻烦。
(但实际上,随着项目变得越来越大,头文件比很多其他的替代方案更简单)
C++ 程序的构建有两个阶段过程。
首先,每个源文件都是独立编译的。 编译器为每个编译的源文件生成中间文件。 这些中间文件通常称为对象文件(Linux中后缀为.o,Windows中后缀为.obj)——但不要将它们与代码中的对象混淆。 一旦所有文件都被单独编译,链接器将所有目标文件链接在一起,从而生成最终的二进制文件(程序)。
这意味着每个源文件都与其他源文件分开编译。因此,就编译而言,“a.cpp”对“b.cpp”内部发生的事情一无所知。
这里有一个简单的例子来说明:
// in myclass.cppclass MyClass
{
public:void foo();int bar;
};void MyClass::foo()
{// do stuff
}// in main.cppint main()
{MyClass a; // Compiler error: 'MyClass' is unidentifiedreturn 0;
}
即使在您的程序中(myclass.cpp)声明了 MyClass,它也没有在 main.cpp 中声明,因此当您编译 main.cpp 时会出现该错误。
这就是头文件的来源。头文件允许您使接口(在本例中为 MyClass 类)对其他 .cpp 文件可见,同时将实现(在本例中为 MyClass 的成员函数体)保留在其自己的 . .cpp 文件。 同样的例子,但略有调整:
// in myclass.hclass MyClass
{
public:void foo();int bar;
};// in myclass.cpp
#include "myclass.h"void MyClass::foo()
{
}//in main.cpp
#include "myclass.h" // defines MyClassint main()
{MyClass a; // no longer produces an error, because MyClass is definedreturn 0;
}
#include 语句基本上类似于复制/粘贴操作。 编译器将在编译文件时将#include 行“替换”为您包含的文件的实际内容。
2.c++ new对象
#include <iostream>
#include "hello.hpp"using namespace std;
using std::cout;
using std::endl;class Person {
public:int age;string name;Person(int a, string n) : age(a), name(n) {}void show(string n) const {cout << "This is method show,n=" << n << endl;}
};int main() {cout << "Hello, World!" << endl;//口语中的指针其实指的是指针变量。指针变量里面存放的是地址,而通过这个地址,就可以找到一个内存单元。//&a——就是通过取地址操作操作符,取出a的地址,所以,&a就是代表a的编号,即:&a就是a的地址//b是地址,使用*b来取对应值int a = 10;int *b = &a;cout << "sizeof:" << sizeof(b) << "value:" << *b << ",a的address:" << &a << "," << b << ",b的address:" << &b<< endl;int arrPoint[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};int *p = arrPoint; //指针指向数组首地址p++; //指针向前移动4个字节,指向数组第二个元素cout << "值:" << *p << endl; //p是地址,使用*p来取对应值int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};//获取数组在内存中的首地址cout << "数组中第一个元素的地址:" << &arrPoint[0] << endl;cout << "数组中第一个元素的地址:" << &arrPoint[1] << endl;//采用new运算符调用Hello *hello = new Hello();hello->show();//创建的对象会放入栈空间Hello hello2;hello2.show();Person *p2 = new Person(18, "jack");cout << p2->age << p2->name << endl;p2->show("szp");return 0;string s("hello world");string::iterator it = s.begin();while (it != s.end()) {cout << *it;it++;}
}
1.采用类名直接访问,创建的对象会放入栈空间,让其与局部变量在一定意义上等价起来。
2.采用new运算符调用
(1)创建的对象会放入堆空间,不会自动清除,需要手动detele清除,不然会产生内存泄漏问题。
(2)在堆中申请开辟一块区域,与java相同,java纯面向对象的原因之一就是对象都保存在堆中,不会出现在栈中。
3. << 符号
- << 在c++中有两种用途。
1.用于C++的I/O流的输入和输出中的输出,也就是用在cout中,它是一个提取运算符,表示把一个东西输出到标准输出设备比如显示器,如:cout<<“哈哈,哈哈!”,此时就会在屏幕上输出:哈哈,哈哈!和输入流中的cin>>相对应。<<运算符是可以重载的。
2.它作为逻辑运算中的左移运算符,表示把它左边的操作数左移n位,比如 a<<3;就表示把a的二进制表示方式左移3位,a左边移动的三位丢弃,后边空出的三位用0补充。
相关文章:
C++学习概述
1.c 为啥需要头文件 如果您刚开始使用 C,您可能想知道为什么C需要 #include 头文件,以及为什么一个程序要拥有多个 .cpp 文件。 原因很简单: a) 减少编译时间 随着程序的增长,您的代码也会增长,如果所有内容都在一个…...
关系型数据库和非关系型数据库
关系型数据库和非关系型数据库 关系型数据库非关系型数据库 非关系型数据库和关系型数据库是两种不同类型的数据库管理系统,它们用于存储和管理数据,但在数据组织和处理方式上有一些重要的区别。 关系型数据库 1.结构化数据存储:关系型数据库…...

基于SSM的快餐店点餐服务系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
使用vcpkg配置CGAL+visual studio 2022
先安装vcpkg C:\dev> git clone https://github.com/microsoft/vcpkg C:\dev> cd vcpkg C:\dev\vcpkg> .\bootstrap-vcpkg.bat 运行后,先执行 C:\dev\vcpkg> .\vcpkg.exe install yasm-tool:x86-windows 这是因为gmp库中有个bug,只能这样…...

【Spring面试】三、Bean的配置、线程安全、自动装配
文章目录 Q1、什么是Spring Bean?和对象有什么区别Q2、配置Bean有哪几种方式?Q3、Spring支持的Bean有哪几种作用域?Q4、单例Bean的优势是什么?Q5、Spring的Bean是线程安全的吗?Q6、Spring如何处理线程并发问题…...
flink连接kafka报:org.apache.kafka.common.errors.TimeoutException
测试flink1.12.7 连接kafka: package org.test.flink;import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutio…...
sql order by 排序 null值放最后,怎么写
在 SQL 中,可以使用 ORDER BY 子句对结果进行排序。如果要将 NULL 值放在最后,可以在排序列中使用 CASE 表达式来处理。 下面是一个示例查询,将 NULL 值放在最后进行排序: SELECT column1, column2 FROM your_table ORDER BY CAS…...

HDMI字符显示实验
FPGA教程学习 第十五章 HDMI字符显示实验 文章目录 FPGA教程学习前言实验原理程序设计像素点坐标模块字符叠加模块 实验结果知识点总结 前言 在HDMI输出彩条的基础上输出osd叠加信息。 实验原理 实验通过字符转换工具将字符转换为 16 进制 coe 文件存放到单端口的 ROM IP 核…...

Spring Cloud 框架搭建
Spring Cloud 框架搭建之一基础框架 创建父项目创建子项目 创建父项目 第一步:新建项目,填写基础信息 第二步:这里不需要其他组件直接点next即可。 第三步:pom文件添加下述代码,将父项目设置为pom文件形式打包&#…...
20个非常有用的单行Python代码片段
1. 写在前面 继上篇,继续在本文分享 20 个 Python 单行代码,可以在 30 秒或更短时间内轻松学会。这些单行代码不仅可以提高效率,同时使代码看起来更整洁、更易读。:) 个人博客: https://jianpengzhang.git…...
【LangChain系列 9】Prompt模版——MessagePromptTemplate
原文地址:【LangChain系列 9】Prompt模版——MessagePromptTemplate 本文速读: MessagePromptTemplate MessagesPlaceholder 在对话模型(chat model) 中, prompt主要是封装在Message中,LangChain提供了一些MessagePromptTemplat…...
ROS2的学习路径
学习ROS2的建议学习路径: 理解基础知识: 熟悉机器人操作系统(ROS)的概念及其架构。了解ROS2相对于ROS1的优势以及其提供的关键功能。 安装和配置: 在你选择的操作系统上安装ROS2(如Ubuntu、Windows、macOS…...
Maintaining leader role through timed lease mechanism
Continuous understanding of distributed systems design On the one hand 基于定时的租约机制来保持leader角色 基于定时的租约机制来保持leader角色的设计思想是一种在分布式系统中确保高可用性和系统一致性的解决方法。 在分布式系统中,通常会有一个角色被选举…...

Mysql InnoDB引擎 的hash索引
Mysql InnoDB引擎不支持hash索引,但是在内存结构中有一个自适应hash索引,来提高查询性能 当设置hash索引时会自动转换成btree索引 查一下mysql官方文档:https://dev.mysql.com/doc/refman/5.7/en/create-index.html innodb_adaptive_hash_i…...

23年PMP考试如何备考?
接下来我要分享的备考建议分为三个部分,考试相关、备考期间注意和刷题建议。 1、PMP考试相关 PMP考试时间一定不能忘记,要密切关注,或许会出现延期的情况。考试教材现在是第七版教材,建议买一本或者用pdf电子版打印出来…...
mysql数据库增量备份方案、备份计划(InsCode AI 创作助手)
一、备份计划 以下是MySQL数据库增量备份的一般计划: 创建完整备份:在自动备份计划开始前,先创建一次完整备份。这个备份将包含所有数据和表结构。保存增量备份:在每次备份计划完成后,保存增量备份。这个备份将包含从…...

【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案
1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18 而数据库中原始数据如下,并没有到下午5点…...
Javas | DecimalFormat类、BigDecimal类、Random类
目录: 1.DecimalFormat类2.BigDecimal类3.Random类4.需求:编写程序,生成5个不重复的随机数 1.DecimalFormat类 DecimalFormat 是 NumberFormat 的一个具体子类,用于格式十进制数字。 /*** 关于数字的格式化*/ public class Decima…...
机器学习 实战系列 总目录
1、机器学习实战-系列教程1:线性回归入门教程(项目实战、原理解读、源码解读) 机器学习实战-系列教程1:线性回归入门教程(项目实战、原理解读、源码解读) 2、机器学习实战-系列教程2:手撕线性回…...

机器学习——贝叶斯(三种分布)/鸢尾花分类分界图/文本分类应用
0、前言: 机器学习中的贝叶斯的理论基础是数学当中的贝叶斯公式。这篇博客强调使用方法,至于理论未作深究。机器学习中三种类型的贝叶斯公式:高斯分布(多分类)、多项式分布(文本分类)、伯努利分…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...