C++基础入门篇

C++入门

第一个C++程序

        首先C++兼容c语言,所以由c语言实现的内容仍然可以在C++中实现,但是c语言的文件后缀是.c但是C++的后缀是.cpp。vs对于cpp文件使用C++编译器编译,linux需要用g++编译而不是gcc

#include<stdio>
int main()
{printf("hello world\n");return 0;
}

         C++的输出格式则为:

#include<isotream>
using namespace std;
int main()
{cout<< "hello world" <<endl;return 0;
}

        其中包括的头文件 以及namespace都会在下文讲述

命名空间

        namespace为命名空间

        在c/c++中,有大量的变量、函数、类等因素,这些变量、函数体、类的名字都将存在于全局作用域中,很容易导致冲突,命名空间就是为了避免冲突,对标识符的名称进行本地化,以避免名空间的冲突,namespace就出现了。

        例如:printf在类和全局中都定义了 这里会报错

#include <iostream>
using std::printf;
int printf = 1;
int main()
{printf();
}

        namespace定义

        namespace定义命名空间,后面要跟命名空间的名字,然后使用{},在{}中写命名空间成员变量,其中成员可以是变量,函数。类型。

namespace my_std
{struct ppprintf{};class pppprintf{};int pprintf(){}int printf;
}

        namespace是一个域,用于和其它域区分独立,使用不同的域可以取消一些命名冲突。

namespace my_std
{int printf = 1;
}
#include<iostream>
using namespace std;
int main()
{my_std::printf = 5;printf("%d", my_std::printf);return 0;
}

        C++中有函数局部域,全局域,命名空间域,类域;域影响编译语时查找的变量/函数/类型的出处,或者声明定义的出处,隔离了域,就隔离了名字冲突。局部域和全局域会影响查找逻辑和变量的生命周期,命名空间域和类域不影响变量生命周期。

        namespace只能定义在全局,也可以嵌套定义,不过也要嵌套调用。

        多个工程文件(头文件,cpp文件等)中定义的同名域,会被认为成为同一个namespace,不会发生冲突。

//1.h
namespace a
{namespace b{//...}
}
namespace a
{namespace c{//...}
}
//2.h
namespace a
{//...
}
//1.h和2.h的a被认为是一个域
//b 和 c都包含在a中 
int main()
{
/*a:://...a::b:://...
*///嵌套调用return 0;
}

        C++标准库都放在std(standard)的命名空间中,使用using namespace std;可以展开std;

#include<isotream>
using namespace std;
int main()
{cout<< "hello world" <<endl;return 0;
}

        命名空间的使用

         编译查找一个变量的声明/定义的时候,默认在局部或者全局查找,不到命名空间中去查找,所以需要用以下方式使用。

        指定那个命名空间访问

        用using展开命名空间的某个成员

        用using展开整个命名空间,不建议使用。

#cinlude<iostream>
using std::cout;//使用某个成员
using namesapce std;//展开整个命名空间
int main()
{std::cout<<"hello world";//指明类域调用;cout<<"hello world";//using std::cout后可以这样调用;cout<<"hello world"<<endl;//endl是展开整个std中包含的;
}

 C++的输入输出

        <iostream>是标准输入。输出流库,定义了标准的输入输出对象。

        std::cin是istream类的对象,它主要面向窄字符的标准输入流(narrow characters)。

        std::cout是ostream类的对象,主要买那些窄字符的标准输出流。

        std::endl是一个函数,流插入输出是,相当于插入一个换行字符和刷新缓冲区。

        <<是流插⼊运算符,>>是流提取运算符。

        C++的输入输出可以自己识别变量类型,更方便(使用函数重载实现的)。

        IO流涉及到了类和对象,运算符重载、继承等面向对象的知识。

        cout/cin/endl都属于C++的标准库,C++标准库都放在std的命名空间中,要通过命名空间的使用方式去使用

        即使没包含<stdio.h>也可以使用printf和scanf是因为<iostream>中简介包含了。Vs系列包含了,其它编译器可能报错。

#include<iostream>
using namespace std;
int main()
{int a = 1;char b = 'b';cout<< a << ' ' << b << endl;printf("%d,%c",a,b);scnaf("%d,%c",&a,&b);cin>>a;cin>>b;return 0;
}

缺省参数

        缺省参数是声明或定义函数时作为函数的参数指定的缺省值,在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。

        全缺省就是所有形参都给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数被絮从右往左依次连续缺省,不能间跳跃给缺省值。

        函数声明和定义分离式,缺省参数不能再函数的声明和定义中同时出现,规定必须函数声明给缺省值。

//1.h
int add(int x;int y = 1)//从左往右给值 必须在声明中给缺省值
//1.c
int add(int x;int y)
{return x+y;
}
int b(int x = 1;int y = 1)// 全缺省
{return x-y;
}

函数重载

        C++支持函数重载,要求同名函数的形参不同,或者参数个数不同,类型不同,形成了多态行为。

//参数类型不同
int a(int a,int b);
int a(char a,char b);
//参数个数不同
int a();
//参数顺序不同
int a(int a,char b);
int a(char a,int b);
//特殊
int a(int a = 1);
//这个会与 int a()冲突,编译器不知道调用谁,会报错。

 引用

        引用就是 类型&别名 = 引用对象

        引用并不是定义了一个新的内存空间,就知识给已经存在的变量取了一个其它的名字罢了,并不会开辟新的内存空间,与原有的变量共用同一块内存空间。

#include<iostream>
using namespace std;int main()
{int a = 0;int& b = a;//这里b就是a的别名 把b当a的类型操作就行了++b;cout<< b;return 0;
}

          引用的特性

        引用在定义的时候必须初始化,因为是在已有的变量上取名字。

        一个变量可以有多个引用

        引用初始化后,就不能再引用到其它实体。

#include<iostream>
using namespace std;int main()
{int a = 0;int& b = a;//如果是 int&b 会直接报错//无法改变b的引用return 0;
}

        引用的使用

        引用在实践中,主要用于传参和引用做返回值中减少拷贝提高小于和改变引用对象时同时改变引用对象。

        引用传参和指针传参类似,引用传参相对方便。

        引用做返回值也是存在的,之后会见到

        引用和指针在实践中,虽然在功能上有重叠性,但是各有特点且互相不可替代。

        引用可以简化程序,避开复杂指针

void swap(int& a,int&b)//引用版本
{int c = a;a = b;b = c;
}
void swap(int* a,int*b)//指针版本
{int c = *a;*a = *b;*b = *c;
}

        const的引用

        可以引用const对象,但是必须用const引用,const引用可以引用普通对象,因为相当于权限缩小了,权限只能缩小不能放大。

        不过对于 int&b = a*3;doubel d = 1.1;int& c = d;的场景中,因为有计算,或者类型转换,会产生一个临时对象用于存储a*3的值和d类型转换的值,必须要用const,因为这个临时变量可以认为是const类型的。临时变量就是操作过程中的中间变量,只用来存值,没有名字。

int main()
{int a = 1;int& b = a;const int& e = b;//e不能++ 权限缩小了const int c = 1;const int& d = c;return 0;
}

        指针和引用的关系

        首先,他俩在C++中,相辅相成,虽然有功能重叠性,但是都有各自特点不可互相替代。

        指针要开空间,变量只是取别名,不开辟空间。

        引用必须初始化,指针可以不用初始化。

        引用不可更改引用对象,指针可以更改指向对象。

        引用大小就是引用类型大小,指针是对于平台下的大小。

        指针会出现空指针也野指针的问题,引用很少出现,相对安全。

inline

        inline修饰的函数,是内联函数,编译时C++会在调用的地方展开内联函数,这样调用内联函数就可以不建立栈帧了,可以提高效率。

        inline对于编译器只是建议,展开与否由编译器决定,C++标准并没有规定这个。

        inline适用于频繁调用的短小函数,对于递归和代码量很大的函数,即使加上了inline也会被编译器忽略。

        C语言中,宏函数会在预处理时候展开,但是宏函数实现不仅复杂且容易出错,而且不方便调试,C++设计inline的目的就是替代宏函数。

        inline不建议声明和定义分离,分离会导致连接错误,因为inline展开后就没有函数地址了,无法连接。

#include<iostream>
using namespace std;
//#defin ADD(x,y) ((x)+(y))
inline int ADD(int x,int y)
{return x+y;
}
//不支持声明和定义分离到两个文件
int main()
{int x = ADD(1,1);return 0;
}

nullptr 

        NULL是一个宏定义

#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif

        C++中NULL可能是字面意思的0,也可能是被定义为无类型指针常量((void*)0),无论采用何种定义,在使用空值的指针时候,都不可避免的会遇到一些麻烦,如f(NULL)会不确定的调用int*参数还是int类型参数。

        C++11引用nullptr是一个关键字,是一种特殊类型的字面量,可以转换成任意其他类型的指针类型,使用nullptr可以避免类型转换问题,因为nullptr只能被隐式转换为指针类型不能转化为整数类型。

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

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

相关文章

基于YOLOv11的火焰实时检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

100多种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型 摘要&#xff1a; 本文提出了一种基于YOLOv11算法的火灾检测系统&#xff0c;利用1852张图片&#xff08;1647张训练集&#xff0c;205张验证集&#…

Python入门(10)--面向对象进阶

Python面向对象进阶 &#x1f680; 1. 继承与多态 &#x1f504; 1.1 继承基础 class Animal:def __init__(self, name, age):self.name nameself.age agedef speak(self):passdef describe(self):return f"{self.name} is {self.age} years old"class Dog(Anim…

算法——两两交换链表中的节点(leetcode24)

这是一道对于链表节点进行操作的题目非常考验对于链表操作的基本功&#xff1b; 解法: 本题的解法结合下图来进一步解释 创建一个虚拟节点指向头结点以便使代码逻辑看起来更为简便且操作节点容易,定义cur是为了方便找到cur之后的两个节点进行交换操作定义pre和aft是为了保存执…

【提效工具开发】管理Python脚本执行系统实现页面展示

Python脚本执行&#xff1a;工具管理Python脚本执行系统 背景 在现代的软件开发和测试过程中&#xff0c;自动化工具和脚本的管理变得至关重要。为了更高效地管理工具、关联文件、提取执行参数并支持动态执行Python代码&#xff0c;我们设计并实现了一套基于Django框架的工具…

鸿蒙开发:ForEach中为什么键值生成函数很重要

前言 在列表组件使用的时候&#xff0c;如List、Grid、WaterFlow等&#xff0c;循环渲染时都会使用到ForEach或者LazyForEach&#xff0c;当然了&#xff0c;也有单独使用的场景&#xff0c;如下&#xff0c;一个很简单的列表组件使用&#xff0c;这种使用方式&#xff0c;在官…

Figma插件指南:12款提升设计生产力的插件

在当今的设计领域&#xff0c;Figma已经成为许多UI设计师和团队的首选原型和数字设计软件。随着Figma的不断更新和插件库的扩展&#xff0c;这些工具极大地提升了设计工作的效率。本文将介绍12款实用的Figma插件&#xff0c;帮助你在UI设计中更加高效。 即时AI 即时AI利用先进…

揭秘云计算 | 5、关于云计算效率的讨论

一、 公有云效率更高&#xff1f; 解&#xff1a;公有云具有更高的效率。首先我们需要知道效率到底指的是什么。这是个亟须澄清的概念。在这里效率是指云数据中心&#xff08;我们将在后文中介绍其定义&#xff09;中的IT设备资源利用率&#xff0c;其中最具有代表性的指标就是…

Spring Boot 和 Spring Cloud 构建一个完整的微服务架构——在线购物系统

接上一篇博客&#xff0c;大家可以结合一起看看实例理解https://blog.csdn.net/speaking_me/article/details/143917383?spm1001.2014.3001.5502 构建一个综合性的大型微服务项目可以帮助开发者更全面地理解和掌握 Spring Boot 和 Spring Cloud 的应用。 接下来&#xff0c;…

Flutter:AnimatedPadding动态修改padding

// 默认top为10&#xff0c;点击后修改为100&#xff0c;此时方块会向下移动 padding: EdgeInsets.fromLTRB(left, top, right, bottom),class _MyHomePageState extends State<MyHomePage> {bool flag true;overrideWidget build(BuildContext context) {return Scaffo…

【c++丨STL】stack和queue的使用及模拟实现

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、什么是容器适配器 二、stack的使用及模拟实现 1. stack的使用 empty size top push和pop swap 2. stack的模拟实现 三、queue的…

JavaEE初学07

JavaEE初学07 MybatisORMMybatis一对一结果映射一对多结果映射 Mybatis动态sqlif标签trim标签where标签set标签foreach标签补充 在这里插入图片描述右击运行即可 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c71d44d027374a399d5d537ce96f00e1.png) Mybatis Myba…

《Spring Cloud 微服务架构探秘》

一、Spring Cloud 微服务架构概述 Spring Cloud 是基于 Spring Boot 构建的微服务开发框架&#xff0c;它充分利用了 Spring Boot 的便利性&#xff0c;极大地简化了分布式系统基础设施的开发。 Spring Cloud 具有诸多显著特点。首先&#xff0c;它提供了丰富的组件&#xff0…

Hive基础笔记

安装Hive并连接MySQL ubuntukylin-22.04.1安装Hive、MySQL、配置Hive及Hive连接MySQL操作 启动/退出Hive 启动并登陆mysql shell service mysql start # 启动mysql服务 mysql -u root -p # 登陆shell界面启动hive之前&#xff0c;请先启动hadoop集群 启动hive 进入hive安…

【AIGC】破解ChatGPT!如何使用高价值提示词Prompt提升响应质量

文章目录 为什么高价值提示词如此重要&#xff1f;&#x1f50d;1.1 提升响应的相关性和准确性1.2 节省时间与资源1.3 增强用户体验 了解ChatGPT的工作原理&#x1f9e0;2.1 语言模型的训练过程2.2 上下文理解与生成2.3 限制与挑战 高价值提示词的核心要素✍️3.1 清晰明确的指…

D74【 python 接口自动化学习】- python 基础之HTTP

day74 http基础定义 学习日期&#xff1a;20241120 学习目标&#xff1a;http定义及实战 -- http基础介绍 学习笔记&#xff1a; HTTP定义 HTTP 是一个协议&#xff08;服务器传输超文本到浏览器的传送协议&#xff09;&#xff0c;是基于 TCP/IP 通信协议来传递数据&…

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-conv.py

conv.py ultralytics\nn\modules\conv.py 目录 conv.py 1.所需的库和模块 2.def autopad(k, pNone, d1): 3.class Conv(nn.Module): 4.class Conv2(Conv): 5.class LightConv(nn.Module): 6.class DWConv(Conv): 7.class DWConvTranspose2d(nn.ConvTranspose2d)…

2025 -生物信息学- GEO - 神经网络分析-ANN

GEO - 神经网络分析-ANN 01. 准备文件 id GSM3587381_con GSM3587382_con GSM3587383_con GSM3587384_con GSM3587385_con GSM3587386_con GSM3587387_con GSM3587388_con GSM3587389_con GSM3587390_con GSM3587391_con GSM3587392_con GSM3587393_con GSM3587394_con GSM358…

uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px&#xff0c;一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准&#xff0c;750rpx恰好为屏幕宽度。屏幕变宽&#xff0c;rpx 实际显示效果会等比放大…

5G Non-Public Network(三)Public Network Integrated NPN

这篇我们来看下PNI-NPN,之前都没有提到NPN引入的背景,这里就简单看下。 NPN引入的背景如上,就不细说了,贴在这里,确实很简单的看了下。紧接着就来看下规范上的内容。 相比于SNPN,PNI-NPN是PLMN提供的NPN,内容也要少很多,下面的内容参考38.300,38.331 ,38.304,23.50…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…