当前位置: 首页 > news >正文

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语言的基础上&#xff0c;C到底和C有什么区别呢&#xff1f; 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模块访问百度&#xff0c;报错如下&#xff1a; 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调试技巧)

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言初阶的最后一篇.有关调试的重要性. 金句分享…...

Redis大全(概念与下载安装)

目录 一、概念 1.非关系型数据库&#xff08;NoSQL&#xff09;的介绍 2.什么是redis 3.redis的作者 4.Redis的特点 5.redis的应用场景 6.高度概括知识 一、二 缓存穿透、缓存击穿、缓存雪崩的概念 &#xff08;一&#xff09;缓存穿透 &#xff08;二&#xff09;缓…...

指针的进阶【上篇】

文章目录&#x1f4c0;1.字符指针&#x1f4c0;2.指针数组&#x1f4c0;3.数组指针&#x1f4bf;3.1.数组指针的定义&#x1f4bf;3.2. &数组名VS数组名&#x1f4bf;3.3.数组指针的使用&#x1f4c0;1.字符指针 int main() {char ch w;char* pc &ch;// pc就是字符指…...

MATLAB | 如何用MATLAB绘制花里胡哨的山脊图

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

.Net与程序集

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

软考中级之数据库系统(重点)

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

界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…...

【架构师】零基础到精通——网关策略

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名退役Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小…...

【java 8】方法引用与构造器引用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

SGI 空间配置器

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

2023年白酒行业研究报告

第一章 行业概况 白酒是中国传统的酿酒业之一&#xff0c;历史悠久&#xff0c;源远流长。白酒指以高粱等粮谷为主要原料&#xff0c;以大曲、小曲或麸曲及酒母等为糖化发酵剂&#xff0c;经蒸煮、糖化、发酵、蒸馏、陈酿、勾兑而制成的&#xff0c;酒精度(体积分数)在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…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...