C++回顾(一)——从C到C++
前言
在学习了C语言的基础上,C++到底和C有什么区别呢?
1.1 第一个C++程序
#include <iostream>// 使用名为std的命名空间
using namespace std;int main()
{// printf ("hello world\n");// cout 标准输出 往屏幕打印内容 相当于C语言的 printf// << 左移操作符,在这里它的功能被改造,代表数据流向// << 代表数据从右端移到左端 右端是 "hello world"字符串,左端是 cout 标准输出// 所以 cout << "hello world" 代表将内容打印到标准输出// endl 代表换行,相当于 C语言的 '\n'// << 操作符可以连着使用cout << "Hello World!" << endl;return 0;
}
运行结果:
1.2 命名空间
1.2.1 为什么引入命名空间
- 命名空间将全局作用域分成不同的部分
- 不同命名空间中的标识符可以同名而不会发生冲突
- 命名空间可以相互嵌套
- 全局作用域也叫默认命名空间
1.2.2 怎么使用命名空间
(1)命名空间的定义
namespace 是C++中的关键字,用来定义一个命名空间,语法格式为:
namespace name {变量函数类
}
name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围
例如:
定义一个命名空间,名字叫NameSpaceA
namespace NameSpaceA
{int a = 0;
}
命名空间的定义可以嵌套,例如:
namespace NameSpaceB
{int a = 1;namespace NameSpaceC{struct Teacher{char name[10];int age;};}
}
(2)命名空间的使用
- 使用域解析符 ::
::是一个新符号,称为域解析操作符,在C++中用来指明要使用的命名空间。
NameSpaceA::a = 10; // 使用命名空间 NameSpaceA中的变量a
NameSpaceB::a = 20; // 使用命名空间 NameSpaceB中的变量aprintf ("%d, %d\n", NameSpaceA::a, NameSpaceB::a);
使用命名空间B中的命名空间C中的结构体 Teacher
NameSpaceB::NameSpaceC::Teacher t2 = {"xiaoming", 20};
- 使用using声明
在这里用using声明了 NameSpaceA::a, 它的意思是在声明以后的程序中如果出现未指明命名空间的a,就使用NameSpaceA命名空间里的a,如果要使用NameSpaceB命名空间中的a,则仍需要使用这样的方式 NameSpaceB::a;
using NameSpaceA::a;
a = 20; // 使用命名空间NameSpaceA中的a
NameSpaceB::a = 30; // 使用命名空间NameSpaceB中的a
using 声明不仅可以针对命名空间中的变量或者函数,还可以对整个命名空间进行声明,这样的方式声明命名空间以后,在后面使用未指定具体命名空间的变量或者函数产生命名冲突的时候,默认使用 NameSpaceB中的变量和函数。
using namespace NameSpaceB;
a = 10;printf ("%d\n", NameSpaceB::a);
示例代码:
#include <iostream>namespace A
{int a = 1;void print(){std::cout << "this is namespace A" << std::endl; //::作用域限定符}
}namespace B
{int a = 2;void print(){std::cout << "this is namespace B" << std::endl;}
}int main()
{//std::cout << a << std::endl; //a不是全局变量也不是main函数局部变量 所以未定义std::cout << A::a << std::endl;using namespace B;std::cout << a << std::endl;print();A::print();//using namespace A;// 这里如果不注释掉,编译不通过print();return 0;
}
1.3 register关键字的变化
- register关键字请求“编译器”将局部变量存储于寄存器中;
- C语言中无法取得register变量地址
- 在C++中依然支持register关键字
1、C++编译器有自己的优化方式,不使用register也可能做优化
2、C++中可以取得register变量的地址 - C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
#include <stdio.h>int main()
{register int i = 0; //声明寄存器变量 不能取地址for (i = 0; i < 1000; i++);&i; //C++ 对寄存器变量取地址 register 关键字变得无效return 0;
}
1.4 变量检测加强
- 在C语言中重复定义多个全局变量是合法的,这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上
- 在C++中不允许定义多个同名的全局变量
#include <stdio.h>// 在C语言中重复定义多个全局变量是合法的
// 这些同名的全局变量最终都会被链接全局数据区的同一个地址空间上
int g_a;
int g_a = 1;int main()
{printf ("%d\n", g_a);printf ("%p\n", &g_a);return 0;
}
1.5 struct类型加强
- C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型
- C++中的struct是一个新类型的定义声明
#include <stdio.h>struct Student
{char name[20];int age;
};int main()
{// C语言中 struct 定义了一组数据的集合,而不是一种新的数据类型// 所以在定义变量的时候需要在前面加上 struct 关键字进行修饰// C++中 struct 定义了一种新的数据类型,可以直接用来定义变量Student stu1 = {"xiaoming", 10};return 0;
}
1.6 C++中所有变量和函数都必须要有类型
1.6.1 C语言中函数的一些不好的使用方式
- 1 函数可以没有返回参数类型
- 2 函数参数可以没有数据类型
- 3 没有参数的函数可以接收任意个参数
#include <stdio.h>
// 1 函数可以没有返回参数类型
f()
{printf ("hello world\n");
}// 2 函数参数可以没有数据类型
g(i)
{return i;
}int main()
{// 3 没有参数的函数可以接收任意个参数f(1,2,3,4,5);g(12,15);return 0;
}
1.6.2 C++中的加强
-
在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数 -
在C++中
int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数 -
C++更加强调类型,任意的程序元素都必须显示指明类型
1.7 新增bool类型关键字
- C++在C语言的基本类型系统之上增加了bool,C++中的bool可取的值只有true和false
- 理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现
- true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表
- bool类型只有true(非0)和false(0)两个值;C++编译器会在赋值时将非0值转换为true,0值转换为false
#include <iostream>using namespace std;int main()
{bool a = true;bool b = false;a = 100;cout << a << endl;// 输出1cout << b << endl;// 输出0return 0;
}
1.8 三目运算符的增强
-
C语言返回变量的值 C++语言是返回变量本身
(1)C语言中的三目运算符返回的是变量值,不能作为左值使用
(2)C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方 -
注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
(a < b ? 1 : b )= 30; -
C语言如何支持类似C++的特性呢?
==>当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已
#include <stdio.h>// C语言中表达式的结果 放在什么地方? ==> 寄存器
// 1
// 表达式返回的是一个值,是一个数
// 在C++中,表达式返回的是变量本身// 2 如何做到的
// 让表达式返回一个内存空间..内存的首地址 指针
// 在C语言中如何实现C++的效果// 3 本质
// C++编译器自己做了取地址的操作
int main()
{int a = 10;int b = 20;// C++中三目运算符返回的是变量本身,所以可以作为左值使用// 这里C语言会报错(20 = 10),c++可以(b = 100)(a > b ? a : b) = 90; // 在C语言中让三目运算符可以当左值使用,可以通过返回变量地址实现*(a > b ? &a : &b) = 90;printf ("%d, %d\n", a, b);return 0;
}
相关文章:

C++回顾(一)——从C到C++
前言 在学习了C语言的基础上,C到底和C有什么区别呢? 1.1 第一个C程序 #include <iostream>// 使用名为std的命名空间 using namespace std;int main() {// printf ("hello world\n");// cout 标准输出 往屏幕打印内容 相当于C语言的…...
CRF条件随机场 | 关键原理+面试知识点
😄 CRF之前跟人生导师:李航学习过,这里结合自己的理解,精简一波CRF,总结一下面试中高频出现的要点。个人觉得没网上说的那么复杂,我看网上很大部分都是一长篇先举个例子,然后再说原理。没必要原理其实不难,直接从原理下手更好理解。 文章目录 1、概率无向图(马尔可夫…...

秒懂算法 | 回归算法中的贝叶斯
在本文中,我们会用概率的观点来看待机器学习模型,用简单的例子帮助大家理解判别式模型和生成式模型的区别。通过思考曲线拟合的问题,发现习以为常的损失函数和正则化项背后有着深刻的意义 01、快速理解判别式模型和生成式模型 从概率的角度来理解数据有着两个不同的角度,假…...
用Netty实现物联网01:XML-RPC和JSON-RPC
最近十年,物联网和云计算、人工智能等技术一道,受到业内各方追捧,被炒得火热,甚至还诞生了AIoT这样的技术概念。和(移动)互联网不同,物联网针对的主要是一些资源有限的硬件设备,比如监控探头、烟雾感应器、温湿度感应器、车载OBD诊断器、智能电表、智能血压计等。这些硬…...
腾讯云服务器centos7安装python3.7+,解决ssl问题
使用requests模块访问百度,报错如下: requests.exceptions.SSLError: HTTPSConnectionPool(hostwww.baidu.com, port443): Max retries exceeded with url: / (Caused by SSLError("Cant connect to HTTPS URL because the SSL module is not avail…...

C++【模板STL简介】
文章目录C模板&&STL初阶一、泛型编程二、函数模板2.1.函数模板概念2.2.函数模板格式2.3.函数模板的实例化2.4.模板参数的匹配原则三、 类模板3.1.模板的定义格式3.2.类模板的实例化STL简介一、STL的概念、组成及缺陷二、STL的版本C模板&&STL初阶 一、泛型编程…...

该学会是自己找bug了(vs调试技巧)
前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言初阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍c语言初阶的最后一篇.有关调试的重要性. 金句分享…...
Redis大全(概念与下载安装)
目录 一、概念 1.非关系型数据库(NoSQL)的介绍 2.什么是redis 3.redis的作者 4.Redis的特点 5.redis的应用场景 6.高度概括知识 一、二 缓存穿透、缓存击穿、缓存雪崩的概念 (一)缓存穿透 (二)缓…...

指针的进阶【上篇】
文章目录📀1.字符指针📀2.指针数组📀3.数组指针💿3.1.数组指针的定义💿3.2. &数组名VS数组名💿3.3.数组指针的使用📀1.字符指针 int main() {char ch w;char* pc &ch;// pc就是字符指…...

MATLAB | 如何用MATLAB绘制花里胡哨的山脊图
本期推送教大家如何绘制各种样式的山脊图,这里做了一个工具函数用来实现好看的山脊图的绘制,编写不易请多多点赞,大体绘制效果如下: 依旧工具函数放在文末。 教程部分 0 数据准备 数据为多个一维向量放在元胞数组中,…...

.Net与程序集
一个简单的C#程序回想一下我们第一个.net 程序 hello world,它具有那些步骤呢?打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来,上面打印着hello world。我们打开文件夹的bin目录,会发现里…...

软考中级之数据库系统(重点)
涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…...

界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!
DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能齐…...

【架构师】零基础到精通——网关策略
博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名退役Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小…...

【java 8】方法引用与构造器引用
📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言Ὅ…...

SGI 空间配置器
前言 空间配置器是 STL 六大组件之一,它总是隐藏在容器的背后,默默工作,默默付出。本文为《STL 源码剖析》读书笔记,主要讨论 SGI 版本空间的配置和释放,对代码进行解读时会改变一些写法,使其更易于阅读。…...

2023年白酒行业研究报告
第一章 行业概况 白酒是中国传统的酿酒业之一,历史悠久,源远流长。白酒指以高粱等粮谷为主要原料,以大曲、小曲或麸曲及酒母等为糖化发酵剂,经蒸煮、糖化、发酵、蒸馏、陈酿、勾兑而制成的,酒精度(体积分数)在18%-68%…...
华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 【2023】
合规数组 题目 给定一个正整数数组 检查数组中是否存在满足规则的数组组合 规则: A = B + 2C 输入 第一行输出数组的元素个数 接下来一行输出所有数组元素,用空格隔开 输出 如果存在满足要求的数 在同一行里依次输出规则里A B C的取值,用空格隔开 如果不存在输出0 示…...
华为OD机试真题Python实现【英文输入法】真题+解题思路+代码(20222023)
英文输入法 主管期望你来实现英文输入法单词联想功能,需求如下: 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词。按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。注意 英文单词联想时区分大小写缩略形式如"don’t&quo…...

改进YOLO系列 | 添加轻量化Decouple_Head 和 ASFF_Head
绿色为ASFF_Head,浅蓝色Decoupled_Head,深蓝色是第三步加的_initialize_dh_biases方法后的效果。 参数量与计算量对比 模型参数量 parameters计算量GFLOPsyolov5s_Head723538916.5ASFF_Head1267484725.0Decoupled_Head892869722.0结构图 本篇介绍的这个Decouple_Head和YOLOX…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...