【C++】C++入门基础

article/2025/8/1 4:00:07

本文是小编巩固自身而作,如有错误,欢迎指出!

1.C++的第一个程序

C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的hello world依旧可以运⾏,C++中需要把定义⽂件 代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译

在c语言中我们的第一个程序是

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

而在C++中,就变成了类似的

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

2.命名空间 

2.1namespace的意义

在之前c语言,我们充分认识到一个问题,就是命名需要单一,可是要是在工程中,由多人编写的代码,难免会出现命名重复的情况,而c++就解决了这个问题。

使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的

2.2namespace的定义 

 • 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

 • namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。

 • C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。

 • namespace只能定义在全局,当然他还可以嵌套定义。

 • 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。

 • C++标准库都放在⼀个叫std(standard)的命名空间中。

namespace bit
{// 命名空间中可以定义变量/函数/类型 int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
int main()
{// 这⾥默认是访问的是全局的rand函数指针 printf("%p\n", rand);// 这⾥指定bit命名空间中的rand printf("%d\n", bit::rand);return 0;
}

可以看出未使用命名空间的rand和使用的不一样。

3.C++的输入输出 

• <iostream>是Input  Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输 出对象。 • std::cin 是istream类的对象,它主要⾯向窄字符(的标准输 ⼊流。

• std::cout是ostream类的对象,它主要⾯向窄字符的标准输出流。

 • std::endl是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。

 • >>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)

• 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊ 输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出。

 

#include <iostream>
using namespace std;
int main()
{int a = 0;double b = 0.1;char c = 'x';
cout << a << " " << b << " " << c << endl;std::cout << a << " " << b << " " << c << std::endl;scanf("%d%lf", &a, &b);printf("%d %lf\n", a, b);// 可以⾃动识别变量的类型 cin >> a;cin >> b >> c;cout << a << endl;cout << b << " " << c << endl;return 0;
}

如图所示,我们可以看到在c++中,cout<<   <<endl,其实就类似于printf,cin>>就类似于scanf 

4.缺省参数

• 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。

在调⽤该函数时,如果没有指定实参 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把 缺省参数也叫默认参数)

• 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。

• 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。 • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。

 

using namespace std;
void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func(); // 没有传参时,使⽤参数的默认值 Func(10); // 传参时,使⽤指定的实参 return 0;
}

 

// 全缺省 
void Func1(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
// 半缺省 
void Func2(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
int main()
{Func1();Func1(1);Func1(1, 2);Func1(1, 2, 3);Func2(100);Func2(100, 200);
}

 

 5.函数重载

C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。

说通俗一点,在c++中函数名可以相同了 ,只要里面的参数类型或者参数个数不同就可以

// 1、参数类型不同 
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
// 2、参数个数不同 
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同 
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}

我们可以看到,即使函数名相同,依旧可以调用。

6.引用

引用其实就很类似于c语言中的指针,其作用就是给函数取一个别名。

int main()
{int a = 0;// 引⽤:b和c是a的别名 int& b = a;int& c = a;// 也可以给别名b取别名,d相当于还是a的别名 int& d = b;++d;// 这⾥取地址我们看到是⼀样的 cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;return 0;
}

不难看出取的地址都是一样的,这也说明了应用并没有额外开辟空间,而是等同于原变量。 

6.1const引用

• 可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访 问权限在引⽤过程中可以缩⼩,但是不能放⼤。

大概是什么意思呢,就是应用的类型的权限可以缩小不能放大,举个例子就是const int修饰的变量不能被int&应用,但是int修饰的变量可被const int&引用

int main()
{const int a = 10;const int& ra = a;const int b = 20;int& rb = b;return 0;
}

 

 我们可以看到当权限放大的时候就会报错。

7.inline

• ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就需要建⽴栈帧了,就可以提⾼效率。

• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

简单点说就是inline修饰的函数会变成类似于宏的东西,编译器是否将其内联不在于你写没写inline

在于判断inline修饰的函数是否被其认为可以内联 

inline int Add(int x, int y)
{int ret = x + y;ret += 1;ret += 1;ret += 1;return ret;
}
int main()
{// 可以通过汇编观察程序是否展开 // 有call Add语句就是没有展开,没有就是展开了 int ret = Add(1, 2);cout << Add(1, 2) * 5 << endl;return 0;
}

8.nullptr

nullptr其实就是相当于c语言中的NULL,可是为什么要这样额外设计呢?原因就在于

NULL其实是一个宏,他在c语言是这样的

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

所以在以下代码就会出现这样的问题

#include<iostream>
using namespace std;
void f(int x)
{cout << "f(int x)" << endl;
}
void f(int* ptr)
{cout << "f(int* ptr)" << endl;
}
int main()
{f(0);
// 本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(int 
x),因此与程序的初衷相悖。 f(NULL);f((int*)NULL);// 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型 // f((void*)NULL);f(nullptr);return 0;
}

本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。

本次的c++入门仅仅限于指出一些常见的函数怎么使用以及一些常见的问题。

本文分享就到这里结束了,感谢阅读!


http://www.hkcw.cn/article/BDYRxIVXIG.shtml

相关文章

iEKF的二维应用实例

如果熟悉 EKF 与卡尔曼的推导的话&#xff0c;iEKF 就比较容易理解&#xff0c;关于卡尔曼滤波的推导以及EKF&#xff0c;可以参考以前的文章&#xff1a; 卡尔曼滤波原理&#xff1a;https://blog.csdn.net/a_xiaoning/article/details/130564473?spm1001.2014.3001.5502 E…

[IMX] 10.串行外围设备接口 - SPI

代码链接&#xff1a;GitHub - maoxiaoxian/imx 参考资料&#xff1a; https://zhuanlan.zhihu.com/p/290620901 SPI协议详解 - bujidao1128 - 博客园 SPI总线协议及SPI时序图详解 - Ady Lee - 博客园 目录 1.SPI 简介 2.I.MX6U ECSPI 简介 2.1.控制寄存器 1 - ECSPIx_CO…

评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡

评论功能开发全解析&#xff1a;从数据库设计到多语言实现-优雅草卓伊凡 一、评论功能的核心架构设计 评论功能看似简单&#xff0c;实则涉及复杂的业务逻辑和技术考量。一个完整的评论系统需要支持&#xff1a;内容评论、回复评论、评论点赞、评论排序、敏感词过滤等功能。 …

计算机视觉入门:OpenCV与YOLO目标检测

计算机视觉入门&#xff1a;OpenCV与YOLO目标检测 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 计算机视觉入门&#xff1a;OpenCV与YOLO目标检测摘要引言技术原理对比1. OpenCV&#xff1a;传统图像处理与机器学…

C语言进阶--自定义类型详解(结构体、枚举、联合)

1.结构体 1.1结构体的声明 1.1.1结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.2结构的声明 struct tag {member-list; }variable-list;struct Stu {//学生的属性char name[20];int age; };struct Stu {…

asio之async_result

简介 async_result用来表示异步处理返回类型 async_result 是类模板 type&#xff1a;为类模板中声明的类型&#xff0c;对于不同的类型&#xff0c;可以使用类模板特例化&#xff0c;比如针对use_future

Hash 的工程优势: port range 匹配

昨天和朋友聊到 “如何匹配一个 port range”&#xff0c;觉得挺有意思&#xff0c;简单写篇散文。 回想起十多年前&#xff0c;我移植并优化了 nf-HiPAC&#xff0c;当时还看不上 ipset hash&#xff0c;后来大约七八年前&#xff0c;我又舔 nftables&#xff0c;因为用它可直…

力扣HOT100之动态规划:198. 打家劫舍

这道题之前刷代码随想录的时候做过&#xff0c;这一次直接一遍过了&#xff0c;还是按照动规五部曲&#xff1a; 1.确定dp[i]的含义:将下标为0 ~ i的房子纳入考虑范围时所能取到的最大收益 2.确定递推公式:dp[i] max(dp[i - 2] nums[i], dp[i - 1]); 3.dp数组初始化:dp[0] n…

基于VU37P的高性能采集板卡

基于VU37P的高性能采集板卡是一款最大可提供20路ADC接收通道的高性能采集板卡。每路A/D通道支持1GS/s的采样率&#xff0c;分辨率为14bit&#xff0c;模拟输入带宽可达500MHz&#xff0c;交流耦合&#xff0c;输入阻抗50欧姆。 产品简介 可提供20路ADC接收通道的高性能采集板…

使用ssh-audit扫描ssh过期加密算法配置

使用ssh-audit扫描ssh过期加密算法配置 安装检查ssh的加密算法配置修改ssh的加密算法配置 安装 # pip3安装ssh-audit pip3 instal ssh-audit检查ssh的加密算法配置 # 检查ssh的配置 ssh-audit 192.168.50.149修改ssh的加密算法配置 # 查看ssh加密配置文件是否存在 ls /etc/c…

身份证信息OCR识别提取

要实现Python中的身份证OCR识别&#xff0c;可以采用以下步骤和工具&#xff08;结合开源库和API服务&#xff09;&#xff0c;以下是两种主流方案&#xff1a; 方案1&#xff1a;使用第三方OCR API&#xff08;推荐百度/腾讯云&#xff09; 百度OCR API 示例 注册并获取API …

C++之string的模拟实现

string 手写C字符串类类的基本结构与成员变量一、构造函数与析构函数二、赋值运算符重载三、迭代器支持四、内存管理与扩容机制五、字符串操作函数六、运算符重载总结 手写C字符串类 从零实现一个简易版std::string 类的基本结构与成员变量 namespace zzh { class string { …

Linux的调试器--gbd/cgbd

1.引入 #include <stdio.h> int Sum(int s, int e) {int result 0;for(int i s; i < e; i){result i;}return result; } int main() {int start 1;int end 100;printf("I will begin\n");int n Sum(start, end);printf("running done, result i…

云原生 Cloud Native Build (CNB)使用初体验

云原生 Cloud Native Build&#xff08;CNB&#xff09;使用初体验 引言 当“一切皆可云”成为趋势&#xff0c;传统开发环境正被云原生工具重塑。腾讯云CNB&#xff08;Cloud Native Build&#xff09;作为一站式开发平台&#xff0c;试图解决多环境协作难题。 本文将分享c…

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

目录 1 运算放大电路基础 1.1 概述 1.1.1 基本结构 1.1.2 理想特性 1.2 运算放大分析方法 1.2.1 虚短 1.2.2虚断 1.2.3 叠加定理 2 同向比例运算放大电路 2.1 概述 2.1.1 基本电路结构 2.1.2 电路原理 2.2 仿真分析 2.2.1 电压增益 2.2.2 相位分析 3 反向比例运…

系统思考:经营决策沙盘

今年是我为黄浦区某国有油漆涂料企业提供经营决策沙盘培训的第二年。在这段时间里&#xff0c;我越来越感受到&#xff0c;企业的最大成本往往不在生产环节&#xff0c;而是在决策错误上所带来的长远影响。尤其是在如今这个复杂多变的环境下&#xff0c;企业面临的挑战愈发严峻…

Java线程:并发/并行区别、线程生命周期、乐观锁/悲观锁

并发、并行 进程 正在运行的程序(软件)就是一个独立的进程线程是属于进程的&#xff0c;一个进程中可以同时运行很多个线程进程中的多个线程其实是并发和并行执行的 并发 进程中的线程是由CPU负责调度执行的&#xff0c;但CPU能同时处理线程的数量有限&#xff0c;为了保证…

等保测评-Mysql数据库测评篇

Mysql数据库测评 0x01 前言 "没有网络安全、就没有国家安全" 等保测评是什么&#xff1f; 等保测评&#xff08;网络安全等级保护测评&#xff09;是根据中国《网络安全法》及相关标准&#xff0c;对信息系统安全防护能力进行检测评估的法定流程。其核心依据《信…

mysql的Memory引擎的深入了解

目录 1、Memory引擎介绍 2、Memory内存结构 3、内存表的锁 4、持久化 5、优缺点 6、应用 前言 Memory 存储引擎 是 MySQL 中一种高性能但非持久化的存储方案&#xff0c;适合临时数据存储和缓存场景。其核心优势在于极快的读写速度&#xff0c;需注意数据丢失风险和内存占…

QNAP MEMOS 域名访问 SSL(Lucky)

注意&#xff1a;下述是通过ssh、docker-compose方式安装docker的&#xff0c;不是直接在container station中安装的哈&#xff01;&#xff01;&#xff01; 一、编辑docker-compose.yml文件 用“#”号标识的&#xff0c;在保存文件的时候建议去掉&#xff0c;不然有时候会出…