C到C++入门基础知识
一:命名空间:namespace
(一):命名空间的定义
注:命名空间只能定义在全局,不能定义在函数内部。
(1)类似于C语言的结构体,C语言的命名空间定义为:
namespace name{ // name是命名空间的名字
//
}
(2)命名空间里成员可以是:变量/函数/自定义类型变量/类,等。
namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}
};
(3)命名空间可以嵌套定义:
namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}// 嵌套一个老师的命名空间namespace teacher {char* subject;int work_year;char* name;}
};
(4)在不同文件中定义同一个名字相同的命名空间会被编译器识别为同一个命名空间:
例如同一个项目中分别有两个.cpp文件,两个文件都有xs这命名空间,在编译的时候不会报错,编译器会将他们识别为同一个命名空间。
(5)C++的标准库的命名空间是std(standard).
(二):命名空间的使用
我们在命名空间中定义了变量,函数,类或者结构体等,如果我们没有解析命名空间,像C语言一样使用命名空间的对象和方法时会报错:
namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}namespace teacher {char* subject;int work_year;char* name;}
};int main()
{int a = 1;int b = 2;swap(&a, &b);return 0;
}

在使用命名空间域内定义的变量的时候有以下几种方法:
(1)指定命名空间访问:
:: 符号被称为作用域解析运算符
#include <stdio.h>namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}namespace teacher {char* subject;int work_year;char* name;}
};int main()
{int a = 1;int b = 2;// 这里指定xs这个命名空间域xs::swap(&a, &b);printf("a = %d \nb = %d", a, b);return 0;
}
(2)使用using关键字将命名空间中的某个成员展开
#include <stdio.h>namespace xs {int age;char name[10];int ID;struct xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}namespace teacher {char* subject;int work_year;char* name;}
};// 展开xs中的swap函数
using xs::swap;
int main()
{int a = 1;int b = 2;// 这里我们去掉xs::不会报错swap(&a, &b);printf("a = %d \nb = %d", a, b);return 0;
}
(3)使用using关键字展开命名空间中的全部成员:这种方式容易产生命名冲突等问题
#include <stdio.h>namespace xs {int age = 10;char name[10] = "小明";int ID;struct _xs{int height;char* hobies;};void swap(int* num1,int*num2){int tmp = *num1;*num1 = *num2;*num2 = tmp;}namespace _teacher {char* subject;int work_year;char* name;}
};// 展开命名空间中的全部成员,可以不用域解析::就可以随便访问命名空间内的所有成员了
using namespace xs;
int main()
{printf("age:%d\n name:%s", age, name);return 0;
}
(三):为什么要使用命名空间
(1).解决C语言命名冲突问题
(2).命名空间的本质是开出一个独立的域空间,C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
二:输入输出:cout / cin
说明:cout和cin是c++的标准输入输出类的对象,他们是标准库<iostream>中定义的,用于窄字符(narrowcharacters(oftypechar))的输入输出。
(1)同C语言相比cout和cin不需要格式化,他们支持任意类型的输入输出,会自动将其他类型转换成字符串类型
(2)cout/cin/(换行endl)等都被定义于C++标准库<iostream>,因为C++标准库都放在std(standard)的命名空间中,所以使用的时候要解析命名空间。
(3)有些编译器<iostream>会间接包含printf和scanf函数,也就是说不包含<stdio.h>头文件也可以使用这两函数。
#include <iostream>using namespace std;int main()
{int age;char name[10];cin >> age >> name;// 这里没有包含<stdio.h>printf也可以正常使用printf("age:%d\tname:%s\n", age, name);cout << age << endl;cout << name << endl;return 0;
}
三:缺省参数
定义:在定义函数的时候给予参数一个默认的缺省值。
(1)半缺省,全缺省。
半缺省:部分形参给予默认值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
全缺省:全部形参给予默认值。
(2)带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
(3)含缺省参数的函数调用的时候,没有传参使用默认值,传参使用传递值。
#include <iostream>// 半缺省
int Add1(int b, int c, int a = 0)
{return a + b + c;
}// 全缺省
int Add2(int a = 0, int b = 0)
{return a + b;
}using namespace std;int main()
{int n1 = 2;int n2 = 3;cout << Add1(n1,n2) << endl;// 全缺省的cout << Add2() << endl;return 0;
}
(4)函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
我们将.c文件的两个函数声明放到,h文件.c文件依然给缺省值

编译器报错:

所以应该将.c文件中的缺省参数去掉
四:内联函数:inline
使用inline关键字修饰的函数被调用时会在调用处将函数定义展开
(1)加上inline的函数,如果函数代码较多或者是递归,编译器会忽视不展开代码。
(2)使用inline的本质是替换函数调用,提高程序执行的效率(因为函数调用需要建立函数栈帧,开辟空间等消耗),可以平替C语言的宏。
(3)inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错
使用inline,直接在函数的前面加个inline就可以了。
inline int add(int a, int b)
{return a + b;
}
五:函数重载
函数重载:即同名函数,提现了类的多态行为。
满足函数重载的条件:
1.函数的形参不同
2.函数的参数个数不同
3.形参的类型不同
4.形参类型顺序不同
// 函数的形参不同以及形参个数不同
int add(int a, int b,int c = 1)
{return a + b;
}
double add(double a, double b, int c = 1)
{return a + b + c;
}// 形参不同和形参类型顺序不同
void func(char c, int n)
{cout << c << " " << n << endl;printf("形参不同\n");}void func(int n, char c)
{cout << c << " " << n << endl;printf("形参类型顺序不同\n");
}int main()
{// 名字一样调用的是两个函数func('a', 4);func(4, 'a');cout << add(1, 2) << endl;cout << add(1.0, 2.0, 3) << endl;return 0;
}

但是返回值不同不可以

六:引用
(一)引用的定义和特性
(1)引用就是给一个对象起别名,不开辟内存空间。
其基本格式为:类型& 引⽤别名 = 引⽤对象; (这里的&不是取地址)
#include <iostream>
using namespace std;int main()
{int a = 0;int c = 5;int& ra = a;int& rc = c;// 对引用进行++ra++;rc++;cout << "ra++后a:" << a << endl;cout << "rc++后c:" << c << endl;cout << "ra的地址为:" << &ra << endl;cout << "a的地址为:" << &a << endl;cout << "rc的地址为:" << &rc << endl;cout << "c的地址为:" << &c << endl;return 0;
}

(2)引用定义的时候必须要初始化:看吧。

(3)⼀个变量可以有多个引⽤:跟一个人有多个绰号差不多
#include <iostream>
using namespace std;int main()
{int a = 0;int c = 5;int& ra = a;int& rra = a;int& rc = c;return 0;
}
(4)引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体:
(5)引用可以引用引用;
int a = 0;int& ra = a;// 这样是可以的
int& rra = ra;
(二)引用的使用
(1)引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象
例如在函数传参的时候
void fun(int& x)
{x++;
}int main()
{int a = 0;fun(a);// 这里相当于将a取了一个别名,然后函数里面根据这个别名找到对应的对象进行运算cout << a << endl;return 0;
}
(三)const修饰引用
(1)const修饰引用可以使权限缩小,但是不能使权限放大,当然const修饰的应用对象是不能被修改的。
// 定义一个变量
const int a = 8;// 权限放大,不允许,会报错的
int& ra = a;// 权限平替,这样可以
const int& ra = a;int b = 0;
// 权限缩小
int& rb = b;
// 不允许
rb++;
// 允许
b++;// 权限缩小只是缩小引用的权限缩小,而不会影响引用的对象的权限。
(2)引用可以引用临时对象:
临时对象:在程序运行中产生的用于转换的值或者其他对象,例如:类型转换,函数传参(函数传参是临时拷贝,传地址就不会产生临时对象)。这期间就会产生临时对象。
临时对象具有常性:
void fun(int& x)
{x++;
}void fun2(int x)
{int& rx = x;x++;cout << rx << endl; // 这输出3
}int main()
{int a = 0;fun(a);// 这里相当于将a取了一个别名,然后函数里面根据这个别名找到对应的对象进行运算cout << a << endl;const int n = 2;int rn = n;n++; // 这里不允许// 这里int向double转换的时候产生了临时变量,权限被放大了。const double& rm = n * 3;// n是const修饰的变量,传递给函数,传递的是它的一份临时拷贝fun2(n);cout << rm << endl; // 这里输出6return 0;
}
(四)指针和引用的区别
(1)指针需要开辟空间,指针变量存储的是空间的地址。引用不需要开空间,他是所引用对象的另一个别名。

(2)引用定义的时候就必须要初始化,指针可以不用
int& r;// 指针不初始化没问题,编译器不会初始化,但是这样就成了野指针,不建议这样搞
int* ptr;
(3)指针容易出现空指针和野指针,引用不容易出现空引用,引用比指针更安全。
空引用:
(4)引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
(5)引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
int main()
{int a = 0;int& b = a;int d = 5;b = d;int* p = &a;cout << p << endl;p = &d;cout << p << endl;cout << "a和b的地址" << endl;cout << &a << endl;cout << &b << endl;return 0;
}
(6)sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
七:nullptr和NULL的区别
NULL在C++中被定义为了宏0,容易导致和整型的0混淆使用,而nullptr不会出现这种情况,C语言支持NULL不支持nullptr。C++都支持。
int main()
{// 这里明着给int类型的a赋值指针但是没报错int a = NULL;printf("%d", a);return 0;
}

相关文章:
C到C++入门基础知识
一:命名空间:namespace (一):命名空间的定义 注:命名空间只能定义在全局,不能定义在函数内部。 (1)类似于C语言的结构体,C语言的命名空间定义为࿱…...
Aigtek功率放大器的主要参数有什么
功率放大器是一种电子设备,通常用于放大输入信号的功率。为了评估和描述功率放大器的性能,有一些主要参数需要了解。下面将介绍一些常见的功率放大器参数。 增益:功率放大器的增益是指输出功率与输入功率之间的比值。它表示了信号经过放大器后…...
运维工程师概述及职责
运维工程师 运维运维工程师(Operations Engineer 或 System Administrator)是负责确保计算机系统、服务器、网络、存储设备等基础设施稳定运行的专业人员。 运维工程师在IT行业中扮演着至关重要的角色,是连接开发团队和业务团队的桥梁&#…...
Android系统dumpsys命令详解
文章目录 1. dumpsys 的工作原理2. 基本使用方法执行 dumpsys限制 dumpsys 的输出 3. 常见的 dumpsys 服务1. Activity Manager (activity)2. Battery Service (battery)3. Window Manager (window)4. Package Manager (package)5. Power Manager (power)6. Media DRM (media.d…...
[Unity Demo]从零开始制作空洞骑士Hollow Knight第二集:通过InControl插件实现绑定玩家输入以及制作小骑士移动空闲动画
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、通过InControl插件实现绑定玩家输入二、制作小骑士移动和空闲动画 1.制作动画2.玩家移动和翻转图像3.状态机思想实现动画切换总结 前言 好久没来CSDN看看&…...
基于鸿蒙API10的RTSP播放器(七:亮度调节功能测试)
目标: 当我的手指在设备左方进行上下移动的时候,可以进行屏幕亮度的调节,在调节的同时,有实时的调节进度条显示 步骤: 界面逻辑:使用Stack() 组件,完成音量图标和进度条的组合显示,…...
基于SpringBoot+Vue的校内跑腿业务管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…...
嵌入式鸿蒙系统开发语言与开发方法分析
大家好,今天主要给大家分享一下,HarmonyOS系统的主力开发语言ArkTS语言开发方法,它是基于TypeScript(简称TS)语言扩展而来。 第一:ArkTS语言基本特性 目的:声明式UI,让开发者以更简洁,更自然的方式开发高性能应用。 声明式 UI基本特性: 基本UI描述:ArkTS定义了各种装饰…...
SpringBoot开发——整合Spring Data MongoDB
文章目录 一、MongoDB简介1、MongoDB是什么2、MongoDB 基本概念(1)文档(2)集合(3)数据库3、MongoDB的系统数据库4、MongoDB数据模型二、SpringBoot整合Spring Data MongoDB1、创建项目,添加Spring Data MongoDB依赖2、创建实体类Student3、创建StudentRepository接口4、创建…...
camouflaged object detection中的decoder最核心的作用
在 camouflaged object detection(COD)任务中,decoder 的确有一个核心作用是进行 上采样 以恢复图像的分辨率,但这并不是它唯一或最核心的作用。我们可以从更广泛的视角来看 decoder 的作用。 1. 上采样(Upsampling&a…...
Java volatile
Volatile 作用:保证变量的可见性,有序性(禁止指令重排序)。不保证原子性。 如何保证可见性的? 场景:每个 线程 下都有一块 工作内存。要使用变量需要从 主内存 中把 变量 读取出来,使用完成后写…...
一条sql是如何执行的详解
一条sql是如何执行的详解 1. SQL 解析(Parsing) 2. 查询重写(Query Rewrite) 3. 查询规划(Query Planning) 4. 查询执行(Query Execution) 5. 结果返回 示例:查询执…...
“先天项目经理圣体”丨超适合做项目经理的4种人
总有人在问,什么样的人适合做项目经理,当项目经理需要什么样的特质? 你别说,还真有那么一些人是“先天项目经理圣体”,天生就是吃项目经理这碗饭的。 沟通达人丨靠“嘴”走天下 我们知道项目经理大部分的时间都在进行…...
如何从object中抽取某几个值,然后转换成数组
可以使用Object.entries(), Array.prototype.filter()和Array.prototype.map()或者解构赋值的方式从对象中抽取某些值并转换为数组 示例 1:使用 Object.entries(), filter() 和 map() const obj {a: 1,b: 2,c: 3,d: 4 };const keysToExtract [a, c];const extr…...
数据结构(14)——哈希表(1)
欢迎来到博主的专栏:数据结构 博主ID:代码小豪 文章目录 哈希表的思想映射方法(哈希函数)除留余数法 哈希表insert闭散列负载因子扩容find和erase 哈希表的思想 在以往的线性表中,查找速度取决于线性表是否有序&#…...
K近邻算法_分类鸢尾花数据集
import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score1.数据预处理 iris load_iris() df pd.DataFrame(datairis.data, columnsiris.featur…...
nacos和eureka的区别详解
Nacos 和 Eureka 都是服务发现和注册中心的解决方案,但它们在功能、设计和使用场景上有所不同。以下是它们的详细区别: 1. 基本概念 Eureka:是由 Netflix 开发的服务发现工具。它主要用于 Java 微服务架构中的服务注册与发现。Eureka 通过 R…...
AI大模型包含哪些些技术?
Prompt Prompt提示是模型接收以生成响应或完成任务的初始文本输入。 我们给AI一组Prompt输入,用于指导模型生成响应以执行任务。这个输入可以是一个问题、一段描述、一组关键词,或任何其他形式的文本,用于引导模型产生特定内容的响应。 Tra…...
分布式技术概览
文章目录 分布式技术1. 分布式数据库(Distributed Databases)2. 分布式文件系统(Distributed File Systems)3. 分布式哈希表(Distributed Hash Tables, DHTs)4. 分布式缓存(Distributed Caching…...
动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习
动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG:迟交互模型colbert微调实践 bge-m3 1. 环境准备 pip install transformers pip install open-retrievals注意安装时是pip install open-retrievals,但调用时只…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

